versió 0.9.1 del filtre de paquets nftables

Després d'un any de desenvolupament presentat alliberament del filtre de paquets nftables 0.9.1, desenvolupant-se com a reemplaçament d'iptables, ip6table, arptables i ebtables mitjançant la unificació d'interfícies de filtratge de paquets per a IPv4, IPv6, ARP i ponts de xarxa. El paquet nftables inclou components de filtre de paquets que s'executen a l'espai d'usuari, mentre que el treball a nivell del nucli el proporciona el subsistema nf_tables, que forma part del nucli de Linux des del llançament 3.13.

El nivell del nucli només proporciona una interfície genèrica independent del protocol que proporciona funcions bàsiques per extreure dades dels paquets, realitzar operacions de dades i controlar el flux.
La pròpia lògica de filtratge i els controladors específics del protocol es compilen en bytecode a l'espai de l'usuari, després del qual aquest bytecode es carrega al nucli mitjançant la interfície Netlink i s'executa en una màquina virtual especial que recorda BPF (Berkeley Packet Filters). Aquest enfocament us permet reduir significativament la mida del codi de filtratge que s'executa al nivell del nucli i moure totes les funcions d'anàlisi de regles i lògica per treballar amb protocols a l'espai d'usuari.

Principals innovacions:

  • Suport IPsec, que permet la concordança d'adreces de túnel basades en paquets, ID de sol·licitud IPsec i etiqueta SPI (índex de paràmetres de seguretat). Per exemple,

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

    També és possible comprovar si una ruta passa per un túnel IPsec. Per exemple, per bloquejar el trànsit no mitjançant IPSec:

    … la sortida del filtre rt ipsec falta gota

  • Suport per a IGMP (Internet Group Management Protocol). Per exemple, podeu utilitzar una regla per descartar les sol·licituds de pertinença a un grup IGMP entrants

    nft add rule netdev foo bar tipus igmp caiguda del comptador de consultes de pertinença

  • Possibilitat d'utilitzar variables per definir cadenes de transició (jump/goto). Per exemple:

    define dest = ber
    afegir regla ip foo bar jump $dest

  • Suport per a màscares per identificar sistemes operatius (OS Fingerprint) en funció dels valors TTL de la capçalera. Per exemple, per marcar paquets segons el sistema operatiu del remitent, podeu utilitzar l'ordre:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "desconegut": 0x0}
    ... osf ttl omet la versió "Linux:4.20"

  • Capacitat de fer coincidir l'adreça ARP del remitent i l'adreça IPv4 del sistema de destinació. Per exemple, per augmentar el comptador de paquets ARP enviats des de l'adreça 192.168.2.1, podeu utilitzar la regla següent:

    taula arp x {
    cadena y {
    tipus de filtre ganxo d'entrada filtre de prioritat; acceptar la política;
    arp saddr ip 192.168.2.1 comptador de paquets 1 bytes 46
    }
    }

  • Suport per a l'enviament transparent de sol·licituds mitjançant un proxy (tproxy). Per exemple, per redirigir les trucades al port 80 al port intermediari 8080:

    taula ip x {
    cadena y {
    tipus de prioritat de preenrutament de ganxo de filtre -150; acceptar la política;
    tcp dport 80 tproxy a:8080
    }
    }

  • Suport per marcar sòcols amb la possibilitat d'obtenir la marca establerta mitjançant setsockopt() en mode SO_MARK. Per exemple:

    taula inet x {
    cadena y {
    tipus de prioritat de preenrutament de ganxo de filtre -150; acceptar la política;
    tcp dport 8080 mark set marca de sòcol
    }
    }

  • Suport per especificar noms de text prioritaris per a cadenes. Per exemple:

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

  • Suport per a etiquetes SELinux (Secmark). Per exemple, per definir l'etiqueta "sshtag" en un context SELinux, podeu executar:

    nft afegir secmark filtre inet sshtag "system_u:object_r:ssh_server_packet_t:s0"

    A continuació, utilitzeu aquesta etiqueta a les regles:

    nft afegir regla inet filtre entrada tcp dport 22 meta secmark set "sshtag"

    nft afegir mapa inet filtre secmapping { tipus inet_service: secmark; }
    nft afegir element filtre inet secmapping { 22 : "sshtag" }
    nft afegir regla inet filter input meta secmark set tcp dport map @secmapping

  • Capacitat d'especificar els ports assignats als protocols en forma de text, tal com es defineixen al fitxer /etc/services. Per exemple:

    nft afegir regla xy tcp dport "ssh"
    conjunt de regles de llista nft -l
    taula x {
    cadena y {
    ...
    tcp dport "ssh"
    }
    }

  • Possibilitat de comprovar el tipus d'interfície de xarxa. Per exemple:

    afegir regla inet raw prerouting meta iifkind "vrf" acceptar

  • Suport millorat per a l'actualització dinàmica del contingut dels conjunts especificant explícitament la marca "dinàmica". Per exemple, per actualitzar el conjunt "s" per afegir l'adreça d'origen i restablir l'entrada si no hi ha paquets durant 30 segons:

    afegir taula x
    afegir conjunt xs { tipus ipv4_addr; talla 128; temps d'espera 30 s; banderes dinàmiques; }
    afegir cadena xy { tipus filtre ganxo entrada prioritat 0; }
    afegir regla xy actualitzar @s { ip saddr }

  • Possibilitat d'establir una condició de temps d'espera per separat. Per exemple, per anul·lar el temps d'espera predeterminat per als paquets que arriben al port 8888, podeu especificar:

    filtre ip de taula {
    ct timeout aggressive-tcp {
    protocol tcp;
    l3proto ip;
    política = {established: 100, close_wait: 4, close: 4}
    }
    sortida en cadena {
    ...
    tcp dport 8888 ct timeout definit "aggressive-tcp"
    }
    }

  • Suport NAT per a la família inet:

    taula inet nat {
    ...
    ip6 daddr mort::2::1 dnat a mort:2::99
    }

  • Informe d'errors d'ortografia millorat:

    nft afegir prova de filtre de cadena

    Error: no hi ha cap fitxer o directori; Voleu dir "filtre" de la taula a la IP familiar?
    afegir una prova de filtre de cadena
    ^^^^^^

  • Capacitat d'especificar noms d'interfície en conjunts:

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

  • Sintaxi de regles de la taula de flux actualitzada:

    nft afegir taula x
    nft add flowtable x ft { prioritat d'entrada del ganxo 0; dispositius = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Suport JSON millorat.

Font: opennet.ru

Afegeix comentari