Există deja un cod de kernel disponibil care poate gestiona potrivirea arbitrară a șirurilor, încă în contextul nucleului în timpul căii pachetului, de ce să nu-l reutilizați?
iptables nu merge nicăieri. Ce ar putea pot fi dispare într-o zi este API-ul kernelului moștenit pentru iptables, plecând numai iptables-nft în jur, încă capabil de a utiliza xtables module precum cel şir Meci modul. Folosind iptables-legacy sau iptables-nft de-a lungul nftables va avea același rezultat mai jos.
Este posibil să folosiți mărci pentru a transmite mesaje în jurul diferitelor subsisteme de rețea în calea pachetelor, inclusiv de la nftables la iptables și apoi înapoi de la iptables la nftables.
Acest Prioritate în cârlig tabelul poate ajuta:
nftables Familii |
Cârlige tipice |
nft Cuvânt cheie |
Valoare |
Prioritate internă Netfilter |
Descriere |
[...] |
|
|
|
|
|
inet, ip, ip6 |
toate |
calandru |
-150 |
NF_IP_PRI_MANGLE |
Operațiunea Mangle |
inet, ip, ip6 |
prerutare |
dstnat |
-100 |
NF_IP_PRI_NAT_DST |
Destinație NAT |
inet, ip, ip6, arp, netdev |
toate |
filtru |
0 |
NF_IP_PRI_FILTER |
Operație de filtrare, tabelul de filtrare |
[...] |
|
|
|
|
|
Trebuie doar să se înregistreze nftables de două ori pentru fiecare iptables' lanț încorporat să fie implicat: o dată cu o prioritate chiar înainte iptables', o dată cu prioritate imediat după iptables'. De exemplu cu un lanț de filtru/OUTPUT cu iptables prioritatea 0, se poate folosi -5 și 5 în jurul ei. Mai multe detalii în aceste Două Unix/Linux SE Q/A unde am dat răspunsuri.
Exemplu artificial (adaptat dintr-un exemplu din iptables-extensions(8)
) amestecare nftables și iptables, unde sistemul ar trebui să renunțe la solicitările DNS inițiate local pentru adresa DNS specifică www.netfilter.org, prezentat în ordinea priorității cârligului (avertisment: numai UDP, funcționează numai fără prezența oricărei opțiuni/anteturi IPv4 sau IPv6 în pachetul de ieșire din cauza intervalului fix, dar intervalul poate fi relaxat pentru a se adapta pentru aceasta):
nft adauga tabel inet mytable
nft add chain inet mytable outputbefore '{ tip filter hook priority output -5; acceptarea politicii; }'
nft add regula inet mytable outputbefore udp dport 53 meta mark set 1
iptables -I OUTPUT -m mark --mark 1 -m șir --algo bm --de la 40 --la 57 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
ip6tables -I OUTPUT -m mark --mark 1 -m string --algo bm --de la 60 --la 77 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
nft add chain inet mytable outputafter '{ tip filter hook priority output 5; acceptarea politicii; }'
nft adăugați regula inet mytable outputdupă meta mark 2 drop
Scopul aici este de a avea iptables mânuiți numai partea de care nu poate fi manipulată nftables și faceți doar munca minimă: emiteți o valoare de returnare printr-un semn, lăsând înapoi nftables responsabil de soarta pachetului:
- nftables setează marca pachetului la 1 la „întreaba” iptables pentru a efectua unele lucrări
- iptables (sau ip6tables) efectuează o potrivire de șir numai dacă „a primit” nota 1, pentru a preveni utilizarea procesorului și „răspunde” 2 dacă șirul s-a potrivit în acest caz
- nftables elimină pachetul numai dacă „a primit” un marcaj cu valoarea 2 (ștergând astfel fișierul iptables regulile dezactivează și efectul)
Note:
Avertisment
Mecanismul de comunicare între nftables și iptables este prin mărci de pachete (sau ar putea fi, de asemenea, prin contratrack connmarks). Deși este posibil să scrieți și să citiți din doar câțiva biți ai mărcii (prin folosirea măștii opționale de pe marcaj și operații adecvate pe biți), fiecare utilizator de mărci trebuie să respecte o convenție de alocare pentru proprietatea biților din marcă. Fără aceasta, uneltele vor interfera unele cu altele atunci când manipulează semnele. De exemplu firewalld folosește semne pentru gestionarea redirecționărilor în reguli, astfel încât acest exemplu ar putea să nu fie compatibil cu firewalld, chiar dacă folosește propriile tabele atunci când folosește nftables backend.
Unele cazuri ușoare pot fi folosite sarcini utile brute
Acest exemplu specific de mai sus, cu fix compensații, ar fi putut fi implementate cu nftables. Este atunci când există un offset arbitrar pentru a găsi datele (cel mai bine folosit cu iptables' şir potrivire) sau o metodă complexă de a calcula un astfel de offset (cel mai bine folosit cu iptables' u32 meci) că nftables nu poate fi folosit.
Iată echivalentul care înlocuiește toate regulile de mai sus cu o singură regulă folosind încărcături utile brute. Sintaxa permite doar 128 de biți, dar aici sunt necesari 19x8=152 de biți, așa că trebuie împărțit în două încărcături utile brute (128 de biți + 24 de biți). printf
, xxd
și a tăia
sunt de asemenea folosite pentru ajutor:
nft adauga tabel inet mytable
nft add chain inet mytable output '{ tip filter hook priority output 0; acceptarea politicii; }'
nft add inet mytable output udp dport 53 \
@th,160,128 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c-32) \
@th,288,24 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c33-) \
cădere brusca
Cu ieșirea de printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p
fiind:
03777777096e657466696c746572036f726700
pentru a obține cele două sarcini utile brute:
0x03777777096e657466696c746572036f
0x726700
alte metode sunt probabil disponibile
iptables poate apela un obiect eBPF (oricum doar nucleele recente permit buclelor (finite) să încerce să implementeze cu ușurință niște algoritmi), nftables lipsește această caracteristică. Deci este din nou cu un semn și iptables.
un astfel de obiect eBPF ar putea fi folosit cu XDP sau tc dar s-ar putea să fie prea devreme în calea pachetului (de exemplu: nu este disponibil un NAT cu stare) și necesită programare reală mai degrabă decât administrare. Oricum, este din nou comunicare printr-un marcaj dacă trebuie să se ocupe de decizii nftables.