Po roku rozwoju
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-65536Moż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