Vydání paketového filtru nftables 0.9.1

Po roce vývoje prezentovány uvolnění paketového filtru nftables 0.9.1, vyvíjející se jako náhrada za iptables, ip6table, arptables a ebtables sjednocením rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty. Balíček nftables obsahuje komponenty paketového filtru, které běží v uživatelském prostoru, zatímco práci na úrovni jádra zajišťuje subsystém nf_tables, který je součástí linuxového jádra od vydání 3.13.

Úroveň jádra poskytuje pouze generické rozhraní nezávislé na protokolu, které poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.
Samotná logika filtrování a obslužné rutiny specifické pro protokol jsou v uživatelském prostoru zkompilovány do bajtkódu, načež je tento bajtkód načten do jádra pomocí rozhraní Netlink a spuštěn ve speciálním virtuálním stroji připomínajícím BPF (Berkeley Packet Filters). Tento přístup umožňuje výrazně snížit velikost filtrovacího kódu běžícího na úrovni jádra a přesunout všechny funkce parsovacích pravidel a logiky pro práci s protokoly do uživatelského prostoru.

Hlavní inovace:

  • Podpora IPsec, umožňující shodu adres tunelu na základě paketu, ID požadavku IPsec a tagu SPI (Security Parameter Index). Například,

    ... ipsec v ip saddr 192.168.1.0/24
    ... ipsec ve spi 1-65536

    Je také možné zkontrolovat, zda trasa prochází tunelem IPsec. Chcete-li například blokovat provoz mimo IPSec:

    … výstup filtru rt ipsec chybí pokles

  • Podpora protokolu IGMP (Internet Group Management Protocol). Pomocí pravidla můžete například zahodit příchozí žádosti o členství ve skupině IGMP

    nft přidat pravidlo netdev foo bar igmp typ členství-dotaz counter drop

  • Možnost použití proměnných k definování přechodových řetězců (skok / goto). Například:

    definovat dest = ber
    přidat pravidlo ip foo bar skok $dest

  • Podpora masek k identifikaci operačních systémů (OS Fingerprint) na základě hodnot TTL v záhlaví. Chcete-li například označit pakety na základě OS odesílatele, můžete použít příkaz:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "neznámý" : 0x0 }
    ... osf ttl přeskočit verzi "Linux:4.20"

  • Schopnost porovnat ARP adresu odesílatele a IPv4 adresu cílového systému. Chcete-li například zvýšit počítadlo paketů ARP odeslaných z adresy 192.168.2.1, můžete použít pravidlo:

    tabulka arp x {
    řetěz y {
    typ filter hook input priority filter; přijmout politiku;
    arp saddr ip 192.168.2.1 čítačové pakety 1 bajty 46
    }
    }

  • Podpora transparentního předávání požadavků přes proxy (tproxy). Chcete-li například přesměrovat volání na port 80 na port proxy 8080:

    tabulka ip x {
    řetěz y {
    priorita předsměrování háku typu filtru -150; přijmout politiku;
    tcp dport 80 tproxy na :8080
    }
    }

  • Podpora označování soketů s možností dalšího získání nastavené značky pomocí setsockopt() v režimu SO_MARK. Například:

    tabulka inet x {
    řetěz y {
    priorita předsměrování háku typu filtru -150; přijmout politiku;
    tcp dport 8080 mark nastavit značku socketu
    }
    }

  • Podpora pro specifikaci prioritních textových názvů pro řetězce. Například:

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

  • Podpora SELinux tagů (Secmark). Chcete-li například definovat značku "sshtag" v kontextu SELinux, můžete spustit:

    nft přidat secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    A pak použijte toto označení v pravidlech:

    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 přidat pravidlo inet filter input meta secmark set tcp dport map @secmapping

  • Schopnost specifikovat porty přiřazené protokolům v textové podobě, jak jsou definovány v souboru /etc/services. Například:

    nft přidat pravidlo xy tcp dport "ssh"
    nft seznam pravidel -l
    tabulka x {
    řetěz y {
    ...
    tcp dport "ssh"
    }
    }

  • Schopnost zkontrolovat typ síťového rozhraní. Například:

    přidat pravidlo inet raw prerouting meta iifkind "vrf" přijmout

  • Vylepšená podpora pro dynamickou aktualizaci obsahu sad explicitním určením příznaku „dynamic“. Chcete-li například aktualizovat sadu "s" pro přidání zdrojové adresy a resetování položky, pokud po dobu 30 sekund nejsou žádné pakety:

    přidat tabulku x
    add set xs { type ipv4_addr; velikost 128; časový limit 30s; dynamické příznaky; }
    add chain xy { type filter hook input priority 0; }
    přidat pravidlo xy aktualizovat @s { ip saddr }

  • Možnost nastavit samostatnou podmínku časového limitu. Chcete-li například přepsat výchozí časový limit pro pakety přicházející na port 8888, můžete zadat:

    tabulka ip filtr {
    ct timeout agresivní-tcp {
    protokol tcp;
    l3proto ip;
    policy = {established: 100, close_wait: 4, close: 4}
    }
    řetězový výstup {
    ...
    tcp dport 8888 ct timeout nastaven na "aggressive-tcp"
    }
    }

  • Podpora NAT pro inet rodinu:

    tabulka inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Vylepšené hlášení překlepů:

    nft přidat test řetězového filtru

    Chyba: Žádný takový soubor nebo adresář; měli jste na mysli „filtr“ tabulky v rodinné ip?
    přidat test řetězového filtru
    ^^^^^^

  • Schopnost specifikovat názvy rozhraní v sadách:

    set sc {
    zadejte inet_service . ifname
    elementy = { "ssh" . "eth0" }
    }

  • Aktualizovaná syntaxe pravidel flowtable:

    nft přidat tabulku x
    nft add flowtable x ft { hook ingress priority 0; zařízení = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Vylepšená podpora JSON.

Zdroj: opennet.ru

Přidat komentář