Avalikustatud nftables 1.0.0 versioon, mis ühtlustab pakettide filtreerimise liideseid IPv4, IPv6, ARP ja võrgu sildade jaoks (mille eesmärk on asendada iptables, ip6tables, arptables ja ebtables). Nfables 1.0.0 väljaande jaoks vajalikud muudatused on lisatud Linuxi tuuma versiooni 5.13. Versiooni numbrit on oluliselt muudetud, kuid see ei tähenda fundamentaalseid muutusi; see on lihtsalt järjepideva kümnendkümnenduse jätk (eelmise versiooni number oli 0.9.9).
Nftables'i paketis on kasutusruumi paketifiltreerimise komponendid, samas kui tuuma tasemel tagab töö nf_tables alamsüsteem, mis on Linuxi tuumas saadaval alates versioonist 3.13. Tuuma tasemel on olemas vaid üldine liides, mis ei sõltu konkreetsetest protokollidest ja pakub põhiülesandeid paketidest andmete ekstraheerimiseks, andmete töötlemiseks ja voogude haldamiseks.
Filtreerimisreeglid ja protokollispetsiifilised töötlejad kompileeritakse kasutusruumis byte-koodiks, seejärel laaditakse see byte-kood tuuma Netlinki liidese abil ja käivitatakse tuumas eraldi virtuaalmasinas, mis tahes BPF (Berkeley Packet Filters). Sarnane lähenemine võimaldab oluliselt vähendada filterkoodi suurust, mis töötab tuuma tasemel, ning viia kõik reeglite parsing'u funktsioonid ja protokollide töötlemise loogika kasutajaruumi.
Põhilised uuendused:
- Set-loendisse on lisatud elemendi-maski "*" toetus, mis aktiveerub kõigi pakettide jaoks, mis ei lange kokku muude koosoleku määratud elementidega. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Selle võimaluse abil on antud võimalus määrata muutujaid käsurealt valiku "—define" kaudu. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev=»{ eth0, eth1 }» -f test.nft
- Map-listides on lubatud kasutada püsivaid (stateful) väljendeid: table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; policy accept; iif vmap { «lo» : jump wan_input } } }
- Lisatud käsk «list hooks» antud paketifamiilia käsitlejate nimekiri väljastamiseks: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- Blokis "queue" on lubatud kombineerida jhash, symhash ja numgen väljendeid, et jagada pakette queue'des kasutajaruumi. ... queue to symhash mod 65536 ... queue flags bypass to numgen inc mod 65536 ... queue to jhash oif . meta mark mod 32 "queue" saab ka kombineerida kaardilistadega, et valida queue kasutajaruumi põhjal suvaliste võtmete järgi. ... queue flags bypass to oifname map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
- On antud võimalus jagada muutujaid, mis sisaldavad set-listi, mitmeks kaardiks. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { "lo" : accept, "eth0" : drop, "eth1" : drop } } }
- Lubatud on vmap-ide (verdict map) kombineerimine vahemikega: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- NAT-i vastavuste süntaks on lihtsustatud. Lubatud on aadresside vahemike määramine: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } või otseste IP-aadresse ja ja ja ip aaddress map { 10.141.11.4 : 192.168.2.3 . 80 } või kombinatsioon ip aadresside ja portide vahemikest: ... dnat to ip aaddress . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Allikas: opennet.ru
