nftables pakketfilter release 1.0.0

De release van pakketfilter nftables 1.0.0 is gepubliceerd, waarmee pakketfilterinterfaces voor IPv4, IPv6, ARP en netwerkbridges zijn verenigd (gericht op het vervangen van iptables, ip6table, arptables en ebtables). De wijzigingen die nodig zijn om de nftables 1.0.0-release te laten werken, zijn opgenomen in de Linux 5.13-kernel. Een significante wijziging in het versienummer houdt geen verband met fundamentele wijzigingen, maar is slechts een gevolg van de consistente voortzetting van de nummering in decimale notatie (de vorige release was 0.9.9).

Het nftables-pakket bevat pakketfiltercomponenten die in de gebruikersruimte draaien, terwijl het werk op kernelniveau wordt geleverd door het nf_tables-subsysteem, dat sinds release 3.13 deel uitmaakt van de Linux-kernel. Het kernelniveau biedt alleen een generieke protocol-onafhankelijke interface die basisfuncties biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van gegevensbewerkingen en stroomcontrole.

De filterregels zelf en protocolspecifieke handlers worden gecompileerd in bytecode van de gebruikersruimte, waarna deze bytecode in de kernel wordt geladen met behulp van de Netlink-interface en in de kernel wordt uitgevoerd in een speciale virtuele machine die lijkt op BPF (Berkeley Packet Filters). Deze aanpak maakt het mogelijk om de grootte van de filtercode die op kernelniveau draait aanzienlijk te verkleinen en alle functies van parseerregels en de logica van het werken met protocollen naar de gebruikersruimte te verplaatsen.

Belangrijkste innovaties:

  • Ondersteuning voor het maskerelement “*” is toegevoegd aan setlijsten, dat wordt geactiveerd voor pakketten die niet onder andere elementen vallen die in de set zijn gedefinieerd. table x { map blocklist { type ipv4_addr: oordeelvlaggen intervalelementen = { 192.168.0.0/16: accept, 10.0.0.0/8: accept, *: drop } } chain y { type filter hook prerouting prioriteit 0; beleid accepteren; ip saddr vmap @bloklijst } }
  • Het is mogelijk om variabelen te definiëren vanaf de opdrachtregel met behulp van de optie “--define”. # cat test.nft tabel netdev x { chain y { type filter hook ingress devices = $dev prioriteit 0; beleidsdaling; } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • In kaartlijsten is het gebruik van constante (stateful) expressies toegestaan: table inet filter { map portmap { type inet_service: oordeel counter elements = { 22 counterpakketten 0 bytes 0: jump ssh_input, * counterpakketten 0 bytes 0: drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting prioriteit raw; beleid accepteren; iif vmap { "lo": spring wan_input } } }
  • Commando "list hooks" toegevoegd om een ​​lijst met handlers voor een gegeven pakketfamilie weer te geven: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Met wachtrijblokken kunnen jhash-, symhash- en numgen-expressies worden gecombineerd om pakketten naar wachtrijen in de gebruikersruimte te distribueren. … wachtrij voor symhash mod 65536 … wachtrijvlaggen omzeilen naar numgen inc mod 65536 … wachtrij voor jhash oif . meta mark mod 32 "queue" kan ook worden gecombineerd met kaartlijsten om een ​​wachtrij in de gebruikersruimte te selecteren op basis van willekeurige sleutels. ... wachtrijvlaggen omzeilen naar oifname map { "eth0": 0, "ppp0": 2, "eth1": 2 }
  • Het is mogelijk om variabelen die een setlist bevatten, uit te breiden naar verschillende kaarten. interfaces definiëren = { eth0, eth1 } tabel ip x { chain y { type filter hook invoerprioriteit 0; beleid accepteren; iifname vmap { lo: accept, $interfaces: drop } } } # nft -f x.nft # nft lijst regelset tabel ip x { chain y { type filter hook invoerprioriteit 0; beleid accepteren; iifname vmap { "lo": accepteren, "eth0": neerzetten, "eth1": neerzetten } } }
  • Het combineren van vmaps (oordeelkaart) met intervallen is toegestaan: # nft add rule xy tcp dport . ip saddr vmap {1025-65535. 192.168.10.2: accepteren }
  • Vereenvoudigde syntaxis voor NAT-toewijzingen. Toegestaan ​​om adresbereiken op te geven: ... snat naar ip saddr map { 10.141.11.4: 192.168.2.2-192.168.2.4 } of expliciete IP-adressen en poorten: ... dnat naar ip saddr map { 10.141.11.4: 192.168.2.3 . 80 } of combinaties van IP-bereiken en poorten: ... dnat to ip saddr . tcp dport-kaart { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999}

Bron: opennet.ru

Voeg een reactie