Na een jaar van ontwikkeling pakketfilterrelease , dat zich ontwikkelt als vervanging voor iptables, ip6tables, arptables en ebtables door middel van het unificeren van de interface voor pakketfiltering voor IPv4, IPv6, ARP en netwerkschakels. Het nftables-pakket omvat componenten van de pakketfilter die in de gebruikersruimte werken, terwijl op kernel-niveau de nf_tables-subsystem die deel uitmaakt van de Linux-kernel sinds release 3.13 de functionaliteit biedt.
Op kernelniveau wordt enkel een algemene interface aangeboden, onafhankelijk van het specifieke protocol, die basisfunctionaliteiten biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van datamanipulaties en het beheren van stromen.
De filteringlogica en protocol-specifieke verwerkers worden gecompileerd naar bytecode in de gebruikersruimte, waarna deze bytecode via de Netlink-interface in de kernel wordt geladen en wordt uitgevoerd in een speciale virtuele machine, vergelijkbaar met BPF (Berkeley Packet Filters). Deze benadering maakt het mogelijk de hoeveelheid filteringcode die op kernelniveau draait aanzienlijk te verkleinen en alle functies voor regelparsing en protocollogica naar de gebruikersruimte te verplaatsen.
Belangrijkste vernieuwingen:
- Ondersteuning voor IPsec, waardoor er adresmatching van tunnels kan plaatsvinden op basis van pakketten, IPsec-verzoekidentificatie en SPI-tag (Security Parameter Index). Bijvoorbeeld,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Ook is het mogelijk om de route door de IPsec-tunnel te controleren. Bijvoorbeeld, om verkeer dat niet via IPSec gaat te blokkeren:
… filter output rt ipsec missing drop
- Ondersteuning voor het IGMP-protocol (Internet Group Management Protocol). Bijvoorbeeld, om binnenkomende IGMP-lidmaatschapsverzoeken weg te gooien, kan de regel worden gebruikt:
nft add rule netdev foo bar igmp type membership-query counter drop
- Mogelijkheid om variabelen te gebruiken voor het bepalen van overgangketens (jump / goto). Bijvoorbeeld:
define dest = ber
add rule ip foo bar jump $dest - Ondersteuning voor maskers voor het identificeren van besturingssystemen (OS Fingerprint) op basis van TTL-waarden in de header. Bijvoorbeeld, om pakketten te markeren afhankelijk van het besturingssysteem van de verzender, kan het volgende commando worden gebruikt:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Mogelijkheid om het ARP-adres van de verzender en het IPv4-adres van het doelsysteem overeen te brengen. Bijvoorbeeld, om de ARP-pakketten die zijn verzonden vanaf het adres 192.168.2.1 te tellen, kan de regel worden gebruikt:
table arp x {
chain y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Ondersteuning voor transparante doorlating van verzoeken via een proxy (tproxy). Bijvoorbeeld, voor het omleiden van aanvragen naar poort 80 naar de proxypoort 8080:
table ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Ondersteuning voor het markeren van sockets met de mogelijkheid om de ingestelde markering later op te halen via setsockopt() in de SO_MARK-modus. Bijvoorbeeld:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Ondersteuning voor het opgeven van tekstuele namen voor prioriteiten bij ketens. Bijvoorbeeld:
nft add chain ip x raw { type filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; } - Ondersteuning voor SELinux-labels (Secmark). Bijvoorbeeld, om het label "sshtag" te definiëren in de binding aan de SELinux-context kan het volgende worden uitgevoerd:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
En gebruik vervolgens deze markering in de regels:
nft add rule inet filter input tcp dport 22 meta secmark set "sshtag"
nft add map inet filter secmapping { type inet_service : secmark; }
nft add element inet filter secmapping { 22 : "sshtag" }
nft add rule inet filter input meta secmark set tcp dport map @secmapping - Mogelijkheid om protocollen aan ports toe te wijzen in tekstvorm, zoals gedefinieerd in het bestand /etc/services. Bijvoorbeeld:
nft add rule x y tcp dport "ssh"
nft list ruleset -l
table x {
chain y {
…
tcp dport "ssh"
}
} - Mogelijkheid om het type netwerkinterface te controleren. Bijvoorbeeld:
add rule inet raw prerouting meta iifkind "vrf" accept
- Verbeterde ondersteuning voor dynamische updates van sets via een expliciete opgave van de "dynamic" vlag. Bijvoorbeeld, voor het bijwerken van de set "s" door het toevoegen van een source address en het resetten van de entry als er gedurende 30 seconden geen pakketten zijn:
add table x
add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
add chain x y { type filter hook input priority 0; }
add rule x y update @s { ip saddr } - Mogelijkheid om een aparte voorwaarde voor een timeout in te stellen. Bijvoorbeeld, om de standaard timeout voor pakketten die op poort 8888 binnenkomen te overschrijven kan het volgende worden opgegeven:
table ip filter {
ct timeout agressive-tcp {
protocol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
chain output {
…
tcp dport 8888 ct timeout set "agressive-tcp"
}
} - Ondersteuning voor NAT voor families inet:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Verbeterde hulpmiddelen voor het rapporteren van fouten door spelfouten:
nft add chain filtre test
Error: No such file or directory; did you mean table "filter" in family ip?
add chain filtre test
^^^^^^ - Mogelijkheid om interface namen op te geven in sets:
set sc {
type inet_service . ifname
elements = { "ssh" . "eth0" }
} - Geüpdatete syntax voor flowtable regels:
nft add table x
nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
…
nft voeg regel x door ip protocol { tcp, udp } flow toe @ft - Verbeterde ondersteuning voor JSON.
Bron: opennet.ru
