keluaran penapis paket nftables 0.9.1

Selepas setahun pembangunan dibentangkan pelepasan penapis paket nftables 0.9.1, membangun sebagai pengganti untuk iptables, ip6table, arptables dan ebtables dengan menyatukan antara muka penapisan paket untuk IPv4, IPv6, ARP dan jambatan rangkaian. Pakej nftables termasuk komponen penapis paket yang dijalankan dalam ruang pengguna, manakala kerja peringkat kernel disediakan oleh subsistem nf_tables, yang telah menjadi sebahagian daripada kernel Linux sejak keluaran 3.13.

Tahap kernel hanya menyediakan antara muka bebas protokol generik yang menyediakan fungsi asas untuk mengekstrak data daripada paket, melaksanakan operasi data dan kawalan aliran.
Logik penapisan itu sendiri dan pengendali khusus protokol disusun menjadi kod bait dalam ruang pengguna, selepas itu kod bait ini dimuatkan ke dalam kernel menggunakan antara muka Netlink dan dilaksanakan dalam mesin maya khas yang mengingatkan BPF (Penapis Paket Berkeley). Pendekatan ini membolehkan anda mengurangkan dengan ketara saiz kod penapisan yang berjalan pada peringkat kernel dan memindahkan semua fungsi peraturan dan logik penghuraian untuk bekerja dengan protokol ke dalam ruang pengguna.

Inovasi utama:

  • Sokongan IPsec, membenarkan pemadanan alamat terowong berdasarkan paket, ID permintaan IPsec dan teg SPI (Indeks Parameter Keselamatan). Sebagai contoh,

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

    Anda juga boleh menyemak sama ada laluan melalui terowong IPsec. Sebagai contoh, untuk menyekat lalu lintas bukan melalui IPSec:

    … keluaran penapis rt ipsec kejatuhan hilang

  • Sokongan untuk IGMP (Internet Group Management Protocol). Sebagai contoh, anda boleh menggunakan peraturan untuk membuang permintaan keahlian kumpulan IGMP yang masuk

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

  • Kemungkinan menggunakan pembolehubah untuk menentukan rantai peralihan (lompat / goto). Sebagai contoh:

    takrifkan tujuan = ber
    tambah peraturan ip foo bar lompat $dest

  • Sokongan untuk topeng untuk mengenal pasti sistem pengendalian (OS Fingerprint) berdasarkan nilai TTL dalam pengepala. Sebagai contoh, untuk menandakan paket berdasarkan OS penghantar, anda boleh menggunakan arahan:

    ... set tanda meta osf ttl langkau peta nama { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "tidak diketahui" : 0x0 }
    ... osf ttl langkau versi "Linux:4.20"

  • Keupayaan untuk memadankan alamat ARP pengirim dan alamat IPv4 sistem sasaran. Sebagai contoh, untuk meningkatkan kaunter paket ARP yang dihantar dari alamat 192.168.2.1, anda boleh menggunakan peraturan berikut:

    jadual arp x {
    rantai y {
    penapis keutamaan input cangkuk jenis penapis; penerimaan dasar;
    arp saddr ip 192.168.2.1 paket kaunter 1 bait 46
    }
    }

  • Sokongan untuk pemajuan permintaan yang telus melalui proksi (tproxy). Contohnya, untuk mengubah hala panggilan ke port 80 ke port proksi 8080:

    jadual ip x {
    rantai y {
    jenis penapis cangkuk keutamaan pra laluan -150; penerimaan dasar;
    tcp dport 80 tproxy ke :8080
    }
    }

  • Sokongan untuk menanda soket dengan keupayaan untuk mendapatkan lagi tanda set melalui setsockopt() dalam mod SO_MARK. Sebagai contoh:

    jadual inet x {
    rantai y {
    jenis penapis cangkuk keutamaan pra laluan -150; penerimaan dasar;
    tcp dport 8080 tanda set tanda soket
    }
    }

  • Sokongan untuk menentukan nama teks keutamaan untuk rantai. Sebagai contoh:

    nft tambah rantai ip x mentah { taip cangkuk penapis keutamaan pralaluan mentah; }
    nft tambah rantai ip x penapis { taip cangkuk penapis penapis keutamaan pralaluan; }
    nft tambah rantai ip x penapis_kemudian { taip cangkuk penapis penapis keutamaan pralaluan + 10; }

  • Sokongan untuk teg SELinux (Secmark). Sebagai contoh, untuk menentukan teg "sshtag" dalam konteks SELinux, anda boleh menjalankan:

    nft tambah sshtag penapis inet secmark "system_u:object_r:ssh_server_packet_t:s0"

    Dan kemudian gunakan label ini dalam peraturan:

    nft menambah peraturan input penapis inet tcp dport 22 meta secmark set "sshtag"

    nft tambah peta inet penapis secmapping { taip inet_service : secmark; }
    nft menambah elemen penapis inet secmapping { 22 : "sshtag" }
    nft tambah peraturan input penapis inet set penanda detik tcp peta dport @secmapping

  • Keupayaan untuk menentukan port yang diberikan kepada protokol dalam bentuk teks, kerana ia ditakrifkan dalam fail /etc/services. Sebagai contoh:

    nft tambah peraturan xy tcp dport "ssh"
    set peraturan senarai nft -l
    jadual x {
    rantai y {
    ...
    tcp dport "ssh"
    }
    }

  • Keupayaan untuk menyemak jenis antara muka rangkaian. Sebagai contoh:

    tambah peraturan inet mentah prerouting meta iifkind "vrf" terima

  • Sokongan yang dipertingkatkan untuk mengemas kini kandungan set secara dinamik dengan menyatakan bendera "dinamik" secara eksplisit. Contohnya, untuk mengemas kini set "s" untuk menambah alamat sumber dan menetapkan semula entri jika tiada paket selama 30 saat:

    tambah jadual x
    tambah set xs { taip ipv4_addr; saiz 128; tamat masa 30s; bendera dinamik; }
    tambah rantai xy { taip penapis cangkuk keutamaan input 0; }
    tambah peraturan xy kemas kini @s { ip saddr }

  • Keupayaan untuk menetapkan keadaan tamat masa yang berasingan. Sebagai contoh, untuk mengatasi tamat masa lalai untuk paket yang tiba pada port 8888, anda boleh menentukan:

    penapis ip jadual {
    tamat masa ct aggressive-tcp {
    protokol tcp;
    l3proto ip;
    polisi = {ditubuhkan: 100, tutup_tunggu: 4, tutup: 4}
    }
    keluaran rantai {
    ...
    set tamat masa tcp dport 8888 ct "agresif-tcp"
    }
    }

  • Sokongan NAT untuk keluarga inet:

    jadual inet nat {
    ...
    ip6 daddr mati::2::1 dnat kepada mati:2::99
    }

  • Pelaporan ralat taip yang dipertingkatkan:

    ujian penapis rantai nft tambah

    Ralat: Tiada fail atau direktori sedemikian; adakah anda maksudkan "penapis" jadual dalam ip keluarga?
    tambah ujian penapis rantai
    ^^^^^^

  • Keupayaan untuk menentukan nama antara muka dalam set:

    tetapkan sc {
    taip inet_service . ifname
    elemen = { "ssh" . "eth0" }
    }

  • Sintaks peraturan jadual alir yang dikemas kini:

    nft tambah jadual x
    nft tambah jadual alir x ft { keutamaan kemasukan cangkuk 0; peranti = { eth0, wlan0 }; }
    ...
    nft tambah peraturan x ke hadapan protokol ip { tcp, udp } aliran tambah @ft

  • Sokongan JSON yang dipertingkatkan.

Sumber: opennet.ru

Tambah komen