rilis filter paket nftables 0.9.1

Setelah satu tahun pembangunan disajikan pelepasan filter paket tabel nft 0.9.1, berkembang sebagai pengganti iptables, ip6table, arptables, dan ebtables dengan menyatukan antarmuka pemfilteran paket untuk IPv4, IPv6, ARP, dan jembatan jaringan. Paket nftables mencakup komponen filter paket yang berjalan di ruang pengguna, sedangkan pekerjaan tingkat kernel disediakan oleh subsistem nf_tables, yang telah menjadi bagian dari kernel Linux sejak rilis 3.13.

Tingkat kernel hanya menyediakan antarmuka protokol-independen generik yang menyediakan fungsi dasar untuk mengekstraksi data dari paket, melakukan operasi data, dan kontrol aliran.
Logika pemfilteran itu sendiri dan penangan khusus protokol dikompilasi ke dalam bytecode di ruang pengguna, setelah itu bytecode ini dimuat ke dalam kernel menggunakan antarmuka Netlink dan dieksekusi dalam mesin virtual khusus yang mengingatkan pada BPF (Berkeley Packet Filters). Pendekatan ini memungkinkan Anda untuk secara signifikan mengurangi ukuran kode pemfilteran yang berjalan di tingkat kernel dan memindahkan semua fungsi aturan penguraian dan logika untuk bekerja dengan protokol ke dalam ruang pengguna.

Inovasi utama:

  • Dukungan IPsec, memungkinkan pencocokan alamat terowongan berdasarkan paket, ID permintaan IPsec, dan tag SPI (Indeks Parameter Keamanan). Misalnya,

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

    Dimungkinkan juga untuk memeriksa apakah suatu rute melewati terowongan IPsec. Misalnya, untuk memblokir lalu lintas bukan melalui IPSec:

    … keluaran filter rt IPSec hilang

  • Dukungan untuk IGMP (Protokol Manajemen Grup Internet). Misalnya, Anda dapat menggunakan aturan untuk membuang permintaan keanggotaan grup IGMP yang masuk

    nft tambahkan aturan netdev foo bar igmp ketik penghitung permintaan keanggotaan drop

  • Kemungkinan menggunakan variabel untuk menentukan rantai transisi (lompat / goto). Misalnya:

    tentukan tujuan = ber
    tambahkan aturan ip foo bar jump $dest

  • Dukungan masker untuk mengidentifikasi sistem operasi (OS Fingerprint) berdasarkan nilai TTL di header. Misalnya untuk menandai paket berdasarkan OS pengirim, Anda dapat menggunakan perintah:

    ... meta mark set osf ttl lewati nama peta { "Linux" : 0x1,
    "jendela": 0x2,
    "MacOS": 0x3,
    "tidak diketahui" : 0x0 }
    ... osf ttl lewati versi "Linux:4.20"

  • Kemampuan untuk mencocokkan alamat ARP pengirim dan alamat IPv4 dari sistem target. Misalnya, untuk menambah counter paket ARP yang dikirim dari alamat 192.168.2.1, Anda dapat menggunakan aturan berikut:

    tabel arp x {
    rantai kamu {
    ketik filter prioritas masukan kait filter; penerimaan kebijakan;
    arp saddr ip 192.168.2.1 paket penghitung 1 byte 46
    }
    }

  • Dukungan untuk penerusan permintaan secara transparan melalui proxy (tproxy). Misalnya, untuk mengalihkan panggilan ke port 80 ke port proxy 8080:

    tabel ip x {
    rantai kamu {
    ketik prioritas prerouting kait filter -150; penerimaan kebijakan;
    tcp dport 80 tproxy ke :8080
    }
    }

  • Dukungan untuk menandai soket dengan kemampuan untuk mendapatkan tanda yang ditetapkan lebih lanjut melalui setockopt() dalam mode SO_MARK. Misalnya:

    tabel inet x {
    rantai kamu {
    ketik prioritas prerouting kait filter -150; penerimaan kebijakan;
    tcp dport 8080 tanda set tanda soket
    }
    }

  • Dukungan untuk menentukan nama teks prioritas untuk rantai. Misalnya:

    nft tambahkan rantai ip x mentah { ketik filter hook prerouting prioritas mentah; }
    nft tambahkan rantai ip x filter { ketik filter hook prerouting filter prioritas; }
    nft tambahkan rantai ip x filter_later { ketik filter hook prerouting filter prioritas + 10; }

  • Dukungan untuk tag SELinux (Secmark). Misalnya, untuk mendefinisikan tag "sshtag" dalam konteks SELinux, Anda dapat menjalankan:

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

    Dan kemudian gunakan label ini dalam aturan:

    nft tambahkan aturan input filter inet tcp dport 22 meta secmark set β€œsshtag”

    nft tambahkan peta inet filter secmapping { ketik inet_service : secmark; }
    nft menambahkan elemen inet filter secmapping { 22 : "sshtag" }
    nft tambahkan aturan inet filter input meta secmark set tcp dport map @secmapping

  • Kemampuan untuk menentukan port yang ditetapkan ke protokol dalam bentuk teks, seperti yang didefinisikan dalam file /etc/services. Misalnya:

    nft tambahkan aturan xy tcp dport "ssh"
    kumpulan aturan daftar nft -l
    tabel x {
    rantai kamu {
    ...
    tcp dport "ssh"
    }
    }

  • Kemampuan untuk memeriksa jenis antarmuka jaringan. Misalnya:

    tambahkan aturan inet mentah prerouting meta iifkind "vrf" terima

  • Peningkatan dukungan untuk memperbarui konten set secara dinamis dengan secara eksplisit menentukan tanda β€œdinamis”. Misalnya, untuk memperbarui set "s" untuk menambahkan alamat sumber dan mengatur ulang entri jika tidak ada paket selama 30 detik:

    tambahkan tabel x
    tambahkan set xs { ketik ipv4_addr; ukuran 128; batas waktu 30 detik; bendera dinamis; }
    tambahkan rantai xy { ketik filter hook prioritas masukan 0; }
    tambahkan aturan xy perbarui @s { ip saddr }

  • Kemampuan untuk mengatur kondisi batas waktu terpisah. Misalnya, untuk mengganti batas waktu default untuk paket yang tiba pada port 8888, Anda dapat menentukan:

    filter ip tabel {
    ct batas waktu agresif-tcp {
    protokol tcp;
    l3proto ip;
    kebijakan = {ditetapkan: 100, close_wait: 4, close: 4}
    }
    keluaran rantai {
    ...
    tcp dport 8888 ct batas waktu disetel "agresif-tcp"
    }
    }

  • Dukungan NAT untuk keluarga inet:

    tabel inet nat {
    ...
    ip6 daddr mati::2::1 dan mati:2::99
    }

  • Pelaporan kesalahan ketik yang ditingkatkan:

    nft menambahkan tes filter rantai

    Kesalahan: Tidak ada file atau direktori tersebut; maksud Anda tabel "filter" di ip keluarga?
    tambahkan tes filter rantai
    ^^^^^^^^

  • Kemampuan untuk menentukan nama antarmuka dalam set:

    atur sc {
    ketik inet_service . namaif
    elemen = { "ssh" . "eth0" }
    }

  • Sintaks aturan flowtable yang diperbarui:

    nft tambahkan tabel x
    nft tambahkan flowtable x ft { prioritas masuknya kait 0; perangkat = { eth0, wlan0 }; }
    ...
    nft tambahkan aturan x teruskan protokol ip { tcp, udp } aliran tambahkan @ft

  • Dukungan JSON yang ditingkatkan.

Sumber: opennet.ru

Tambah komentar