Filtr pakietów nftables w wersji 0.9.5

opublikowany zwolnienie filtra pakietów nftables 0.9.5, 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. Zmiany wymagane do działania wersji nftables 0.9.5 są zawarte w jądrze Linux 5.7.

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. Reguły 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 w jądrze 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:

  • Do zestawów dodano obsługę liczników pakietów i ruchu powiązanych z elementami zestawu. Liczniki włącza się za pomocą słowa kluczowego „counter”:

    IP tabeli x {
    ustaw y {
    typ ip saddr
    licznik
    elementy = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    łańcuch z {
    typ filtra hak wyjściowy filtr priorytetowy; polityka akceptuje;
    ip tata @y
    }
    }

  • Aby ustawić początkowe wartości liczników, na przykład w celu przywrócenia poprzednich liczników po ponownym uruchomieniu, możesz użyć polecenia „nft -f”:

    # zestaw reguł kota.nft
    IP tabeli x {
    ustaw y {
    typ ip saddr
    licznik
    elementy = { 192.168.10.35 pakiety liczników 1 bajt 84, 192.168.10.101 \
    licznik p 192.168.10.135 licznik pakietów 0 bajtów 0 }
    }

    łańcuch z {
    typ filtra hak wyjściowy filtr priorytetowy; polityka akceptuje;
    ip tata @y
    }
    }
    # nft -f zestaw reguł.nft
    Zestaw reguł listy #nft
    IP tabeli x {
    ustaw y {
    typ ip saddr
    licznik
    elementy = { 192.168.10.35 pakiety liczników 1 bajt 84, 192.168.10.101 \
    licznik p 192.168.10.135 licznik pakietów 0 bajtów 0 }
    }

    łańcuch z {
    typ filtra hak wyjściowy filtr priorytetowy; polityka akceptuje;
    ip tata @y
    }
    }

  • Do flowtable dodano także obsługę liczników:

    tabela ip foo {
    płynny pasek {
    priorytet wejścia haka -100
    urządzenia = { eth0, eth1 }
    licznik
    }

    łańcuch do przodu {
    typ zaczep filtra filtr priorytetu do przodu;
    przepływ dodaj licznik @bar
    }
    }

    Listę liczników możesz wyświetlić za pomocą polecenia „conntrack -L”:

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 pakietów=9 bajtów=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 pakietów=8 bajtów=428 [OFFLOAD] mark=0 \
    secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    pakiety=1005763 bajty=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    pakiety=967505 bajtów=50310268 [OFFLOAD] mark=0 secctx=null use=2

  • W zestawach do konkatenacji (konkatenacji, określonych wiązek adresów i portów ułatwiających porównanie) można zastosować dyrektywę „typeof”, która określa typ danych elementów dla części składowych elementów zestawu:

    tabela ip foo {
    ustaw białą listę {
    typ ip saddr. port TCP
    elementy = { 192.168.10.35 . 80, 192.168.10.101. 80}
    }

    prowadnica łańcucha {
    typ zaczep filtra filtr priorytetowy wstępnego routingu; rezygnacja z polityki;
    ip tata. TCP dport @biała lista akceptuje
    }
    }

  • Dyrektywa typeof ma teraz zastosowanie również do złączeń na listach map:

    tabela ip foo {
    mapa adres2mark {
    typ ip saddr. TCP dport: znacznik meta
    elementy = { 192.168.10.35 . 80: 0x00000001,
    192.168.10.135. 80: 0x00000002}
    }

    prowadnica łańcucha {
    typ zaczep filtra filtr priorytetowy wstępnego routingu; rezygnacja z polityki;
    meta mark set ip Daddr. Mapa portów TCP @addr2mark Zaakceptuj
    }
    }

  • Dodano obsługę łączenia zakresów w anonimowych (nienazwanych) zestawach:

    # nft dodaj regułę filtru inet wejście ip Daddr. port TCP\
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } zaakceptuj

  • Zapewniona jest możliwość odrzucania pakietów z flagami 802.1q (VLAN) podczas przetwarzania mostów sieciowych:

    # nft dodaj regułę Bridge foo bar Ethernet typu VLAN, odrzuć z resetem TCP

  • Dodano obsługę dopasowywania według identyfikatora sesji TCP (conntrack ID). Aby określić identyfikator conntrack, możesz użyć opcji „--output id”:

    # conntrack -L —identyfikator wyjścia
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 pakiety=2 \
    bajty=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 pakiety=2 bajty=320 \
    [ZAPEWNIONE] znak=0 użycie=1 id=2779986232

    # nft dodaj regułę foo bar ct id 2779986232 licznik

Źródło: opennet.ru

Dodaj komentarz