De release van de nftables packet filter 1.0.7 is gepubliceerd, die de filtering interfaces voor IPv4, IPv6, ARP en netwerk bridges uniform maakt (gericht op de vervanging van iptables, ip6tables, arptables en ebtables). Het nftables-pakket bevat de packet filter componenten die in de gebruikersruimte werken, terwijl de nf_tables subsystem op kernel niveau de werking verzorgt, die in de Linux kernel aanwezig is sinds release 3.13. Op kernel niveau wordt slechts een algemene interface aangeboden, die niet van een specifiek protocol afhankelijk is en basisfunctionaliteiten biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van gegevensbewerkingen en het beheren van datastromen.
Directe filtratieregels en protocolspecifieke verwerkers worden in bytecode gecompileerd in de gebruikersruimte, waarna deze bytecode via de Netlink-interface in de kern wordt geladen en in de kern wordt uitgevoerd in een speciale een virtuele machine, die doet denken aan BPF (Berkeley Packet Filters). Deze aanpak maakt het mogelijk om de grootte van de filtering code die op kernniveau draait aanzienlijk te verkleinen en alle functies voor het parseren van regels en de logica voor de werking met protocollen naar de gebruikersruimte te verplaatsen.
Belangrijkste wijzigingen:
- Voor systemen met Linux kernel 6.2+ is ondersteuning toegevoegd voor het matchen van de protocollen vxlan, geneve, gre en gretap, wat het mogelijk maakt om eenvoudige expressies te gebruiken voor het controleren van headers in ingekapselde pakketten. Bijvoorbeeld, om te controleren IP-adressen in de header van een ingekapseld VxLAN-pakket, kunnen nu regels worden gebruikt (zonder dat een voorafgaande de-inkapseling van de VxLAN-header en het binden van de filter aan de interface vxlan0 nodig is): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- Ondersteuning voor automatische samenvoeging van resten na gedeeltelijke verwijdering van een set-element is geïmplementeerd, waardoor het mogelijk is om een element of een deel van een bereik te verwijderen uit een bestaand bereik (vroeger kon een bereik alleen als geheel worden verwijderd). Bijvoorbeeld, na het verwijderen van element 25 uit een set-lijst met bereiken 24-30 en 40-50, blijven in de lijst 24, 26-30 en 40-50 over. De correcties die nodig zijn voor de werking van de autosamenvoeging zullen worden aangeboden in correctieve releases van de stabiele kernelbranches 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- Het gebruik van contact en bereiken is toegestaan bij het mappen van netwerkadresvertaling (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat naar ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- Ondersteuning voor de expressie «last» is toegevoegd, waarmee de laatste gebruiksdatum van een regel of set-lijstitem kan worden achterhaald. Deze functie is ondersteund vanaf de Linux-kernel 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 laatst gebruikt 1s591ms timeout 1h verloopt 59m58s409ms, 172.67.69.19 . 443 laatst gebruikt 4s636ms timeout 1h verloopt 59m55s364ms, 142.250.201.72 . 443 laatst gebruikt 4s748ms timeout 1h verloopt 59m55s252ms, 172.67.70.134 . 443 laatst gebruikt 4s688ms timeout 1h verloopt 59m55s312ms, 35.241.9.150 . 443 laatst gebruikt 5s204ms timeout 1h verloopt 59m54s796ms, 138.201.122.174 . 443 laatst gebruikt 4s537ms timeout 1h verloopt 59m55s463ms, 34.160.144.191 . 443 laatst gebruikt 5s205ms timeout 1h verloopt 59m54s795ms, 130.211.23.194 . 443 laatst gebruikt 4s436ms timeout 1h verloopt 59m55s564ms } } }
- Er is een functie toegevoegd om quota's in set-lijsten te definiëren. Bijvoorbeeld, om een quotum voor verkeer voor elk doel-IP-adres te definiëren, kan het volgende worden opgegeven: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes gebruikt 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- Het gebruik van constanten in set-lijsten is toegestaan. Bijvoorbeeld, bij het gebruik van de bestemmingsadres en VLAN-identificatorkey kan het VLAN-nummer direct worden opgegeven (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- Een nieuwe opdracht «destroy» is toegevoegd voor het onvoorwaardelijk verwijderen van objecten (in tegenstelling tot de opdracht delete genereert deze geen ENOENT wanneer geprobeerd wordt een ontbrekend object te verwijderen). Tenminste Linux-kernel 6.3-rc is vereist voor gebruik. destroy table ip filter
Bron: opennet.ru
