nftables pakketfilter 0.9.1 release

Nei in jier fan ûntwikkeling presintearre pakket filter frijlitting nftables 0.9.1, ûntwikkeljen as ferfanging foar iptables, ip6table, arptables en ebtables troch it ferienigjen fan pakketfiltering-ynterfaces foar IPv4, IPv6, ARP en netwurkbrêgen. It nftables-pakket omfettet pakketfilterkomponinten dy't yn brûkersromte rinne, wylst it wurk op kernelnivo wurdt fersoarge troch it nf_tables-subsysteem, dat sûnt release 3.13 diel is fan 'e Linux-kernel.

It kernelnivo leveret allinich in generike protokol-ûnôfhinklike ynterface dy't basisfunksjes leveret foar it ekstrahearjen fan gegevens út pakketten, it útfieren fan gegevensoperaasjes en streamkontrôle.
De filterlogika sels en protokol-spesifike handlers wurde kompilearre yn bytekoade yn brûkersromte, wêrnei't dizze bytekoade yn 'e kearn laden wurdt mei de Netlink-ynterface en útfierd yn in spesjale firtuele masine dy't docht tinken oan BPF (Berkeley Packet Filters). Dizze oanpak lit jo de grutte fan 'e filterkoade dy't rint op it kearnnivo signifikant ferminderje en alle funksjes fan parsingregels en logika foar wurkjen mei protokollen nei brûkersromte ferpleatse.

Wichtichste ynnovaasjes:

  • IPsec-stipe, wêrtroch oerienkomst fan tunneladressen mooglik is basearre op pakket, IPsec-fersyk-ID, en SPI (Security Parameter Index) tag. Bygelyks,

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

    It is ek mooglik om te kontrolearjen oft in rûte troch in IPsec-tunnel giet. Bygelyks om ferkear te blokkearjen net fia IPSec:

    … filterútfier rt ipsec ûntbrekkende drop

  • Stipe foar IGMP (Internet Group Management Protocol). Jo kinne bygelyks in regel brûke om ynkommende oanfragen foar lidmaatskip fan IGMP-groepen te ferwiderjen

    nft tafoegje regel netdev foo bar igmp type lidmaatskip-query counter drop

  • Mooglikheid om fariabelen te brûken om oergongsketten te definiearjen (springe / goto). Bygelyks:

    define dest = ber
    add regel ip foo bar jump $ dest

  • Stipe foar maskers om bestjoeringssystemen te identifisearjen (OS Fingerprint) basearre op TTL-wearden yn 'e koptekst. Bygelyks, om pakketten te markearjen basearre op it stjoerder OS, kinne jo it kommando brûke:

    ... meta mark set osf ttl skip namme map { "Linux": 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "ûnbekend" : 0x0 }
    ... osf ttl skip ferzje "Linux:4.20"

  • Mooglikheid om oerien te kommen mei it ARP-adres fan 'e stjoerder en it IPv4-adres fan it doelsysteem. Bygelyks, om de teller fan ARP-pakketten te fergrutsjen dy't ferstjoerd binne fan it adres 192.168.2.1, kinne jo de folgjende regel brûke:

    tabel arp x {
    ketting y {
    type filter hook input prioriteit filter; belied akseptearje;
    arp saddr ip 192.168.2.1 tellerpakketten 1 bytes 46
    }
    }

  • Stipe foar transparant trochstjoeren fan oanfragen fia in proxy (tproxy). Bygelyks om petearen nei poarte 80 nei proxy-poarte 8080 troch te lieden:

    tabel ip x {
    ketting y {
    type filter hook prerouting prioriteit -150; belied akseptearje;
    tcp dport 80 tproxy nei:8080
    }
    }

  • Stipe foar markearring sockets mei de mooglikheid om fierder te krijen de set mark fia setsockopt () yn SO_MARK modus. Bygelyks:

    tabel inet x {
    ketting y {
    type filter hook prerouting prioriteit -150; belied akseptearje;
    tcp dport 8080 mark set socket mark
    }
    }

  • Stipe foar it opjaan fan prioriteitstekstnammen foar keatlingen. Bygelyks:

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

  • Stipe foar SELinux-tags (Secmark). Om bygelyks de tag "sshtag" te definiearjen yn in SELinux-kontekst, kinne jo útfiere:

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

    En brûk dan dit label yn 'e regels:

    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 elemint inet filter secmapping { 22 : "sshtag" }
    nft add rule inet filter input meta secmark set tcp dport map @secmapping

  • Mooglikheid om poarten oan te jaan dy't oan protokollen yn tekstfoarm tawiisd binne, sa't se definieare binne yn it /etc/services-bestân. Bygelyks:

    nft regel tafoegje xy tcp dport "ssh"
    nft list regelset -l
    tabel x {
    ketting y {
    ...
    tcp dport "ssh"
    }
    }

  • Mooglikheid om it type netwurkynterface te kontrolearjen. Bygelyks:

    foegje regel inet raw prerouting meta iifkind "vrf" akseptearje

  • Ferbettere stipe foar dynamysk bywurkjen fan de ynhâld fan sets troch eksplisyt spesifisearje de "dynamyske" flagge. Bygelyks om set "s" te aktualisearjen om it boarneadres ta te foegjen en de yngong werom te setten as d'r 30 sekonden gjin pakketten binne:

    tafoegje tabel x
    add set xs {type ipv4_addr; grutte 128; timeout 30s; flaggen dynamysk; }
    add chain xy {type filter hook input prioriteit 0; }
    add regel xy update @s {ip saddr}

  • Mooglikheid om in aparte time-out betingst yn te stellen. Bygelyks, om de standert time-out te oerskriuwen foar pakketten dy't oankomme op poarte 8888, kinne jo opjaan:

    tabel ip filter {
    ct timeout aggressive-tcp {
    protokol tcp;
    l3proto ip;
    belied = {fêststeld: 100, close_wait: 4, slute: 4}
    }
    ketting útfier {
    ...
    tcp dport 8888 ct timeout set "agressyf-tcp"
    }
    }

  • NAT-stipe foar inet-famylje:

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

  • Ferbettere rapportaazje fan typflater:

    nft tafoegje kettingfiltertest

    Flater: Gjin sa'n triem of triemtafel; bedoele jo tabel "filter" yn famylje ip?
    add kettingfiltertest
    ^^^^^^

  • Mooglikheid om ynterface-nammen op te jaan yn sets:

    set sc {
    type inet_service. ifname
    elements = { "ssh" . "eth0" }
    }

  • Bywurke streamtabelregelsyntaksis:

    nft tafoegje tabel x
    nft tafoegje flowtable x ft {haak ingress prioriteit 0; apparaten = { eth0, wlan0 }; }
    ...
    nft tafoegje regel x foarút ip protokol {tcp, udp} stream tafoegje @ft

  • Ferbettere JSON-stipe.

Boarne: opennet.ru

Add a comment