Wydanie filtra pakietów nftables 1.0.0

Opublikowano wersję filtra pakietów nftables 1.0.0, ujednolicającą interfejsy filtrowania pakietów dla IPv4, IPv6, ARP oraz mostów sieciowych (ma na celu zastąpienie iptables, ip6tables, arptables oraz ebtables). Zmiany niezbędne do działania wersji nftables 1.0.0 zostały włączone do jądra Linux w wersji 5.13. Zmiana numeru wersji jest znacząca, lecz nie wiąże się z istotnymi zmianami, a jedynie jest wynikiem kontynuacji numeracji w systemie dziesiętnym (poprzednia wersja to 0.9.9).

W pakiecie nftables zawarte są komponenty filtrów pakietowych, które działają w przestrzeni użytkownika, podczas gdy na poziomie jądra działania szczególną rolę pełni subsystem nf_tables, wchodzący w skład jądra Linux od wersji 3.13. Na poziomie jądra udostępniany jest tylko ogólny interfejs, niezależny od konkretnego protokołu, który zapewnia podstawowe funkcje wydobywania danych z pakietów, realizacji operacji na danych oraz zarządzania przepływem.

Bezpośrednio zasady filtracji i specyficzne dla protokołów komponenty są kompilowane do bajtowego kodu w przestrzeni użytkownika, po czym ten kod bajtowy jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w jądrze w specjalnej maszynie wirtualnej, przypominającej BPF (Berkeley Packet Filters). Tego typu podejście pozwala znacznie zmniejszyć rozmiar kodu filtracji działającego na poziomie jądra i przenieść wszystkie funkcje parsowania zasad i logiki pracy z protokołami do przestrzeni użytkownika.

Główne nowości:

  • W listach set dodano wsparcie dla elementu-maski „*”, uruchamiającego się dla wszystkich pakietów, które nie pasują do innych elementów określonych w zbiorze. 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 } }
  • Dodano możliwość definiowania zmiennych z linii poleceń przy użyciu opcji „—define”. # 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
  • W mapach dozwolone jest stosowanie wyrażeń stanowych (stateful): 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 } } }
  • Dodano polecenie „list hooks” do wyświetlania listy obsługiwanych dla danego rodziny pakietów: # 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 } }
  • W blokach „queue” dozwolone jest łączenie wyrażeń jhash, symhash i numgen w celu rozdzielania pakietów w przestrzeni użytkownika. … kolejka do symhash mod 65536 … flagi kolejki omijają do numgen inc mod 65536 … kolejka do jhash oif . meta mark mod 32 „queue” można również łączyć z listami map, aby wybierać kolejkę w przestrzeni użytkownika na podstawie dowolnych kluczy. … flagi kolejki omijają do oifname mapa {„eth0”: 0, „ppp0”: 2, „eth1”: 2 }
  • Umożliwiono rozwijanie zmiennych, które obejmują listę set, w kilka map. 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 } } }
  • Dozwolone jest łączenie vmapów (mapy wyniku) z zakresami: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
  • Uproszczono składnię mapowań dla NAT. Umożliwiono określenie zakresów adresów: … snat do ip saddr mapa { 10.141.11.4 : 192.168.2.2-192.168.2.4 } lub jawnych adresów IP i portów: … dnat do ip saddr mapa { 10.141.11.4 : 192.168.2.3 . 80 } lub kombinacji zakresów IP i portów: … dnat do ip saddr . tcp dport mapa { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster