nftables pakketfilter release 0.9.1

Na een jaar van ontwikkeling ingediend pakketfilter vrijgave ftables 0.9.1, ontwikkeld als vervanging voor iptables, ip6table, arptables en ebtables door pakketfilterinterfaces voor IPv4, IPv6, ARP en netwerkbruggen te verenigen. Het nftables-pakket bevat pakketfiltercomponenten die in de gebruikersruimte draaien, terwijl het werk op kernelniveau wordt geleverd door het nf_tables-subsysteem, dat sinds release 3.13 deel uitmaakt van de Linux-kernel.

Het kernelniveau biedt alleen een generieke protocol-onafhankelijke interface die basisfuncties biedt voor het extraheren van gegevens uit pakketten, het uitvoeren van gegevensbewerkingen en stroomcontrole.
De filterlogica zelf en protocolspecifieke handlers worden in de gebruikersruimte gecompileerd tot bytecode, waarna deze bytecode via de Netlink-interface in de kernel wordt geladen en wordt uitgevoerd in een speciale virtuele machine die doet denken aan BPF (Berkeley Packet Filters). Met deze aanpak kunt u de grootte van de filtercode die op kernelniveau wordt uitgevoerd aanzienlijk verkleinen en alle functies van parseerregels en logica voor het werken met protocollen naar de gebruikersruimte verplaatsen.

Belangrijkste innovaties:

  • IPsec-ondersteuning, waardoor het matchen van tunneladressen mogelijk is op basis van pakket, IPsec-verzoek-ID en SPI-tag (Security Parameter Index). Bijvoorbeeld,

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

    Ook is het mogelijk om te controleren of een route door een IPsec-tunnel gaat. Om bijvoorbeeld verkeer te blokkeren dat niet via IPSec verloopt:

    … filteruitvoer rt ipsec ontbrekende druppel

  • Ondersteuning voor IGMP (Internet Group Management Protocol). U kunt bijvoorbeeld een regel gebruiken om binnenkomende IGMP-groepslidmaatschapsverzoeken te negeren

    nft add rule netdev foo bar igmp type lidmaatschap-query counter drop

  • Mogelijkheid om variabelen te gebruiken om overgangsketens te definiëren (jump / goto). Bijvoorbeeld:

    definieer bestemming = ber
    regel toevoegen ip foo bar jump $dest

  • Ondersteuning voor maskers om besturingssystemen (OS Fingerprint) te identificeren op basis van TTL-waarden in de header. Om bijvoorbeeld pakketten te markeren op basis van het besturingssysteem van de afzender, kunt u de opdracht gebruiken:

    ... metamarkering ingesteld osf ttl naamkaart overslaan { "Linux": 0x1,
    "Vensters": 0x2,
    "MacOS": 0x3,
    "onbekend" : 0x0 }
    ... osf ttl versie "Linux:4.20" overslaan

  • Mogelijkheid om het ARP-adres van de afzender en het IPv4-adres van het doelsysteem te matchen. Om bijvoorbeeld de teller van ARP-pakketten verzonden vanaf het adres 192.168.2.1 te verhogen, kunt u de volgende regel gebruiken:

    tabel arp x {
    keten y {
    type filter hook ingangsprioriteitfilter; beleid accepteren;
    arp saddr ip 192.168.2.1 tellerpakketten 1 bytes 46
    }
    }

  • Ondersteuning voor het transparant doorsturen van verzoeken via een proxy (tproxy). Om bijvoorbeeld oproepen naar poort 80 om te leiden naar proxypoort 8080:

    tabel ip x {
    keten y {
    type filterhaakvoorrang prioriteit -150; beleid accepteren;
    tcp dport 80 tproxy naar:8080
    }
    }

  • Ondersteuning voor het markeren van sockets met de mogelijkheid om de ingestelde markering verder te verkrijgen via setsockopt() in de SO_MARK-modus. Bijvoorbeeld:

    tabel inet x {
    keten y {
    type filterhaakvoorrang prioriteit -150; beleid accepteren;
    tcp dport 8080 markering set socketmarkering
    }
    }

  • Ondersteuning voor het opgeven van prioriteitstekstnamen voor ketens. Bijvoorbeeld:

    nft add chain ip x raw {type filter hook prerouting prioriteit raw; }
    nft add chain ip x filter {type filter hook prerouting prioriteitsfilter; }
    nft add chain ip x filter_later {type filter hook prerouting prioriteitsfilter + 10; }

  • Ondersteuning voor SELinux-tags (Secmark). Om bijvoorbeeld de tag "sshtag" in een SELinux-context te definiëren, kun je het volgende uitvoeren:

    nft voeg secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0" toe

    En gebruik dan dit label in de regels:

    nft regel toevoegen inet filterinvoer tcp dport 22 meta secmark set "sshtag"

    nft kaart toevoegen inet filter secmapping {type inet_service: secmark; }
    nft element toevoegen inet filter secmapping { 22: "sshtag" }
    nft regel toevoegen inet filterinvoer meta secmark set tcp dport map @secmapping

  • Mogelijkheid om poorten die aan protocollen zijn toegewezen in tekstvorm te specificeren, zoals deze zijn gedefinieerd in het bestand /etc/services. Bijvoorbeeld:

    nft regel toevoegen xy tcp dport "ssh"
    nft lijstregelset -l
    tafel x {
    keten y {
    ...
    tcp dport "ssh"
    }
    }

  • Mogelijkheid om het type netwerkinterface te controleren. Bijvoorbeeld:

    regel toevoegen inet raw prerouting meta iifkind "vrf" accepteren

  • Verbeterde ondersteuning voor het dynamisch bijwerken van de inhoud van sets door expliciet de “dynamische” vlag op te geven. Om bijvoorbeeld set "s" bij te werken om het bronadres toe te voegen en de invoer opnieuw in te stellen als er gedurende 30 seconden geen pakketten zijn:

    tabel x toevoegen
    set xs toevoegen {type ipv4_addr; maat 128; time-out 30s; vlaggen dynamisch; }
    keten xy toevoegen {type filter hook invoerprioriteit 0; }
    regel toevoegen xy update @s { ip saddr }

  • Mogelijkheid om een ​​afzonderlijke time-outvoorwaarde in te stellen. Om bijvoorbeeld de standaardtime-out voor pakketten die op poort 8888 aankomen te overschrijven, kunt u het volgende opgeven:

    tabel IP-filter {
    ct time-out agressief-tcp {
    protocol-tcp;
    l3proto ip;
    beleid = {vastgesteld: 100, close_wait: 4, close: 4}
    }
    kettinguitgang {
    ...
    tcp dport 8888 ct time-out ingesteld op "agressieve-tcp"
    }
    }

  • NAT-ondersteuning voor inet-familie:

    tabel inet nat {
    ...
    ip6 daddr dood::2::1 dnat tot dood:2::99
    }

  • Verbeterde rapportage van typefouten:

    nft kettingfiltertest toevoegen

    Fout: een dergelijk bestand of map bestaat niet; Bedoelde je tabel “filter” in familie-IP?
    kettingfiltertest toevoegen
    ^^^^^^

  • Mogelijkheid om interfacenamen in sets op te geven:

    stel sc in {
    typ inet_service . alsnaam
    elementen = {"ssh" . "eth0" }
    }

  • Bijgewerkte syntaxis van stroomtabelregels:

    nft voeg tabel x toe
    nft add flowtable x ft { hook ingress prioriteit 0; apparaten = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol {tcp, udp} flow add @ft

  • Verbeterde JSON-ondersteuning.

Bron: opennet.ru

Voeg een reactie