iptables vs nftables di Ubuntu: Cara Cek Backend
Di Ubuntu, perintah iptables menulis aturan nftables. Verifikasi dengan iptables -V dan nft list ruleset, lalu pahami benturan ufw dan Docker.
iptables vs nftables di Ubuntu: yang mana yang berjalan pada server Anda?
Pada Ubuntu 20.04 dan versi yang lebih baru, perintah iptables adalah front end yang menulis aturan nftables. Hanya ada satu packet filter di kernel, yaitu nftables, dan dua perintah di user space yang memprogramnya. Baris iptables -A INPUT tetap berfungsi seperti sebelumnya, dan aturan yang dibuatnya adalah aturan nftables yang dapat dicetak oleh nft.
Pastikan hal itu pada server Anda sendiri sebelum mempercayainya.
iptables -V
sudo update-alternatives --display iptables
sudo nft list rulesetPada Ubuntu 24.04 (iptables 1.8.10, per Agustus 2026), iptables -V mencetak iptables v1.8.10 (nf_tables). Nama dalam tanda kurung adalah back end. (nf_tables) berarti perintah tersebut berkomunikasi dengan nftables. (legacy) berarti back end x_tables lama, yang masih dirilis Ubuntu sebagai iptables-legacy dan tetap dipertahankan kernel sebagai ruleset yang sepenuhnya terpisah. update-alternatives mencetak symlink di balik pilihan tersebut: link currently points to /usr/sbin/iptables-nft.
Pada VPS baru tanpa firewall yang dikonfigurasi, sudo nft list ruleset tidak mencetak apa pun. Output kosong tersebut menjadi baseline Anda. Tambahkan satu aturan dengan cara lama, lalu periksa lagi.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo nft list ruleset# Warning: table ip filter is managed by iptables-nft, do not touch!
table ip filter {
chain INPUT {
type filter hook input priority filter; policy accept;
tcp dport 22 counter packets 0 bytes 0 accept
}
chain FORWARD {
type filter hook forward priority filter; policy accept;
}
chain OUTPUT {
type filter hook output priority filter; policy accept;
}
}Aturan iptables Anda adalah aturan nftables. iptables-nft menandai tabel yang dibuatnya, dan nft mencetak peringatan tersebut ketika melihat tanda itu, karena mengedit tabel semacam itu dengan nft membuat dua alat mengelola ruleset yang sama. Perhatikan hasil dari satu perintah: sebuah tabel yang tidak Anda beri nama dan chain yang tidak Anda minta. Itulah model lama, dan inilah hal pertama yang berubah ketika Anda menulis nftables secara langsung.
Hal yang disembunyikan iptables -L dari Anda
iptables -L hanya menampilkan tabel filter. Aturan NAT (network address translation) memerlukan iptables -t nat -L, sedangkan aturan mangle memerlukan -t mangle. IPv6 menggunakan perintah terpisah, yaitu ip6tables, dengan salinan masing-masing aturan. Karena itu, sebuah server dapat terlihat bersih dalam satu daftar, sementara sesuatu menjatuhkan atau menulis ulang paket Anda dari tabel yang tidak pernah diperiksa.
sudo nft list ruleset mencetak setiap family, setiap tabel, setiap chain, dan setiap aturan dalam satu keluaran. Pada server yang tidak Anda bangun sendiri, satu perintah tersebut adalah cara tercepat untuk melihat aturan yang benar-benar dimuat. Tambahkan -a untuk mencetak rule handle, yang diperlukan untuk menghapus satu aturan tanpa menghapus seluruh chain.
Ada dua kebiasaan yang sebaiknya diperbaiki saat Anda memeriksa ini. iptables -L menerjemahkan alamat dan port menjadi nama. Pada server dengan resolver yang bermasalah, perintah ini tampak seperti macet. Gunakan iptables -nvL. Pastikan juga back end lama kosong dengan sudo iptables-legacy -nvL, karena jika aturan ada pada kedua back end, kernel mengevaluasi keduanya, dan tidak ada satu pun daftar yang menampilkan keseluruhan kondisi.
Tabel dan chain yang Anda buat, bukan yang diwarisi
nftables dimulai tanpa konfigurasi apa pun. Tidak ada tabel filter sampai Anda membuatnya, dan kata filter hanya merupakan nama yang Anda pilih. Sebuah chain hanya akan memproses paket jika Anda memberinya type, hook, dan priority sehingga menjadi base chain. Chain tanpa atribut tersebut hanya dicapai melalui jump atau goto eksplisit, sehingga tidak menggunakan sumber daya sampai ada aturan yang melompat ke chain tersebut.
Perubahan besar lainnya adalah keluarga inet. Satu tabel inet menangani IPv4 dan IPv6 dengan aturan yang sama. Hal ini menghilangkan kelas bug ketika sebuah port tertutup pada iptables, tetapi terbuka lebar pada ip6tables. Ketidaksesuaian ini cukup umum sehingga memiliki mode kegagalan tersendiri pada server yang menggunakan ufw.
Berikut ruleset server lengkap. Simpan ruleset ini di /etc/nftables.conf.
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set admin_ips {
type ipv4_addr
flags interval
elements = { 203.0.113.5, 198.51.100.0/24 }
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp accept
meta l4proto ipv6-icmp accept
tcp dport 22 ip saddr @admin_ips counter accept
tcp dport { 80, 443 } counter accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}Baca baris 2 dua kali. flush ruleset menghapus semua tabel pada server, termasuk tabel yang dibuat sendiri oleh ufw dan Docker. Lanjutkan membaca sebelum menjalankan perintah ini pada server aktif.
Rule pertama dalam input chain menangani sebagian besar pekerjaan. ct state established,related accept mengizinkan balasan untuk koneksi yang Anda mulai kembali masuk, sehingga chain lainnya hanya perlu memutuskan koneksi baru. ct state invalid drop membuang paket yang tidak cocok dengan koneksi yang dikenal dan bukan awal koneksi yang valid. Semua aturan setelahnya merupakan pengecualian eksplisit, dan policy drop menangani paket lainnya.
Periksa file sebelum memuatnya, dan tetap buka sesi SSH kedua saat melakukannya. policy drop ditambah satu kesalahan ketik pada rule SSH dapat mengunci akses Anda ke server sendiri.
sudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.conf
sudo nft list rulesetnft -c -f mem-parsing file dan melaporkan error tanpa memuat apa pun. Jika parsing berhasil, tidak ada output yang ditampilkan.
Set menggantikan daftar rule yang panjang
tcp dport { 80, 443 } adalah set anonim: satu rule dan satu pencarian, bukan satu rule untuk setiap port. Set bernama seperti admin_ips lebih fleksibel karena dapat diubah saat firewall sedang berjalan.
sudo nft add element inet filter admin_ips { 203.0.113.9 }
sudo nft list set inet filter admin_ips
sudo nft delete element inet filter admin_ips { 203.0.113.9 }Tidak perlu reload atau penomoran ulang rule. Proses pencocokan tetap berupa satu pencarian, baik set berisi lima alamat maupun lima puluh ribu alamat. flags interval memungkinkan set menyimpan rentang dan prefix CIDR (classless inter-domain routing) seperti 198.51.100.0/24. Tanpa flag tersebut, set hanya menerima alamat tunggal dan pemuatan prefix akan gagal.
Set juga dapat membuat elemennya kedaluwarsa secara otomatis.
set banned {
type ipv4_addr
flags timeout
timeout 1h
}Dengan rule ip saddr @banned drop, setiap elemen menghapus dirinya sendiri satu jam setelah ditambahkan. Inilah cara action nftables pada fail2ban di Ubuntu 24.04 memblokir alamat: action tersebut menambahkan elemen ke dalam set, bukan menambahkan rule. Jika konsep port masih baru bagi Anda, mulai dengan apa sebenarnya port di Linux.
Satu perbedaan sering menimbulkan masalah saat migrasi. nftables tidak menghitung paket kecuali Anda memintanya. iptables -nvL selalu menampilkan counter untuk setiap rule. Pada nftables, hanya rule yang memiliki keyword counter yang memiliki nomor. Karena itu, tambahkan counter ke setiap rule yang mungkin perlu Anda debug nanti.
Cara hook dan priority menentukan urutan
Base chain menetapkan hook, yaitu titik pada jalur paket tempat chain tersebut dijalankan. prerouting berjalan sebelum keputusan routing. input berjalan untuk paket yang ditujukan ke mesin ini. forward berjalan untuk paket yang dirutekan melalui mesin ini. output berjalan untuk paket dari proses lokal. postrouting berjalan terakhir, tepat sebelum paket keluar.
Priority mengatur urutan chain di dalam satu hook, dimulai dari angka terendah. nftables memberikan nama pada nilai klasik berikut: raw adalah -300, mangle adalah -150, dstnat adalah -100, filter adalah 0, dan srcnat adalah 100. Menulis priority filter; sama dengan menulis priority 0;.
Bagian berikut menentukan apakah pencampuran tool dapat berjalan. Setiap base chain yang terdaftar pada sebuah hook dijalankan sesuai urutan priority. Paket yang diterima oleh chain Anda belum selesai diproses: accept hanya mengakhiri chain tersebut, dan paket melanjutkan proses ke base chain berikutnya pada hook yang sama. drop bersifat final di semua tempat dan langsung menghentikan paket. Jadi, rule permisif pada table Anda tidak dapat membatalkan drop pada table ufw, terlepas dari chain mana yang berjalan lebih dahulu. accept juga tidak melindungi Anda dari chain yang berjalan kemudian.
Dua base chain pada hook yang sama dengan priority yang sama dijalankan berdasarkan urutan pendaftaran. Urutan ini bergantung pada service yang berjalan lebih dahulu. Urutan tersebut dapat berubah setelah reboot. Jika Anda harus menjalankan table sendiri bersama ufw, gunakan priority yang berbeda agar urutannya ditetapkan secara eksplisit, bukan ditentukan oleh perlombaan waktu startup.
Mengapa tidak ada aturan reverse NAT yang perlu ditulis?
Ini adalah pertanyaan yang paling sering dijawab keliru. Berikut jawaban langsungnya. Connection tracking menulis translasi balik untuk Anda. Tidak ada aturan kedua yang perlu ditambahkan.
Tabel nat yang menjalankan kedua bagian tugas VPS pada umumnya terlihat seperti ini.
table inet nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname "enp1s0" tcp dport 8080 dnat ip to 10.0.0.5:80
}
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 10.0.0.0/24 oifname "enp1s0" masquerade
}
}Hanya paket pertama dari suatu koneksi yang dievaluasi terhadap chain nat. Saat sebuah aturan cocok, kernel menyimpan translasi tersebut di tabel connection tracking bersama entri koneksinya. Setiap paket berikutnya, pada kedua arah, ditulis ulang berdasarkan entri yang tersimpan, dan tidak ada aturan yang dibaca kembali. Instal tool conntrack, lalu lihat entri yang sedang aktif.
sudo apt install -y conntrack
sudo conntrack -L -p tcptcp 6 431999 ESTABLISHED src=198.51.100.20 dst=203.0.113.10 sport=54321 dport=8080 src=10.0.0.5 dst=198.51.100.20 sport=80 dport=54321 [ASSURED] mark=0 use=1Baca entri tersebut sebagai dua tuple. Empat field pertama adalah koneksi sebagaimana dikirim oleh client, yang ditujukan ke 203.0.113.10:8080, yaitu alamat publik Anda. Empat field berikutnya adalah reply yang diharapkan kernel, yang sudah dibalik dan sudah ditranslasikan, berasal dari 10.0.0.5:80, yaitu backend sebenarnya. Tuple kedua tersebut adalah aturan reverse. Kernel menulisnya saat paket pertama cocok dengan aturan.
Jadi, jangan menulis aturan untuk arah return. Aturan tersebut tidak dapat cocok karena paket return merupakan bagian dari koneksi yang sudah established dan tidak pernah mencapai chain nat. Jika entah bagaimana aturan itu tetap diproses, Anda akan mentranslasikan paket yang sudah diperbaiki oleh kernel.
Lokasi rewrite ditentukan oleh mekanisme yang sama. Translasi destination harus berjalan pada prerouting, sebelum keputusan routing, karena routing harus melihat destination baru. Jika tidak, paket akan dikirim ke tempat yang salah. Trafik yang dihasilkan oleh host itu sendiri ditangani pada hook output untuk alasan yang sama. Translasi source, termasuk rewrite port source, harus berjalan pada postrouting, setelah routing memilih interface outgoing. masquerade mengambil alamatnya dari interface tersebut, sedangkan interface itu belum diketahui sampai routing berjalan.
Itulah sebabnya aturan seperti ini harus ditempatkan di akhir jalur dan tidak di tempat lain.
ip saddr 10.0.0.0/24 oifname "enp1s0" snat ip to 203.0.113.10:20000-30000Rentang port tersebut menulis ulang port source bersama alamat source. Ini diperlukan ketika banyak client internal menggunakan satu alamat publik dan port source mereka bertabrakan. Reply tiba dengan tujuan port dalam rentang tersebut. conntrack mencocokkannya dengan entri yang sesuai, lalu port source asli dikembalikan sebelum paket dikirimkan. Sekali lagi, tidak ada aturan kedua.
Konsekuensi praktisnya adalah perubahan aturan NAT tidak memindahkan koneksi yang sudah ada karena translasi koneksi tersebut sudah tersimpan. Koneksi itu tetap menggunakan perilaku lama sampai entrinya kedaluwarsa. sudo conntrack -D -p tcp --dport 8080 menghapus entri yang cocok, sedangkan sudo conntrack -F menghapus semuanya. Gunakan perintah kedua dengan hati-hati pada NAT box karena translasi yang tersimpan tersebut menjaga koneksi saat ini tetap berjalan. Menghapus semuanya akan memutus semua koneksi melalui box tersebut sekaligus.
ufw dan Docker sama-sama menulis rule sendiri
ufw adalah front end untuk iptables, yang pada Ubuntu merupakan front end untuk nftables. Karena itu, server yang menggunakan ufw memiliki tabel ip filter yang berisi banyak chain bernama ufw-before-input, ufw-user-input, dan seterusnya, serta salinan ip6 filter dengan struktur yang sama. Periksa dengan sudo nft list ruleset | grep ufw. Chain tersebut dibuat dari file dalam /etc/ufw, dan ufw reload menulis ulang semuanya dari awal. Karena itu, rule iptables yang ditambahkan secara manual akan hilang saat reload berikutnya. Dasar-dasar ufw untuk VPS menjelaskan struktur file tersebut.
Docker memprogram firewall secara langsung dan tidak menggunakan ufw. Saat port dipublikasikan dengan -p 80:80, Docker menulis rule DNAT ke dalam tabel nat dan rule accept pada jalur forward. Keduanya dijalankan sebelum chain pengguna ufw. Akibatnya sering mengejutkan: ufw deny 80 telah dimuat, tetapi container masih dapat diakses dari Internet. Perbaikannya ada pada chain DOCKER-USER yang disediakan Docker untuk rule Anda, dan alasan container Docker mengabaikan ufw menjelaskannya secara bertahap. Lihat isi server Anda dengan sudo nft list ruleset | grep -i docker.
Sekarang baca kembali baris flush ruleset dari konfigurasi di atas. Baris tersebut menghapus semua tabel, termasuk tabel yang dikelola kedua tool itu. Pada host Docker, port yang dipublikasikan berhenti berfungsi sampai sudo systemctl restart docker membangun ulang chain tersebut. Satu baris itu merupakan penyebab paling umum layanan sendiri tidak dapat diakses ketika orang merapikan konfigurasi firewall.
Aturan yang tetap berlaku setelah reboot
Tidak ada ruleset yang persisten dengan sendirinya. Kernel menghapus seluruh konfigurasi saat shutdown, dan masing-masing sisi mengatasinya dengan paket terpisah.
Untuk nftables, /etc/nftables.conf dibaca oleh nftables.service. Ubuntu menyediakan service tersebut dalam keadaan nonaktif, jadi periksa statusnya sebelum mengandalkannya.
systemctl is-enabled nftables
sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftablesUntuk iptables, paketnya adalah iptables-persistent. Paket ini memasang netfilter-persistent dan menyimpan konfigurasi ke /etc/iptables/rules.v4 serta /etc/iptables/rules.v6.
sudo apt install -y iptables-persistent
sudo netfilter-persistent saveJangan jalankan keduanya. Dua file yang masing-masing mengklaim sebagai tempat penyimpanan firewall akan tidak sinkron. Aturan yang dimuat terakhir akan berlaku, dan hal ini tidak dapat dipastikan hanya dengan membaca salah satu file.
Ada jebakan terkait saat mengekspor ruleset yang sedang aktif. sudo nft -s list ruleset > /etc/nftables.conf mengambil semua konfigurasi yang dimuat saat itu, termasuk tabel milik ufw dan Docker. Jika konfigurasi tersebut dipulihkan saat boot, Anda akan mendapatkan salinan beku dari aturan yang seharusnya dibuat sendiri oleh tool tersebut, lalu salinan kedua setelah tool tersebut berjalan. Ekspor hanya tabel milik Anda dengan sudo nft -s list table inet filter. Flag -s menghilangkan counter, karena counter tidak termasuk dalam file konfigurasi.
Aktifkan firewall pada VPS?
Jangan mengubah konfigurasi ufw kecuali Anda memerlukan sesuatu yang tidak dapat dinyatakannya. ufw mencukupi kebutuhan VPS biasa: menolak koneksi secara default dengan beberapa port yang dibuka. Menggantinya dengan ruleset yang ditulis manual tanpa alasan yang jelas hanya memberi Anda firewall yang sama, ditambah satu hal lagi yang harus dipelihara.
Gunakan konfigurasi native jika kebutuhan Anda berada di luar model ufw: NAT dan port forwarding, set yang diperbarui saat runtime, satu aturan yang mencakup kedua address family, atau prioritas chain yang Anda tentukan sendiri. Semua itu adalah alasan yang valid, dan ufw tidak dapat menyediakannya.
Jika menggunakan konfigurasi native, gunakan sepenuhnya. Jalankan sudo ufw disable dan sudo systemctl disable --now ufw, pastikan dengan sudo nft list ruleset bahwa table milik ufw sudah dihapus, lalu muat file Anda sendiri. Server yang menjalankan ufw dan table yang ditulis manual secara bersamaan tetap dapat meneruskan traffic, tetapi kebijakan aktif sekarang merupakan gabungan dua ruleset yang dievaluasi dalam urutan yang ditentukan saat service dijalankan. Tidak ada orang yang hanya membaca salah satu file tersebut yang dapat mengetahui perilaku server sebenarnya.
Memigrasikan ruleset iptables yang sudah ada
iptables-translate mengonversi satu rule dan menampilkan bentuk nftables-nya. Perintah ini tidak mengubah apa pun pada server.
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPTnft add rule ip filter INPUT tcp dport 22 counter acceptiptables-restore-translate -f /etc/iptables/rules.v4 melakukan hal yang sama untuk seluruh ruleset yang disimpan. Anggap hasilnya sebagai draf awal. Konversi ini bersifat mekanis dan dilakukan satu rule demi satu rule. Karena itu, Anda akan mendapatkan kembali nama table dan chain lama, dua ruleset terpisah untuk IPv4 dan IPv6, serta tidak mendapatkan set apa pun yang menjadi alasan utama migrasi. Tulis ulang hasilnya secara manual sebagai satu table inet, lalu periksa dengan nft -c -f sebelum menerapkannya pada server produksi.
Alamat dalam contoh ini berasal dari rentang dokumentasi 203.0.113.0/24 dan 198.51.100.0/24, sedangkan enp1s0 adalah nama interface. Gunakan nilai dari ip route show default dan ip -br addr di sistem Anda, bukan menyalin contoh ini, karena image Ubuntu saat ini jarang menamai interface apa pun sebagai eth0.
FAQ
Apakah iptables sudah tidak digunakan lagi di Ubuntu?
Perintah tersebut tidak dihapus dan masih berfungsi di Ubuntu 24.04. Perubahan terjadi pada cara kerjanya di balik layar: iptables adalah front end yang menulis aturan nftables melalui back end iptables-nft. Periksa konfigurasi Anda dengan iptables -V. Perintah tersebut menampilkan iptables v1.8.10 (nf_tables) pada 24.04. Back end x_tables yang lama masih disediakan sebagai iptables-legacy. Back end ini memiliki ruleset yang sepenuhnya terpisah. Karena itu, masukkan aturan ke salah satu back end saja, bukan ke keduanya.
Apakah saya memerlukan aturan kedua untuk membatalkan NAT saat paket kembali?
Tidak. Connection tracking menyimpan translasi saat paket pertama dalam suatu koneksi cocok dengan aturan nat. Setiap paket berikutnya pada kedua arah akan ditulis ulang berdasarkan entri yang tersimpan tersebut. sudo conntrack -L menampilkannya sebagai dua tuple untuk setiap koneksi: arah asli, lalu balasan yang sudah dibalik. Aturan untuk arah balik tidak dapat membantu karena paket balasan tidak pernah mencapai rantai nat.
Apakah saya dapat menjalankan ufw dan aturan nftables sendiri secara bersamaan?
Bisa, tetapi hal itu menimbulkan masalah. Setiap base chain pada suatu hook akan dijalankan. Karena itu, kebijakan aktif merupakan gabungan kedua ruleset tersebut, yang diurutkan berdasarkan priority dan, jika priority sama, berdasarkan service yang lebih dahulu berjalan. drop pada salah satunya bersifat final. accept pada aturan Anda tidak mencegah aturan lain menjatuhkan paket yang sama. Pilih satu tool. Jika memilih nftables, nonaktifkan ufw terlebih dahulu dan pastikan tabelnya sudah tidak ada menggunakan sudo nft list ruleset.
Bagaimana cara membuat aturan nftables tetap berlaku setelah reboot di Ubuntu?
Simpan ruleset di /etc/nftables.conf, periksa dengan sudo nft -c -f /etc/nftables.conf, lalu jalankan sudo systemctl enable --now nftables. Service ini tidak diaktifkan secara default. Karena itu, jalankan systemctl is-enabled nftables sekali. Saat membuat file tersebut, dump hanya tabel milik Anda menggunakan sudo nft -s list table inet filter. Dump list ruleset lengkap juga menangkap tabel yang dikelola ufw dan Docker untuk keperluan masing-masing.