nftables pakkefilter 0.9.1 utgivelse

Etter et år med utvikling presentert pakkefilterfrigjøring nftables 0.9.1, utvikles som en erstatning for iptables, ip6table, arptables og ebtables ved å forene pakkefiltreringsgrensesnitt for IPv4, IPv6, ARP og nettverksbroer. nftables-pakken inkluderer pakkefilterkomponenter som kjører i brukerrom, mens arbeidet på kjernenivå leveres av nf_tables-undersystemet, som har vært en del av Linux-kjernen siden utgivelse 3.13.

Kjernenivået gir bare et generisk protokolluavhengig grensesnitt som gir grunnleggende funksjoner for å trekke ut data fra pakker, utføre dataoperasjoner og flytkontroll.
Selve filtreringslogikken og protokollspesifikke behandlere kompileres til bytekode i brukerrommet, hvoretter denne bytekoden lastes inn i kjernen ved hjelp av Netlink-grensesnittet og kjøres i en spesiell virtuell maskin som minner om BPF (Berkeley Packet Filters). Denne tilnærmingen lar deg redusere størrelsen på filtreringskoden som kjører på kjernenivå betydelig og flytte alle funksjonene til parsingsregler og logikk for arbeid med protokoller inn i brukerområdet.

Hovedinnovasjoner:

  • IPsec-støtte, som tillater matching av tunneladresser basert på pakke, IPsec-forespørsels-ID og SPI (Security Parameter Index) tag. For eksempel,

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

    Det er også mulig å sjekke om en rute går gjennom en IPsec-tunnel. For eksempel, for å blokkere trafikk ikke via IPSec:

    … filterutgang rt ipsec mangler fall

  • Støtte for IGMP (Internet Group Management Protocol). Du kan for eksempel bruke en regel for å forkaste innkommende IGMP-gruppemedlemskapsforespørsler

    nft add-regel netdev foo bar igmp type medlemskap-spørring counter drop

  • Mulighet for å bruke variabler for å definere overgangskjeder (hopp/goto). For eksempel:

    definer dest = ber
    legg til regel ip foo bar jump $dest

  • Støtte for masker for å identifisere operativsystemer (OS Fingerprint) basert på TTL-verdier i overskriften. For å merke pakker basert på avsender-OS, kan du for eksempel bruke kommandoen:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "ukjent" : 0x0 }
    ... osf ttl hopp over versjon "Linux:4.20"

  • Evne til å matche ARP-adressen til avsenderen og IPv4-adressen til målsystemet. For å øke telleren for ARP-pakker sendt fra adressen 192.168.2.1, kan du for eksempel bruke følgende regel:

    tabell arp x {
    kjede y {
    type filter krok input prioritet filter; politikk akseptere;
    arp saddr ip 192.168.2.1 tellerpakker 1 byte 46
    }
    }

  • Støtte for transparent videresending av forespørsler gjennom en proxy (tproxy). For eksempel, for å omdirigere anrop til port 80 til proxy-port 8080:

    tabell ip x {
    kjede y {
    type filter krok prerouting prioritet -150; politikk akseptere;
    tcp dport 80 tproxy til :8080
    }
    }

  • Støtte for merking av sockets med mulighet for ytterligere å få sett-merket via setsockopt() i SO_MARK-modus. For eksempel:

    tabell inet x {
    kjede y {
    type filter krok prerouting prioritet -150; politikk akseptere;
    tcp dport 8080 mark set socket mark
    }
    }

  • Støtte for å spesifisere prioriterte tekstnavn for kjeder. For eksempel:

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

  • Støtte for SELinux-tagger (Secmark). For å definere "sshtag"-taggen i en SELinux-kontekst, kan du for eksempel kjøre:

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

    Og bruk deretter denne etiketten i reglene:

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

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

  • Evne til å spesifisere porter tilordnet protokoller i tekstform, slik de er definert i filen /etc/services. For eksempel:

    nft add-regel x y tcp dport "ssh"
    nft liste regelsett -l
    tabell x {
    kjede y {
    ...
    tcp dport "ssh"
    }
    }

  • Evne til å sjekke typen nettverksgrensesnitt. For eksempel:

    legg til regel inet rå prerouting meta iifkind "vrf" godta

  • Forbedret støtte for dynamisk oppdatering av innholdet i sett ved å spesifisere det "dynamiske" flagget eksplisitt. For eksempel, for å oppdatere sett "s" for å legge til kildeadressen og tilbakestille oppføringen hvis det ikke er pakker på 30 sekunder:

    legg til tabell x
    legg til sett x s { type ipv4_addr; størrelse 128; timeout 30s; flagg dynamisk; }
    add chain x y { type filter krok inngangsprioritet 0; }
    legg til regel x y oppdatering @s { ip saddr }

  • Evne til å angi en egen timeout-tilstand. For å overstyre standard tidsavbrudd for pakker som ankommer port 8888, kan du for eksempel spesifisere:

    tabell ip filter {
    ct timeout aggressive-tcp {
    protokoll tcp;
    l3proto ip;
    policy = {etablert: 100, close_wait: 4, close: 4}
    }
    kjedeutgang {
    ...
    tcp dport 8888 ct timeout sett "aggressive-tcp"
    }
    }

  • NAT-støtte for inet-familien:

    tabell inet nat {
    ...
    ip6 daddr død::2::1 dnat til død:2::99
    }

  • Forbedret skrivefeilrapportering:

    nft add kjedefilter test

    Feil: Ingen slik fil eller katalog; mente du tabell "filter" i familie-ip?
    legg til kjedefiltertest
    ^^^^^^

  • Evne til å spesifisere grensesnittnavn i sett:

    sett sc {
    skriv inet_service . ifname
    elementer = { "ssh" . "eth0" }
    }

  • Oppdatert syntaks for flyttabellregler:

    nft legg til tabell x
    nft add flowtable x ft { krokinngang prioritet 0; enheter = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Forbedret JSON-støtte.

Kilde: opennet.ru

Legg til en kommentar