lansarea filtrului de pachete , dezvoltându-se ca o alternativă la iptables, ip6tables, arptables și ebtables prin unificarea interfețelor de filtrare a pachetelor pentru IPv4, IPv6, ARP și punți de rețea. Pachetul nftables include componente de filtrare a pachetelor care funcționează în spațiul utilizatorului, în timp ce la nivel de kernel, funcționarea este asigurată de subsistemul nf_tables, inclus în kernelul Linux începând cu versiunea 3.13. Modificările necesare pentru funcționarea versiunii nftables 0.9.5 sunt incluse în kernel. .
La nivel de kernel se oferă doar o interfață generală, independentă de protocolul specific și care oferă funcții de bază pentru extragerea datelor din pachete, efectuarea de operațiuni cu date și gestionarea fluxului. Reguli de filtrare direct și gestionarii specifici pentru protocoale sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în kernel cu ajutorul interfeței Netlink și executat în kernel într-o mașină virtuală specială, asemănătoare cu BPF (Berkeley Packet Filters). Această abordare permite reducerea semnificativă a dimensiunii codului de filtrare care rulează la nivel de kernel și externalizarea tuturor funcțiilor de analiză a regulilor și logicii de lucru cu protocoalele în spațiul utilizatorului.
Noutăți principale:
- Seturile au fost adăugate cu suport pentru contoarele de pachete și trafic asociate elementelor setului. Contoarele sunt activate folosind cuvântul cheie „counter”:
tabelă ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}lanț z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Pentru a seta valorile inițiale ale contoarelor, de exemplu, pentru a restaura contoarele anterioare după repornire, setul poate folosi comanda „nft -f”:
# cat ruleset.nft
tabelă ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}lanț z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
}
# nft -f ruleset.nft
# nft list ruleset
tabelă ip x {
set y {
typeof ip saddr
counter
elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
counter p 192.168.10.135 counter packets 0 bytes 0 }
}lanț z {
type filter hook output priority filter; policy accept;
ip daddr @y
}
} - Suportul pentru contoare a fost adăugat și în flowtable:
table ip foo {
flowtable bar {
hook ingress priority -100
devices = { eth0, eth1 }
counter
}chain forward {
type filter hook forward priority filter;
flow add @bar counter
}
}Pentru a vizualiza lista contoarelor, se poate folosi comanda „conntrack -L”:
tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2 - În seturile de conexiuni (concatenare, anumite legături de adrese și porturi care simplifică asocierea) este disponibilă utilizarea directivei „typeof”, care determină tipul de date al elementelor pentru componentele setului:
table ip foo {
set whitelist {
typeof ip saddr . tcp dport
elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr . tcp dport @whitelist accept
}
} - Directiva typeof este acum aplicabilă și pentru conexiuni din listele mapate:
table ip foo {
map addr2mark {
typeof ip saddr . tcp dport : meta mark
elements = { 192.168.10.35 . 80 : 0x00000001,
192.168.10.135 . 80 : 0x00000002 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
meta mark set ip daddr . tcp dport map @addr2mark accept
}
} - A fost adăugată suport pentru conexiuni cu intervale în seturi anonime (fără nume):
# nft add rule inet filter input ip daddr . tcp dport \
{ 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8 . 80-443 } accept - A fost oferită capacitatea de a respinge pachete cu flaguri 802.1q (VLAN) în procesarea punților de rețea:
# nft add rule bridge foo bar ether type vlan reject with tcp reset
- A fost adăugată suport pentru asocierea pe baza identificatorului sesiuni TCP (conntrack ID). Puteți utiliza opțiunea „—output id” pentru a determina conntrack ID:
# conntrack -L —output id
udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
[ASSURED] mark=0 use=1 id=2779986232# nft add rule foo bar ct id 2779986232 counter
Sursa: opennet.ro
