nftables packet filter 0.9.1 release

Pagkatapos ng isang taon ng pag-unlad ipinakita paglabas ng packet filter nftables 0.9.1, na umuunlad bilang kapalit ng mga iptable, ip6table, mga arptable at mga ebtable sa pamamagitan ng pagsasama-sama ng mga interface ng packet filtering para sa IPv4, IPv6, ARP at mga tulay ng network. Kasama sa package ng nftables ang mga bahagi ng packet filter na tumatakbo sa espasyo ng gumagamit, habang ang gawain sa antas ng kernel ay ibinibigay ng subsystem ng nf_tables, na naging bahagi ng kernel ng Linux mula noong inilabas ang 3.13.

Ang antas ng kernel ay nagbibigay lamang ng isang generic na protocol-independent na interface na nagbibigay ng mga pangunahing function para sa pagkuha ng data mula sa mga packet, pagsasagawa ng mga operasyon ng data, at kontrol sa daloy.
Ang filtering logic mismo at protocol-specific na mga humahawak ay pinagsama-sama sa bytecode sa user space, pagkatapos nito ang bytecode na ito ay na-load sa kernel gamit ang Netlink interface at naisakatuparan sa isang espesyal na virtual machine na nakapagpapaalaala sa BPF (Berkeley Packet Filters). Ang diskarte na ito ay nagbibigay-daan sa iyo upang makabuluhang bawasan ang laki ng filtering code na tumatakbo sa antas ng kernel at ilipat ang lahat ng mga function ng mga panuntunan sa pag-parse at lohika para sa pagtatrabaho sa mga protocol sa espasyo ng gumagamit.

Mga pangunahing inobasyon:

  • Suporta sa IPsec, na nagpapahintulot sa pagtutugma ng mga tunnel address batay sa packet, IPsec request ID, at SPI (Security Parameter Index) tag. Halimbawa,

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

    Posible ring suriin kung ang isang ruta ay dumadaan sa isang IPsec tunnel. Halimbawa, upang harangan ang trapiko hindi sa pamamagitan ng IPSec:

    … filter output rt ipsec nawawalang drop

  • Suporta para sa IGMP (Internet Group Management Protocol). Halimbawa, maaari kang gumamit ng panuntunan upang itapon ang mga papasok na kahilingan sa membership ng grupo ng IGMP

    nft add rule netdev foo bar igmp type membership-query counter drop

  • Posibilidad ng paggamit ng mga variable para tukuyin ang mga transition chain (jump / goto). Halimbawa:

    tukuyin ang dest = ber
    magdagdag ng panuntunan ip foo bar jump $dest

  • Suporta para sa mga maskara upang makilala ang mga operating system (OS Fingerprint) batay sa mga halaga ng TTL sa header. Halimbawa, upang markahan ang mga packet batay sa OS ng nagpadala, maaari mong gamitin ang command:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "hindi kilala" : 0x0 }
    ... osf ttl laktawan ang bersyon "Linux:4.20"

  • Kakayahang tumugma sa ARP address ng nagpadala at sa IPv4 address ng target na system. Halimbawa, upang madagdagan ang counter ng mga ARP packet na ipinadala mula sa address na 192.168.2.1, maaari mong gamitin ang sumusunod na panuntunan:

    table arp x {
    chain y {
    uri ng filter hook input priority filter; pagtanggap ng patakaran;
    arp saddr ip 192.168.2.1 counter packet 1 bytes 46
    }
    }

  • Suporta para sa transparent na pagpapasa ng mga kahilingan sa pamamagitan ng proxy (tproxy). Halimbawa, upang i-redirect ang mga tawag sa port 80 sa proxy port 8080:

    talahanayan ip x {
    chain y {
    uri ng filter hook prerouting priority -150; pagtanggap ng patakaran;
    tcp dport 80 tproxy hanggang :8080
    }
    }

  • Suporta para sa pagmamarka ng mga socket na may kakayahang higit pang makuha ang set mark sa pamamagitan ng setsockopt() sa SO_MARK mode. Halimbawa:

    talahanayan inet x {
    chain y {
    uri ng filter hook prerouting priority -150; pagtanggap ng patakaran;
    tcp dport 8080 mark set socket mark
    }
    }

  • Suporta para sa pagtukoy ng mga priyoridad na pangalan ng teksto para sa mga chain. Halimbawa:

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

  • Suporta para sa mga tag ng SELinux (Secmark). Halimbawa, upang tukuyin ang tag na "sshtag" sa isang konteksto ng SELinux, maaari mong patakbuhin ang:

    nft magdagdag ng secmark inet filter sshtag "system_u: object_r: ssh_server_packet_t:s0"

    At pagkatapos ay gamitin ang label na ito sa mga panuntunan:

    nft add rule inet filter input tcp dport 22 meta secmark set β€œsshtag”

    nft magdagdag ng mapa 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

  • Kakayahang tukuyin ang mga port na nakatalaga sa mga protocol sa text form, dahil ang mga ito ay tinukoy sa /etc/services file. Halimbawa:

    nft magdagdag ng panuntunan xy tcp dport "ssh"
    nft list ruleset -l
    talahanayan x {
    chain y {
    ...
    tcp dport "ssh"
    }
    }

  • Kakayahang suriin ang uri ng interface ng network. Halimbawa:

    magdagdag ng panuntunan inet raw prerouting meta iifkind "vrf" tanggapin

  • Pinahusay na suporta para sa dynamic na pag-update ng mga nilalaman ng mga set sa pamamagitan ng tahasang pagtukoy sa "dynamic" na flag. Halimbawa, upang i-update ang set na "s" upang idagdag ang source address at i-reset ang entry kung walang mga packet sa loob ng 30 segundo:

    magdagdag ng talahanayan x
    magdagdag ng set xs { type ipv4_addr; laki 128; timeout 30s; dynamic na mga flag; }
    magdagdag ng chain xy { type filter hook input priority 0; }
    magdagdag ng panuntunan xy update @s { ip saddr }

  • Kakayahang magtakda ng hiwalay na kundisyon ng timeout. Halimbawa, upang i-override ang default na timeout para sa mga packet na dumarating sa port 8888, maaari mong tukuyin ang:

    table ip filter {
    ct timeout aggressive-tcp {
    protocol tcp;
    l3proto ip;
    patakaran = {established: 100, close_wait: 4, close: 4}
    }
    chain output {
    ...
    tcp dport 8888 ct timeout set "agresibo-tcp"
    }
    }

  • Suporta ng NAT para sa inet family:

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

  • Mga pinahusay na kakayahan sa pag-uulat ng error dahil sa mga typo:

    nft magdagdag ng chain filter test

    Error: Walang ganoong file o direktoryo; "filter" ba ang ibig mong sabihin sa family ip?
    magdagdag ng chain filter test
    ^ Pangungulila

  • Kakayahang tukuyin ang mga pangalan ng interface sa mga set:

    itakda ang sc {
    i-type ang inet_service . ifname
    elemento = { "ssh" . "eth0" }
    }

  • Na-update na flowtable rules syntax:

    nft magdagdag ng talahanayan x
    nft magdagdag ng flowtable x ft { hook ingress priority 0; mga device = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Pinahusay na suporta sa JSON.

Pinagmulan: opennet.ru

Magdagdag ng komento