Filtr pakietów nftables w wersji 0.9.1

Po roku rozwoju przedstawione zwolnienie filtra pakietów nftables 0.9.1, rozwijający się jako zamiennik iptables, ip6table, arptables i ebtables poprzez ujednolicenie interfejsów filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych. Pakiet nftables zawiera komponenty filtru pakietów w przestrzeni użytkownika, natomiast pracę na poziomie jądra zapewnia podsystem nf_tables, który jest częścią jądra Linuksa od wersji 3.13.

Poziom jądra zapewnia jedynie ogólny, niezależny od protokołu interfejs, który zapewnia podstawowe funkcje wyodrębniania danych z pakietów, wykonywania operacji na danych i kontroli przepływu.
Sama logika filtrowania i procedury obsługi specyficzne dla protokołu są kompilowane do kodu bajtowego w przestrzeni użytkownika, po czym ten kod bajtowy jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany na specjalnej maszynie wirtualnej przypominającej BPF (Berkeley Packet Filters). Takie podejście pozwala znacznie zmniejszyć rozmiar kodu filtrującego działającego na poziomie jądra i przenieść wszystkie funkcje reguł analizowania i logiki pracy z protokołami do przestrzeni użytkownika.

Główne innowacje:

  • Obsługa protokołu IPsec, umożliwiająca dopasowanie adresu tunelu na podstawie pakietu, identyfikatora żądania IPsec i znacznika SPI (indeks parametrów bezpieczeństwa). Na przykład,

    ... ipsec w IP saddr 192.168.1.0/24
    ... ipsec w spi 1-65536

    Możliwe jest również sprawdzenie, czy trasa przechodzi przez tunel IPsec. Na przykład, aby zablokować ruch inny niż IPSec:

    … brakujący spadek wyjścia filtra rt ipsec

  • Obsługa protokołu IGMP (protokół zarządzania grupą internetową). Można na przykład użyć reguły do ​​odrzucania przychodzących próśb o członkostwo w grupach IGMP

    nft dodaj regułę netdev foo bar igmp typ członkostwa-spadek licznika zapytań

  • Możliwość wykorzystania zmiennych do definiowania łańcuchów przejść (skok/goto). Na przykład:

    zdefiniuj dest = ber
    dodaj regułę ip foo bar jump $dest

  • Obsługa masek identyfikujących systemy operacyjne (OS Fingerprint) na podstawie wartości TTL w nagłówku. Na przykład, aby oznaczyć pakiety na podstawie systemu operacyjnego nadawcy, możesz użyć polecenia:

    ... meta mark set osf ttl pomiń mapę nazw { "Linux": 0x1,
    „Okna”: 0x2,
    „MacOS”: 0x3,
    „nieznany” : 0x0 }
    ... osf ttl pomiń wersję „Linux:4.20”

  • Możliwość dopasowania adresu ARP nadawcy i adresu IPv4 systemu docelowego. Przykładowo, aby zwiększyć licznik pakietów ARP wysyłanych z adresu 192.168.2.1 można zastosować regułę:

    tabela arp x {
    łańcuch y {
    typ filtra hak wejściowy filtr priorytetowy; polityka akceptuje;
    arp saddr ip 192.168.2.1 licznik pakietów 1 bajt 46
    }
    }

  • Wsparcie dla przejrzystego przekazywania żądań poprzez proxy (tproxy). Na przykład, aby przekierować połączenia z portu 80 na port proxy 8080:

    IP tabeli x {
    łańcuch y {
    typ zaczepu filtra priorytet wstępnego routingu -150; polityka akceptuje;
    TCP dport 80 tproxy do: 8080
    }
    }

  • Obsługa zaznaczania gniazd z możliwością dalszego uzyskania ustawionego znaku poprzez setsockopt() w trybie SO_MARK. Na przykład:

    tabela inet x {
    łańcuch y {
    typ zaczepu filtra priorytet wstępnego routingu -150; polityka akceptuje;
    TCP dport 8080 Mark Ustaw znacznik gniazda
    }
    }

  • Obsługa określania priorytetowych nazw tekstowych dla łańcuchów. Na przykład:

    nft add chain ip x raw { typ zaczepu filtra priorytet wstępnego routingu surowy; }
    nft dodaj łańcuch ip x filter { typ filtra hak filtr priorytetowy wstępnego routingu; }
    nft dodaj łańcuch ip x filter_later { wpisz zaczep filtra filtr priorytetowy wstępnego routingu + 10; }

  • Obsługa tagów SELinux (Secmark). Na przykład, aby zdefiniować tag „sshtag” w kontekście SELinux, możesz uruchomić:

    nft dodaj secmark filtr inet sshtag „system_u:object_r:ssh_server_packet_t:s0”

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

    nft dodaj regułę filtr inet wejście tcp dport 22 meta secmark zestaw „sshtag”

    nft dodaj mapę filtr inet secmapping { wpisz inet_service : secmark; }
    nft dodaj element filtr inet secmapping { 22 : "sshtag" }
    nft dodaj regułę filtr inet wejście meta secmark ustaw tcp dport mapa @secmapping

  • Możliwość określenia portów przypisanych do protokołów w formie tekstowej, tak jak są one zdefiniowane w pliku /etc/services. Na przykład:

    nft dodaj regułę xy tcp dport „ssh”
    zestaw reguł listy nft -l
    stół x {
    łańcuch y {
    ...
    port TCP „ssh”
    }
    }

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

    dodaj regułę inet surowy meta iifkind „vrf” zaakceptuj

  • Ulepszona obsługa dynamicznego aktualizowania zawartości zestawów poprzez jawne określenie flagi „dynamic”. Na przykład, aby zaktualizować zestaw „s” w celu dodania adresu źródłowego i zresetowania wpisu, jeśli przez 30 sekund nie będzie żadnych pakietów:

    dodaj tabelę x
    dodaj zestaw xs { wpisz ipv4_addr; rozmiar 128; przekroczenie limitu czasu 30 s; flagi dynamiczne; }
    dodaj łańcuch xy { typ zaczepu filtra priorytet wejścia 0; }
    dodaj regułę xy update @s { ip saddr }

  • Możliwość ustawienia osobnego warunku przekroczenia limitu czasu. Na przykład, aby zastąpić domyślny limit czasu dla pakietów przychodzących na port 8888, możesz określić:

    filtr IP tabeli {
    ct timeout agresywny-tcp {
    protokół TCP;
    l3proto ip;
    polityka = {ustalona: 100, zamknij_wait: 4, zamknij: 4}
    }
    wyjście łańcuchowe {
    ...
    tcp dport 8888 ct ustawiony limit czasu „agresywny-tcp”
    }
    }

  • Obsługa NAT dla rodziny inet:

    tabela inet nat {
    ...
    ip6 tatadr martwy::2::1 dnat martwy:2::99
    }

  • Ulepszone raportowanie błędów literowych:

    nft dodaj test filtra łańcucha

    Błąd: Nie ma takiego pliku ani katalogu; czy miałeś na myśli tabelę „filter” w rodzinnym adresie IP?
    dodaj test filtra łańcucha
    ^^^^^^

  • Możliwość określenia nazw interfejsów w zestawach:

    ustaw sc {
    wpisz inet_service. jeśli nazwa
    elementy = { "ssh" . "eth0" }
    }

  • Zaktualizowana składnia reguł przepływu:

    nft dodaj tabelę x
    nft dodaj przepływność x ft { priorytet wejścia haka 0; urządzenia = { eth0, wlan0 }; }
    ...
    nft dodaj regułę x forward ip protokół { tcp, udp } przepływ dodaj @ft

  • Ulepszona obsługa JSON.

Źródło: opennet.ru

Dodaj komentarz