Lëshimi i filtrit të paketave nftables 0.9.1

Pas një viti zhvillimi prezantuar lirimi i filtrit të paketës nftables 0.9.1, duke u zhvilluar si një zëvendësim për iptables, ip6table, arptables dhe ebtables duke unifikuar ndërfaqet e filtrimit të paketave për IPv4, IPv6, ARP dhe urat e rrjetit. Paketa nftables përfshin komponentët e filtrit të paketave që funksionojnë në hapësirën e përdoruesit, ndërsa puna në nivel kernel ofrohet nga nënsistemi nf_tables, i cili ka qenë pjesë e kernelit Linux që nga lëshimi 3.13.

Niveli i kernelit siguron vetëm një ndërfaqe gjenerike të pavarur nga protokolli që ofron funksione bazë për nxjerrjen e të dhënave nga paketat, kryerjen e operacioneve të të dhënave dhe kontrollin e rrjedhës.
Vetë logjika e filtrimit dhe mbajtësit specifikë të protokollit përpilohen në bytecode në hapësirën e përdoruesit, pas së cilës ky bajtkod ngarkohet në kernel duke përdorur ndërfaqen Netlink dhe ekzekutohet në një makinë virtuale speciale që të kujton BPF (Berkeley Packet Filters). Kjo qasje ju lejon të zvogëloni ndjeshëm madhësinë e kodit të filtrimit që funksionon në nivelin e kernelit dhe të zhvendosni të gjitha funksionet e rregullave të analizimit dhe logjikës për të punuar me protokollet në hapësirën e përdoruesit.

Risitë kryesore:

  • Mbështetje IPsec, duke lejuar përputhjen e adresave të tunelit bazuar në paketën, ID-në e kërkesës IPsec dhe etiketën SPI (Security Parameter Index). Për shembull,

    ... ipsec në ip saddr 192.168.1.0/24
    ... ipsec në spi 1-65536

    Është gjithashtu e mundur të kontrollohet nëse një rrugë kalon përmes një tuneli IPsec. Për shembull, për të bllokuar trafikun jo përmes IPSec:

    … prodhimi i filtrit rt ipsec mungon

  • Mbështetje për IGMP (Internet Group Management Protocol). Për shembull, mund të përdorni një rregull për të hedhur poshtë kërkesat e anëtarësimit në grup IGMP

    nft shto rregullin netdev foo bar igmp tip antarsimi-query counter drop

  • Mundësia e përdorimit të variablave për të përcaktuar zinxhirët e tranzicionit (jump / goto). Për shembull:

    define dest = ber
    shtoni rregullin ip foo shirit kërcim $dest

  • Mbështetje për maska ​​për të identifikuar sistemet operative (Gjurmët e gishtave OS) bazuar në vlerat TTL në kokë. Për shembull, për të shënuar paketat bazuar në sistemin operativ dërgues, mund të përdorni komandën:

    ... set meta markash osf ttl kapërce hartën e emrit { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "i panjohur" : 0x0 }
    ... osf ttl kapërce versionin "Linux:4.20"

  • Aftësia për të përputhur adresën ARP të dërguesit dhe adresën IPv4 të sistemit të synuar. Për shembull, për të rritur numëruesin e paketave ARP të dërguara nga adresa 192.168.2.1, mund të përdorni rregullin e mëposhtëm:

    tabela arp x {
    zinxhir y {
    lloji i filtrit të fiksimit të prioritetit të hyrjes së filtrit; pranimi i politikës;
    arp saddr ip 192.168.2.1 paketa numëruese 1 bajt 46
    }
    }

  • Mbështetje për përcjelljen transparente të kërkesave përmes një proxy (tproxy). Për shembull, për të ridrejtuar thirrjet në portin 80 në portin proxy 8080:

    tabela ip x {
    zinxhir y {
    Prioriteti i parakalimit të grepit të filtrit -150; pranimi i politikës;
    tcp dport 80 tproxy në :8080
    }
    }

  • Mbështetje për shënimin e prizave me aftësinë për të marrë më tej shenjën e vendosur përmes setsockopt() në modalitetin SO_MARK. Për shembull:

    inet tabela x {
    zinxhir y {
    Prioriteti i parakalimit të grepit të filtrit -150; pranimi i politikës;
    tcp dport 8080 mark set socket mark
    }
    }

  • Mbështetje për përcaktimin e emrave të tekstit me përparësi për zinxhirët. Për shembull:

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

  • Mbështetje për etiketat SELinux (Secmark). Për shembull, për të përcaktuar etiketën "sshtag" në një kontekst SELinux, mund të ekzekutoni:

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

    Dhe pastaj përdorni këtë etiketë në rregullat:

    nft shtoni rregullin inet hyrja e filtrit tcp dport 22 meta secmark set "sshtag"

    nft add map inet filter secmapping { type inet_service : secmark; }
    nft shtoni elementin inet filter secmapping { 22 : "sshtag" }
    nft shtoni rregullin inet hyrja e filtrit meta secmark set tcp dport map @secmapping

  • Aftësia për të specifikuar portet e caktuara për protokollet në formë teksti, siç janë përcaktuar në skedarin /etc/services. Për shembull:

    nft shtoni rregullin xy tcp dport "ssh"
    Lista e rregullave nft -l
    tabela x {
    zinxhir y {
    ...
    tcp dport "ssh"
    }
    }

  • Aftësia për të kontrolluar llojin e ndërfaqes së rrjetit. Për shembull:

    shtoni rregullin inet raw prerouting meta iifkind "vrf" pranoj

  • Mbështetje e përmirësuar për përditësimin dinamik të përmbajtjes së grupeve duke specifikuar në mënyrë eksplicite flamurin "dinamik". Për shembull, për të përditësuar grupin "s" për të shtuar adresën e burimit dhe për të rivendosur hyrjen nëse nuk ka pako për 30 sekonda:

    shtoni tabelën x
    add set xs { type ipv4_addr; madhësia 128; timeout 30s; flamuj dinamikë; }
    add chain xy { type filtri hook priority input 0; }
    shto rregullin xy përditësim @s { ip saddr }

  • Aftësia për të vendosur një kusht të veçantë të afatit. Për shembull, për të anashkaluar kohën e paracaktuar për paketat që mbërrijnë në portin 8888, mund të specifikoni:

    filtri i ip-së së tabelës {
    ct timeout aggressive-tcp {
    protokolli tcp;
    l3proto ip;
    politika = {krijuar: 100, mbyll_prit: 4, mbyll: 4}
    }
    prodhimi i zinxhirit {
    ...
    tcp dport 8888 ct set out time "aggressive-tcp"
    }
    }

  • Mbështetje NAT për familjen inet:

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

  • Raportimi i përmirësuar i gabimeve të shkrimit:

    nft shtoni testin e filtrit të zinxhirit

    Gabim: Nuk ka skedar apo direktori të tillë; e kishit fjalën "filtër" të tabelës në ip-në e familjes?
    shtoni testin e filtrit të zinxhirit
    ^^^^^^

  • Aftësia për të specifikuar emrat e ndërfaqes në grupe:

    vendos sc {
    shkruani inet_service. nëse emri
    elementet = { "ssh" . "eth0"}
    }

  • Sintaksa e përditësuar e rregullave të tabelës së rrjedhës:

    nft shtoni tabelën x
    nft shtoni tabelën e rrjedhës x ft { prioriteti i hyrjes së goditjes 0; pajisje = { eth0, wlan0 }; }
    ...
    nft shtoni rregullin x përpara protokollin ip { tcp, udp } flow shtoni @ft

  • Mbështetje e përmirësuar JSON.

Burimi: opennet.ru

Shto një koment