Lëshimi i filtrit të paketave nftables 0.9.4

botuar lirimi i filtrit të paketës nftables 0.9.4, 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. Ndryshimet e nevojshme për funksionimin e lëshimit të nftables 0.9.4 përfshihen në degën e ardhshme të kernelit Linux 5.6.

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. Rregullat 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ë kernel 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 për vargjet në lidhje (lidhja, grupe të caktuara adresash dhe porta që thjeshtojnë krahasimin). Për shembull, për një grup "listë të bardhë" elementët e të cilit janë një bashkëngjitje, specifikimi i flamurit "interval" do të tregojë se grupi mund të përfshijë vargje në bashkëngjitje (për bashkëngjiturën "ipv4_addr . ipv4_addr . inet_service" më parë ishte e mundur të renditej saktësisht ndeshjet e formës "192.168.10.35. 192.68.11.123", dhe tani mund të specifikoni grupet e adresave "80-192.168.10.35-192.168.10.40"):

    ip tavoline foo {
    vendos listën e bardhë {
    shkruani ipv4_addr. ipv4_addr. shërbimi_inet
    intervali i flamujve
    elementet = {192.168.10.35-192.168.10.40. 192.68.11.123-192.168.11.125. 80}
    }

    shirit zinxhir {
    lloji i fiksimit të filtrit filtri i prioritetit të parakalimit; rënie e politikës;
    ip sadr. ip babi. tcp dport @whitelist prano
    }
    }

  • Në grupet dhe listat e hartave, është e mundur të përdoret direktiva "lloji", e cila përcakton formatin e elementit kur përputhet.
    Për shembull:

    ip tavoline foo {
    vendos listën e bardhë {
    lloji i ip sadr
    elementet = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    shirit zinxhir {
    lloji i fiksimit të filtrit filtri i prioritetit të parakalimit; rënie e politikës;
    ip daddr @whitelist prano
    }
    }

    ip tavoline foo {
    harta adr2mark {
    typeof ip saddr: meta mark
    elementet = {192.168.10.35: 0x00000001, 192.168.10.135: 0x00000002 }
    }
    }

  • U shtua aftësia për të përdorur lidhjet në lidhjet NAT, e cila ju lejon të specifikoni një adresë dhe port kur përcaktoni transformimet NAT bazuar në listat e hartave ose grupet e emërtuara:

    nft add rule ip nat pre dnat ip addr . port në ip saddr harta { 1.1.1.1: 2.2.2.2. tridhjetë}

    nft shtoni hartën ip nat destinacionet { shkruani ipv4_addr . inet_service: ipv4_addr. inet_service \\; }
    nft add rule ip nat pre dnat ip addr . port në ip sadr. tcp dport map @destinations

  • Mbështetje për përshpejtimin e harduerit me disa operacione filtrimi të kryera nga karta e rrjetit. Përshpejtimi aktivizohet nëpërmjet mjetit ethtool ("ethtool -K eth0 hw-tc-offload on"), pas së cilës aktivizohet në nftables për zinxhirin kryesor duke përdorur flamurin "offload". Kur përdorni kernel Linux 5.6, përshpejtimi i harduerit mbështetet për përputhjen e fushës së kokës dhe inspektimin e ndërfaqes hyrëse në kombinim me marrjen, hedhjen, dublimin (dup) dhe përcjelljen (fwd) të paketave. Në shembullin e mëposhtëm, operacionet e hedhjes së paketave që vijnë nga adresa 192.168.30.20 kryhen në nivelin e kartës së rrjetit, pa i kaluar paketat në kernel:

    # cat file.nft
    tabela netdev x {
    zinxhir y {
    lloji i pajisjes hyrëse të grepit të filtrit prioriteti eth0 10; shkarkimi i flamujve;
    ip sadr 192.168.30.20 bie
    }
    }
    # nft -f skedar.nft

  • Informacion i përmirësuar në lidhje me vendndodhjen e një gabimi në rregulla.

    # nft fshirja e rregullit ip yz doreza 7
    Gabim: Rregulli nuk mund të përpunohej: Nuk ka skedar ose drejtori të tillë
    Fshi rregullin ip yz dorezën 7
    ^

    # nft fshirja e rregullit ip xx doreza 7
    Gabim: Rregulli nuk mund të përpunohej: Nuk ka skedar ose drejtori të tillë
    Fshi rregullin ip xx dorezën 7
    ^

    # nft fshij tabelën twst
    Gabim: Nuk ka skedar apo direktori të tillë; e kishit fjalën "test" të tabelës në IP të familjes?
    fshij tabelën twst
    ^^^^

    Shembulli i parë tregon se tabela "y" nuk është në sistem, i dyti që mungon mbajtësi "7" dhe i treti që një kërkesë për gabime shtypi shfaqet kur shkruani emrin e tabelës.

  • Mbështetje e shtuar për kontrollimin e ndërfaqes skllav duke specifikuar "meta sdif" ose "meta sdifname":

    ... meta sdifname vrf1 ...

  • Mbështetje e shtuar për operacionet e ndërrimit djathtas ose majtas. Për shembull, për të zhvendosur një etiketë ekzistuese të paketës majtas me 1 bit dhe për të vendosur bitin e vogël në 1:

    … vendosja e meta markave meta lshift 1 ose 0x1…

  • Opsioni i implementuar "-V" për të shfaqur informacionin e versionit të zgjeruar.

    # nft -V
    nftables v0.9.4 (Jive at Five)
    kli: linja e leximit
    json: po
    minigmp: jo
    libxtables: po

  • Opsionet e linjës së komandës tani duhet të specifikohen përpara komandave. Për shembull, ju duhet të specifikoni "nft -a listën e rregullave" dhe ekzekutimi i "nft listset rules -a" do të rezultojë në një gabim.

    Burimi: opennet.ru

Shto një koment