nftables paketfilter 0.9.1 release

Efter ett år av utveckling presenteras paketfilterutlösning nftables 0.9.1, utvecklas som en ersättning för iptables, ip6table, arptables och ebtables genom att förena paketfiltreringsgränssnitt för IPv4, IPv6, ARP och nätverksbryggor. Paketet nftables inkluderar paketfilterkomponenter som körs i användarutrymme, medan arbetet på kärnnivå tillhandahålls av nf_tables-undersystemet, som har varit en del av Linux-kärnan sedan release 3.13.

Kärnnivån tillhandahåller endast ett generiskt protokolloberoende gränssnitt som tillhandahåller grundläggande funktioner för att extrahera data från paket, utföra dataoperationer och flödeskontroll.
Själva filtreringslogiken och protokollspecifika hanterare kompileras till bytekod i användarutrymmet, varefter denna bytekod laddas in i kärnan med hjälp av Netlink-gränssnittet och exekveras i en speciell virtuell maskin som påminner om BPF (Berkeley Packet Filters). Detta tillvägagångssätt tillåter dig att avsevärt minska storleken på filtreringskoden som körs på kärnnivå och flytta alla funktioner för att analysera regler och logik för att arbeta med protokoll till användarutrymmet.

Huvudsakliga innovationer:

  • IPsec-stöd, tillåter matchning av tunneladresser baserat på paket, IPsec-begäran-ID och SPI-tagg (Security Parameter Index). Till exempel,

    ... ipsec i ip saddr 192.168.1.0/24
    ... ipsec i spi 1-65536

    Det är också möjligt att kontrollera om en rutt går genom en IPsec-tunnel. Till exempel, för att blockera trafik inte via IPSec:

    … filterutgång rt ipsec saknas dropp

  • Stöd för IGMP (Internet Group Management Protocol). Du kan till exempel använda en regel för att ignorera inkommande begäranden om IGMP-gruppmedlemskap

    nft add regel netdev foo bar igmp typ medlemskap-förfrågan counter drop

  • Möjlighet att använda variabler för att definiera övergångskedjor (hopp/goto). Till exempel:

    definiera dest = ber
    lägg till regel ip foo bar jump $dest

  • Stöd för masker för att identifiera operativsystem (OS Fingerprint) baserat på TTL-värden i rubriken. Till exempel, för att markera paket baserat på avsändarens OS, kan du använda kommandot:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "okänt" : 0x0 }
    ... osf ttl hoppa över version "Linux:4.20"

  • Möjlighet att matcha avsändarens ARP-adress och IPv4-adressen för målsystemet. Till exempel, för att öka räknaren för ARP-paket som skickas från adressen 192.168.2.1, kan du använda följande regel:

    tabell arp x {
    kedja y {
    typ filter krok input prioritetsfilter; policy acceptera;
    arp saddr ip 192.168.2.1 räknarpaket 1 byte 46
    }
    }

  • Stöd för transparent vidarebefordran av förfrågningar via en proxy (tproxy). Till exempel, för att omdirigera samtal till port 80 till proxyport 8080:

    tabell ip x {
    kedja y {
    typ filterkrok förvägningsprioritet -150; policy acceptera;
    tcp dport 80 tproxy till :8080
    }
    }

  • Stöd för märkning av sockets med möjlighet att ytterligare erhålla set-märket via setsockopt() i SO_MARK-läge. Till exempel:

    tabell inet x {
    kedja y {
    typ filterkrok förvägningsprioritet -150; policy acceptera;
    tcp dport 8080 mark set socket mark
    }
    }

  • Stöd för att ange prioriterade textnamn för kedjor. Till exempel:

    nft add chain ip x raw { typ filter hook prerouting priority raw; }
    nft add chain ip x filter { typ filter hook prerouting priority filter; }
    nft add chain ip x filter_later { typ filter hook prerouting priority filter + 10; }

  • Stöd för SELinux-taggar (Secmark). Till exempel, för att definiera "sshtag"-taggen i en SELinux-kontext, kan du köra:

    nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Och använd sedan denna etikett i reglerna:

    nft add rule inet filter input tcp dport 22 meta secmark set “sshtag”

    nft add map inet filter secmapping { typ inet_service: secmark; }
    nft add element inet filter secmapping { 22 : "sshtag" }
    nft add rule inet filter input meta secmark set tcp dport map @secmapping

  • Möjlighet att specificera portar som tilldelats protokoll i textform, som de definieras i filen /etc/services. Till exempel:

    nft add-regel xy tcp dport "ssh"
    nft list regeluppsättning -l
    tabell x {
    kedja y {
    .
    tcp dport "ssh"
    }
    }

  • Möjlighet att kontrollera typen av nätverksgränssnitt. Till exempel:

    lägg till regel inet rå prerouting meta iifkind "vrf" acceptera

  • Förbättrat stöd för dynamisk uppdatering av innehållet i set genom att uttryckligen ange den "dynamiska" flaggan. Till exempel, för att uppdatera set "s" för att lägga till källadressen och återställa posten om det inte finns några paket under 30 sekunder:

    lägg till tabell x
    lägg till set xs { typ ipv4_addr; storlek 128; timeout 30s; flaggor dynamiska; }
    add chain xy { typ filter krok ingångsprioritet 0; }
    lägg till regel xy uppdatera @s { ip saddr }

  • Möjlighet att ställa in ett separat timeoutvillkor. Till exempel, för att åsidosätta standard timeout för paket som anländer till port 8888, kan du ange:

    tabell ip filter {
    ct timeout aggressive-tcp {
    protokoll tcp;
    l3proto ip;
    policy = {etablerad: 100, close_wait: 4, nära: 4}
    }
    kedjeutgång {
    .
    tcp dport 8888 ct timeout set "aggressive-tcp"
    }
    }

  • NAT-stöd för inet-familjen:

    tabell inet nat {
    .
    ip6 daddr död::2::1 dnat till död:2::99
    }

  • Förbättrad felrapportering:

    nft add chain filter test

    Fel: Ingen sådan fil eller katalog; menade du tabell "filter" i familjens ip?
    lägg till kedjefiltertest
    ^^^^^^

  • Möjlighet att ange gränssnittsnamn i uppsättningar:

    set sc {
    skriv inet_service . ifname
    element = { "ssh" . "eth0" }
    }

  • Uppdaterad syntax för flödestabellregler:

    nft lägg till tabell x
    nft add flowtable x ft { hook ingress priority 0; enheter = { eth0, wlan0 }; }
    .
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Förbättrat JSON-stöd.

Källa: opennet.ru

Lägg en kommentar