Wydanie filtrów pakietów nftables 0.9.1

Po roku prac rozwojowych zaprezentowano wydanie pakietowego filtra nftables 0.9.1, rozwijającego się jako alternatywa dla iptables, ip6tables, arptables i ebtables poprzez unifikację interfejsów filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych. W pakiecie nftables znajdują się komponenty filtru pakietów działające w przestrzeni użytkownika, podczas gdy na poziomie jądra pracuje podsystem nf_tables, wchodzący w skład jądra Linux od wersji 3.13.

Na poziomie jądra udostępniany jest jedynie wspólny interfejs, niezależny od konkretnego protokołu, który zapewnia podstawowe funkcje wydobywania danych z pakietów, wykonywania operacji na danych i zarządzania przepływem.
Logika filtrowania i specyficzne dla protokołów przetwarzacze są kompilowane do bajtkodu w przestrzeni użytkownika, po czym ten bajtkod jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w specjalnej wirtualnej maszynie, przypominającej BPF (Berkeley Packet Filters). Takie podejście pozwala znacznie zmniejszyć rozmiar kodu filtrowania działającego na poziomie jądra i przenieść wszystkie funkcje analizy reguł i logiki pracy z protokołami do przestrzeni użytkownika.

Główne nowości:

  • Wsparcie IPsec, umożliwiające mapowanie adresów tuneli w powiązaniu z pakietem, identyfikatorem żądania IPsec i tagiem SPI (Security Parameter Index). Na przykład,

    … ipsec in ip saddr 192.168.1.0/24
    … ipsec in spi 1-65536

    Możliwe jest również sprawdzenie przejścia trasy przez tunel IPsec. Na przykład, aby zablokować ruch nieprzechodzący przez IPSec:

    … filter output rt ipsec missing drop

  • Wsparcie protokołu IGMP (Internet Group Management Protocol). Na przykład, aby odrzucić przychodzące zapytania IGMP o przynależność do grupy, można użyć reguły

    nft add rule netdev foo bar igmp type membership-query counter drop

  • Możliwość użycia zmiennych do określenia łańcuchów przejścia (jump / goto). Na przykład:

    define dest = ber
    add rule ip foo bar jump $dest

  • Wsparcie masek do identyfikacji systemów operacyjnych (OS Fingerprint) na podstawie wartości TTL w nagłówku. Na przykład, aby oznaczyć pakiety w zależności od systemu operacyjnego nadawcy, można użyć komendy:

    … meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows" : 0x2,
    "MacOS" : 0x3,
    "unknown" : 0x0 }
    … osf ttl skip version "Linux:4.20"

  • Możliwość mapowania adresu ARP nadawcy i adresu IPv4 systemu docelowego. Na przykład, aby zwiększyć licznik pakietów ARP wysyłanych z adresu 192.168.2.1, można użyć reguły:

    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
    }
    }

  • Wsparcie dla przezroczystego przekazywania żądań przez proxy (tproxy). Na przykład, aby przekierować żądania na port 80 do portu proxy 8080:

    table ip x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 80 tproxy to :8080
    }
    }

  • Wsparcie dla znakowania gniazd z możliwością późniejszego uzyskania ustawionego znacznika przez setsockopt() w trybie SO_MARK. Na przykład:

    table inet x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 8080 mark set socket mark
    }
    }

  • Wsparcie dla wskazywania tekstowych nazw priorytetów dla łańcuchów. Na przykład:

    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; }

  • Wsparcie dla etykiet SELinux (Secmark). Na przykład, aby zdefiniować etykietę „sshtag” w powiązaniu z kontekstem SELinux, możesz uruchomić:

    nft add secmark inet filter sshtag „system_u:object_r:ssh_server_packet_t:s0”

    A następnie użyć tej etykiety w regułach:

    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

  • Możliwość wskazywania dostosowanych portów protokołów w formie tekstowej, jak określono w pliku /etc/services. Na przykład:

    nft add rule x y tcp dport „ssh”
    nft list ruleset -l
    table x {
    chain y {

    tcp dport „ssh”
    }
    }

  • Możliwość sprawdzenia typu interfejsu sieciowego. Na przykład:

    add rule inet raw prerouting meta iifkind „vrf” accept

  • Udoskonalone wsparcie dla dynamicznej aktualizacji zawartości zbiorów (sets) przez wyraźne wskazanie flagi „dynamic”. Na przykład, aby zaktualizować zbiór „s” poprzez dodanie adresu źródłowego i zresetowanie wpisu w przypadku braku pakietów przez 30 sekund:

    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 }

  • Możliwość ustawienia osobnego warunku dla wystąpienia timeoutu. Na przykład, aby nadpisać timeout domyślny dla pakietów przychodzących na port 8888 można podać:

    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”
    }
    }

  • Wsparcie dla NAT w rodzinie inet:

    table inet nat {

    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Udoskonalone narzędzia do wyświetlania informacji o błędach spowodowanych literówkami:

    nft add chain filtre test

    Błąd: Brak takiego pliku lub katalogu; czy miałeś na myśli tabelę „filter” w rodzinie ip?
    add chain filtre test
    ^^^^^^

  • Możliwość wskazywania nazw interfejsów w zbiorach (sets):

    set sc {
    type inet_service . ifname
    elements = { „ssh” . „eth0” }
    }

  • Uaktualniona składnia reguł flowtable:

    nft add table x
    nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }

    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Ulepszona obsługa JSON.

Ź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