Nftables — Penerus iptables yang Wajib Dikuasai untuk Server Gateway Modern
Di artikel server sebagai router, aku sempat menyebut nftables sebagai tulang punggung firewall dan NAT. Di artikel DNS poisoning, aku kasih contoh aturan nftables untuk redirect port 53 dan blokir DoH. Tapi rasanya dua artikel itu belum cukup memberi panggung yang layak buat nftables — padahal ini adalah tools yang menurutku paling powerful di ekosistem Linux networking saat ini.
Artikel ini akan jadi panduan praktis nftables dari sudut pandang server gateway — bukan sekadar teori, tapi aturan-aturan yang benar-benar kupakai sehari-hari di server rumah. Buat yang udah baca dua artikel sebelumnya, ini adalah missing piece yang menyatukan semuanya.
Kenapa nftables, Bukan iptables?
iptables sudah menemani administrator Linux selama lebih dari 20 tahun. Tapi dia punya tiga kelemahan fundamental yang membuatnya sakit untuk dipakai di skala modern:
- Linear processing — setiap paket diperiksa aturan demi aturan secara berurutan. Di iptables, kalau punya 100 aturan di chain FORWARD, paket harus diuji 100 kali sebelum sampai ke aturan terakhir. nftables pakai set hashing dan maps yang membuat lookup O(1) — konstan, tidak peduli 10 atau 10.000 aturan.
- Dua tools terpisah — iptables untuk IPv4, ip6tables untuk IPv6, arptables untuk ARP, ebtables untuk bridge. Masing-masing punya sintaks berbeda. nftables menangani semuanya dalam satu tool:
nft. - Sintaks verbose dan mudah salah — iptables mengharuskan flag seperti
-A,-I,-s,-d,--dportyang urutannya rigid. nftables punya sintaks yang lebih deklaratif dan konsisten.
Tapi kelebihan nftables yang paling aku rasakan adalah atomic rule replacement. Di iptables, kalau ingin membersihkan semua aturan dan mulai dari awal, harus flush satu per satu — dan selama proses flush itu, firewall dalam keadaan kosong (tidak aman). nftables bisa update seluruh ruleset dalam satu operasi atomik menggunakan nft -f ruleset.nft. Tidak ada jeda di mana firewall tidak punya aturan.
Konsep Dasar nftables
Sebelum masuk ke aturan praktis, penting paham tiga level hierarki nftables:
- Tables — wadah untuk chains. Setiap table punya family (ip, ip6, inet, arp, bridge, netdev). Untuk server gateway, kita cukup pakai
inetyang menangani IPv4 dan IPv6 sekaligus. - Chains — urutan aturan. Ada base chains (terikat hook: prerouting, input, forward, output, postrouting) dan regular chains (panggilan dari aturan lain, seperti function call).
- Rules — berisi expressions (kondisi) dan verdicts (tindakan: accept, drop, reject, jump, goto, return, continue).
Ini contoh table dan chain minimal untuk gateway:
table inet gateway {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
tcp dport {22, 80, 443} accept
}
chain forward {
type filter hook forward priority 0; policy drop;
ip saddr 192.168.1.0/24 accept
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oif eth0 masquerade
}
}
Perhatikan: policy drop di chain input dan forward. Ini default deny — hanya traffic yang eksplisit diizinkan yang bisa lewat. Prinsip keamanan paling fundamental yang sayangnya jarang diterapkan di router rumahan.
1. NAT Masquerade — Jantung Server Gateway
Di artikel server sebagai router, ini adalah aturan paling penting. Tanpa ini, device di jaringan lokal tidak bisa internetan karena server tidak meneruskan paket mereka ke internet.
table inet nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "eth0" masquerade
}
}
masquerade secara otomatis mengganti source address setiap paket yang keluar lewat eth0 dengan IP server. Ketika respon balik, nftables mengembalikan alamat asli device di jaringan lokal. Semua device di belakang server bisa internetan tanpa konfigurasi tambahan.
Bandingkan dengan iptables:
# iptables — verbose, dua aturan terpisah untuk IPv4 dan IPv6 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
nftables menangani IPv4 dan IPv6 dalam satu baris dengan family inet. Lebih bersih, lebih sedikit yang bisa salah.
2. Port Forwarding — Akses Layanan dari Luar
Kadang kita ingin service di dalam jaringan lokal bisa diakses dari internet — misalnya server web di IP 192.168.1.10:80. Di nftables, ini disebut destination NAT (dstnat) dan dilakukan di chain prerouting:
table inet nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
tcp dport 80 dnat to 192.168.1.10:80
tcp dport 443 dnat to 192.168.1.10:443
}
chain forward {
type filter hook forward priority 0; policy drop;
# Izinkan traffic ke server internal
tcp dport {80, 443} ip daddr 192.168.1.10 ct state new accept
}
}
Perhatikan: selain dnat di prerouting, kita juga perlu aturan di chain forward untuk mengizinkan traffic menuju IP internal tersebut. Banyak yang lupa ini dan heran kenapa port forwarding tidak bekerja — padahal paket sudah di-NAT, tapi di-drop oleh chain forward.
3. DNS Control — Redirect dan Blokir DoH
Ini aturan yang kubahas di artikel DNS poisoning — cara memaksa semua perangkat di jaringan menggunakan DNS server lokal:
table inet dns-control {
chain prerouting {
type nat hook prerouting priority -100; policy accept;
# Redirect semua DNS ke DNSMasq lokal (192.168.1.2)
udp dport 53 dnat to 192.168.1.2:53
tcp dport 53 dnat to 192.168.1.2:53
}
chain forward {
type filter hook forward priority 0; policy accept;
# Blokir DoH ke provider publik
tcp dport 443 ip daddr {1.1.1.0/24, 8.8.8.0/24, 9.9.9.0/24} drop
}
}
Bedanya dengan versi di artikel DNS poisoning: di sini aku gunakan set literal {1.1.1.0/24, 8.8.8.0/24, 9.9.9.0/24}. nftables mengubah set ini menjadi hash table di kernel — lookup O(1), tidak peduli berapa banyak IP dalam set. Di iptables, setiap IP butuh aturan terpisah yang diperiksa satu per satu.
4. Bandwidth Limiting per Device — Interval dan Burst
Salah satu fitur yang paling kusuka dari server gateway adalah bisa membatasi bandwidth per device. Di nftables, ini dilakukan dengan meters atau quotas:
table inet bandwidth {
chain forward {
type filter hook forward priority 0; policy accept;
# Batasi device 192.168.1.50 maksimal 10MB per 6 jam
ip saddr 192.168.1.50 quota over 10 mbytes until 6h drop
ip saddr 192.168.1.51 quota over 50 mbytes until 12h drop
}
}
Aturan di atas akan melacak jumlah data yang dikirim oleh device tertentu. Ketika melebihi kuota, paket berikutnya akan di-drop sampai periode kuota reset. Berguna banget buat digital boundaries — kasih jatah internet anak 10MB per 6 jam, setelah itu harus nunggu reset.
Tapi ini kuota sederhana. Untuk rate limiting (membatasi kecepatan, bukan jumlah), nftables punya limit:
# Batasi kecepatan download device: maksimal 1MB/s dengan burst 2MB ip saddr 192.168.1.50 limit rate 1 mbytes/second burst 2 mbytes accept ip saddr 192.168.1.50 drop
Aturan pertama mengizinkan paket selama masih dalam batas rate. Aturan kedua menjatuhkan paket yang melampaui batas. Efeknya: device tersebut maksimal download 1MB/s, dengan burst 2MB untuk kompensasi fluktuasi.
5. Connection Tracking — Biarkan Koneksi yang Sudah Jalan
Aturan yang paling sering dilupakan pemula adalah connection tracking. Tanpa ini, setiap paket dalam satu koneksi TCP harus melewati semua aturan firewall — tidak efisien.
chain forward {
type filter hook forward priority 0; policy drop;
# Izinkan koneksi yang sudah established
ct state established,related accept
# Hanya koneksi baru yang diperiksa
ct state invalid drop
ip saddr 192.168.1.0/24 accept
}
Aturan ct state established,related accept ada di baris pertama. Artinya, setelah koneksi awal diizinkan, paket-paket berikutnya dalam koneksi yang sama (termasuk paket balasan dari internet) langsung di-accept tanpa diperiksa lagi. Ini menghemat CPU dan mempercepat throughput secara signifikan.
6. Logging — Melihat yang Tidak Bisa Dilihat
nftables punya fitur logging yang terintegrasi — bukan sekadar log accept/drop, tapi bisa mencatat metadata paket yang detail:
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
# Log semua koneksi baru yang mencoba keluar
ip saddr 192.168.1.0/24 ct state new log prefix "FWD:NEW: " accept
# Log paket aneh yang di-drop
log prefix "FWD:DROP: " drop
}
Dengan log prefix, setiap baris log bisa diidentifikasi asalnya. Di /var/log/kern.log, akan muncul entri seperti:
kernel: FWD:NEW: IN=eth1 OUT=eth0 SRC=192.168.1.50 DST=203.0.113.5 PROTO=TCP SPT=45123 DPT=443
Untuk server gateway, log ini sangat berguna untuk:
- Mendeteksi device yang mencoba akses domain/IP mencurigakan
- Memverifikasi bahwa aturan firewall bekerja sesuai yang diharapkan
- Debugging koneksi yang tidak bisa internetan — apakah di-drop firewall atau masalah lain?
7. Advanced: Named Sets untuk Manajemen Mudah
Ini fitur yang membuat nftables benar-benar unggul dari iptables: named sets. Daripada menulis IP satu per satu di aturan, kita buat set yang bisa diisi/dikosongkan tanpa perlu reload seluruh ruleset:
table inet filter {
set blocked-ips {
type ipv4_addr
flags interval
auto-merge
}
set blocked-domains {
type ipv4_addr
flags interval
}
chain forward {
type filter hook forward priority 0; policy accept;
ip saddr @blocked-ips drop
ip daddr @blocked-domains drop
}
}
# Isi set (bisa kapan saja, tanpa reload)
nft add element inet filter blocked-ips { 192.168.1.50, 192.168.1.51 }
nft add element inet filter blocked-domains { 203.0.113.0/24 }
Keuntungannya: kita bisa menambah/menghapus IP dari set dengan satu perintah nft add element atau nft delete element. Tidak perlu rewrite seluruh ruleset. Cocok banget diintegrasikan dengan dashboard monitoring seperti yang kubahas di artikel server sebagai router — cukup satu endpoint API yang manggil nft add element untuk memblokir device dari dashboard.
8. Advanced: Maps untuk Selective Routing
Maps di nftables memungkinkan kita melakukan tindakan berbeda berdasarkan kondisi — semacam switch-case di kernel:
table inet nat {
map port-forward {
type inet_service : dnat_addr
elements = {
80 : 192.168.1.10,
443 : 192.168.1.10,
22 : 192.168.1.20,
32400 : 192.168.1.30,
}
}
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
tcp dport vmap @port-forward dnat to :tcp dport
}
}
Map ini mendefinisikan port berapa yang diarahkan ke IP mana. Ketika ada koneksi ke port 80, nftables langsung lookup ke map dan dnat ke IP yang sesuai — O(1), tanpa perlu aturan bertumpuk. Mau nambah port forwarding? Tinggal tambah elemen di map. Mau hapus? Tinggal hapus elemen. Tidak perlu sentuh aturan utama.
Performa: nftables vs iptables di Dunia Nyata
Aku pernah menjalankan tes sederhana di server yang sama — Debian 12, kernel 6.1, CPU Intel Celeron N3350. Dengan 50 aturan blocking IP di iptables, throughput turun dari 940 Mbps menjadi sekitar 720 Mbps. Dengan aturan yang sama di nftables menggunakan set, throughput tetap di 930+ Mbps.
Penyebabnya: iptables memeriksa setiap aturan secara linear. Setiap paket harus melewati 50 aturan. nftables dengan set hash cukup melakukan satu lookup — O(1). Semakin banyak aturan, semakin besar selisihnya.
Di server gateway rumahan dengan bandwidth 100-500 Mbps, mungkin selisih ini tidak terasa. Tapi untuk yang punya koneksi gigabit atau ribuan aturan blocking, perbedaannya sangat signifikan.
Kesimpulan
nftables bukan sekadar pengganti iptables — ia adalah lompatan konseptual dalam cara kita mengelola firewall di Linux. Dengan sintaks yang lebih bersih, performa yang lebih baik, dan fitur seperti named sets, maps, dan quota, nftables memberikan kontrol penuh atas traffic jaringan dengan cara yang sebelumnya tidak mungkin dilakukan iptables tanpa script yang rumit.
Kalau kamu sudah membaca artikel server sebagai router dan DNS poisoning, sekarang kamu punya satu lagi senjata di gudang: nftables sebagai otot yang mengeksekusi aturan firewall, NAT, dan filtering dengan kecepatan kernel-native. DNSMasq sebagai otak yang menentukan kemanakah sebuah domain harus diarahkan. Dan nftables sebagai tangan yang memastikan hanya traffic yang sah yang bisa lewat.
Kombinasi DNSMasq + nftables + server gateway adalah fondasi infrastruktur jaringan rumahan yang tangguh, murah, dan — yang paling penting — kamu yang pegang kendali penuh.
Untuk referensi lengkap, man nft di terminal adalah sahabat terbaik. Atau kunjungi wiki.nftables.org untuk dokumentasi resmi.