Frontend seperti ufw dan firewalld menutupi kebutuhan sehari-hari, tetapi keduanya tetap penerjemah: begitu kita butuh table nat, kelompok alamat yang dikelola sebagai satu kesatuan, atau sekadar ingin membaca aturan yang sebenarnya ditulis frontend itu, kita harus turun ke bahasa aslinya. Bahasa itu adalah nftables — kerangka filtering resmi kernel yang menggantikan iptables dengan satu biner nft dan satu ruleset untuk IPv4 dan IPv6 sekaligus. Chapter ini membedah strukturnya, menulis ruleset default-deny yang lengkap, lalu membacanya ulang seperti kernel membacanya. Mesin latihan kita tidak memasang nft, jadi ruleset kita tulis persis dalam format yang dibaca nft -f, sementara perintah sungguhan ditampilkan sebagai panduan.

Mengapa iptables Digantikan #

iptables melayani Linux dua dekade, tetapi usianya terlihat dari strukturnya: setiap keluarga protokol punya alat sendiri — iptables untuk IPv4, ip6tables untuk IPv6, ebtables untuk bridge — sehingga aturan yang sama harus ditulis dua kali bila mesin kita melayani kedua dunia. nftables meleburkan semuanya menjadi satu antarmuka. Sejak Debian 10, perintah iptables di keluarga Debian adalah lapisan terjemahan (iptables-nft) yang menulis ke ruleset nftables — begitu pula ufw pada mesin kita (Chapter ufw dan firewalld ).

Aspekiptables klasiknftables
Alat baris perintahsatu alat per keluarga protokolsatu biner nft untuk semuanya
Aturan IPv4 dan IPv6ditulis dua kalisekali saja di family inet
Kelompok alamatsatu aturan per alamatset dan map di dalam satu aturan
Tabelhanya filter, nat, mangle, rawtable bisa dibuat sesuai kebutuhan
Pembaruan aturansatu per satuatomik: seluruh ruleset diganti sekaligus

Anatomi Ruleset: table, chain, rule #

Struktur nftables bertingkat tiga, dan konsepnya sudah kita kenal dari Chapter Firewall . Table menampung aturan untuk satu family alamat — inet berlaku untuk IPv4 dan IPv6 sekaligus. Chain di dalam table mendaftarkan diri ke hook netfilter: input, output, atau forward. Rule di dalam chain dievaluasi berurutan; verdict pertama yang cocok menang, dan bila tidak ada yang cocok, policy chain yang memutus — keputusan cadangan yang dulu kita lihat di kolom kurang iptables -L.

Ruleset Latihan: Default-Deny untuk Server Tunggal #

File berikut tersedia di bundle materi ini sebagai firewall.nft — formatnya sama persis dengan /etc/nftables.conf yang dibaca Debian saat boot:

bash
cat firewall.nft

Output yang Dihasilkan:

text
#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;

        iifname "lo" accept
        ct state established,related accept
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept
        tcp dport 22 accept
    }
}

Aturan di atas berbunyi sebagai berikut:

  1. #!/usr/sbin/nft -f: shebang yang membuat file ruleset bisa dieksekusi langsung.
  2. flush ruleset: membuang ruleset lama sebelum memasang yang baru — sifat atomik: hasil akhir selalu sama, tak menumpuk dengan aturan sebelumnya.
  3. table inet filter: table bernama filter, family inet — aturannya berlaku untuk IPv4 maupun IPv6.
  4. type filter hook input priority filter;: mendaftarkan chain ke hook input netfilter; priority mengatur urutan bila beberapa chain menempel di hook yang sama.
  5. policy drop;: putusan cadangan — paket yang tak cocok rule mana pun dibuang; default-deny cukup satu kata.
  6. iifname "lo" accept: lalu lintas loopback bebas lewat — tanpa itu banyak program lokal rusak.
  7. ct state established,related accept: balasan koneksi yang kita mulai sendiri diterima (connection tracking).
  8. ip protocol icmp accept dan ip6 nexthdr ipv6-icmp accept: ping dan protokol kontrol, ditulis per family karena memang dua protokol berbeda.
  9. tcp dport 22 accept: SSH — satu-satunya pintu yang sengaja kita buka dari luar.

Membaca Ulang Ruleset Sebelum Diterapkan #

Kebiasaan sehat sebelum menerapkan ruleset adalah membacanya ulang — dan grep sudah cukup untuk audit cepat:

bash
echo '== kebijakan cadangan =='
grep 'policy' firewall.nft
echo '== port tujuan yang dibuka =='
grep -oE 'dport [0-9]+' firewall.nft | sort -u
echo '== jumlah aturan accept =='
grep -c 'accept$' firewall.nft

Output yang Dihasilkan:

text
== kebijakan cadangan ==
        type filter hook input priority filter; policy drop;
== port tujuan yang dibuka ==
dport 22
== jumlah aturan accept ==
5

Tiga pertanyaan yang diaudit blok di atas: apakah kebijakan cadangan chain memang drop, port tujuan mana saja yang dibuka (hanya 22), dan berapa banyak aturan pelolos (lima pengecualian di atas kebijakan drop). Audit seperti ini berguna saat meninjau ruleset orang lain: pintu mana yang terbuka terbaca dalam satu perintah.

Menerapkan dan Melihat Hasilnya #

Di sistem sungguhan penerapannya tiga langkah: salin file ke /etc/nftables.conf, jalankan sudo nft -f /etc/nftables.conf, lalu verifikasi dengan sudo nft list ruleset yang mencetak ruleset aktif dalam bentuk kanonik. Agar bertahan setelah reboot, aktifkan dengan sudo systemctl enable nftables.service. Bila kita menyisipkan kata kunci counter sebelum verdict, nft list ruleset juga menampilkan jumlah paket yang melewati setiap aturan. Berikut contoh tampilan ruleset di atas setelah beberapa hari berjalan:

text
table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    iifname "lo" accept
    ct state established,related accept
    ip protocol icmp accept
    ip6 nexthdr ipv6-icmp accept
    tcp dport 22 counter packets 5312 bytes 401873 accept
  }
}

Hidup Berdampingan dengan iptables #

Skrip lama tidak harus dibuang: di Debian modern, iptables adalah terjemahan berjalan di atas nftables, dan ufw memakai jalur itu secara bawaan. Untuk mempelajari padanan sintaksnya, iptables-translate menerjemahkan satu perintah lama ke bahasa nftables. Berikut contoh tampilannya:

console
$ iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT
nft add rule ip filter INPUT tcp dport 80 counter accept

Satu prinsip tetap berlaku: satu pintu kendali per mesin — aturan yang ditulis nft sementara ufw aktif membuat dua lapis aturan saling tidak sadar.

Firewall memutuskan paket mana yang boleh sampai ke proses kita — urusan lapisan jaringan. Lapisan berikutnya bergerak ke dalam mesin: membatasi apa yang boleh dilakukan proses itu sendiri setelah paketnya diterima. Tugas itu dipegang mandatory access control, dan implementasi paling ketatnya adalah SELinux, chapter berikutnya.

Referensi lanjut: wiki nftables untuk quick-reference sintaks, nft(8) untuk referensi lengkap bahasanya, serta wiki Arch Linux tentang nftables untuk contoh ruleset siap pakai.