Membedah anatomi sebuah rule iptables: target ACCEPT DROP REJECT LOG dan user chain, match -s -d -p -i -o --dport --sport, serta cara mengombinasikan banyak match dalam satu aturan untuk membangun kebijakan firewall yang presisi

Setelah di episode 4 kita belajar membaca aturan dan mengelola policy, sekarang waktunya membedah bahan dasar penyusun aturan: target, match, dan parameter. Semua aturan iptables — betapapun rumitnya — tersusun dari kombinasi bagian-bagian yang kita bahas di episode ini.
Struktur satu aturan kira-kira seperti ini: match menentukan "paket seperti apa", target menentukan "apa yang dilakukan terhadapnya". Kalian tidak bisa memahami NAT, rate limiting, atau conntrack tanpa menguasai dua konsep ini. Anggap episode ini sebagai perbendaharaan kata sebelum menulis paragraf panjang.
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPTMari pecah bagian-bagiannya:
| Bagian | Nilai | Arti |
|---|---|---|
| Chain | -A INPUT | Tambah aturan ke chain INPUT |
| Protocol | -p tcp | Hanya paket TCP |
| Source | -s 192.168.1.0/24 | Sumber dalam subnet LAN |
| Destination port | --dport 22 | Port tujuan 22 (SSH) |
| Target | -j ACCEPT | Terima paket yang cocok |
Semua kecuali chain dan target bersifat opsional. Aturan iptables -A INPUT -j DROP — tanpa match apa pun — cocok dengan semua paket yang masuk.
Target menentukan nasib paket yang memenuhi semua match. Empat target inti:
| Target | Perilaku | Kapan dipakai |
|---|---|---|
ACCEPT | Terima paket, hentikan pemeriksaan di chain ini | Buka layanan |
DROP | Buang paket tanpa balasan | Sembunyikan keberadaan server |
REJECT | Buang paket dengan balasan error (mis. TCP RST) | Tolak dengan sopan |
LOG | Catat ke syslog, lanjutkan ke aturan berikutnya | Audit & diagnosis |
Perbedaan DROP vs REJECT adalah perbedaan nyata di lapangan: DROP membuat port tampak mati (client menunggu sampai timeout), sementara REJECT memberi respon cepat (Connection refused). Untuk port yang ingin disembunyikan dari pemindai, DROP lebih disukai; untuk layanan yang memang tidak tersedia, REJECT lebih nyaman bagi klien.
sudo iptables -A INPUT -p tcp --dport 3306 -j REJECT
sudo iptables -A INPUT -j LOG --log-prefix "iptables-in: "Aturan LOG tidak menghentikan paket — target ini unik karena terus berjalan ke aturan berikutnya. Karena itu pola LOG diikuti DROP sangat umum (detail di episode 12).
Match adalah kondisi yang harus dipenuhi. iptables menyediakan banyak extension match, dan yang paling dasar:
sudo iptables -A INPUT -s 203.0.113.5 -j DROP
sudo iptables -A INPUT -d 192.168.1.1 -j ACCEPT-s membatasi berdasarkan alamat sumber; -d berdasarkan alamat tujuan. Nilai bisa berupa IP tunggal atau CIDR (192.168.1.0/24).
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT-p menerima tcp, udp, icmp, atau nomor protokol. --dport dan --sport memfilter port tujuan dan sumber — dan hanya bermakna untuk protokol yang punya port (TCP/UDP).
sudo iptables -A INPUT -i eth0 -j ACCEPT
sudo iptables -A FORWARD -o eth1 -j DROP-i memfilter interface asal paket (hanya valid di PREROUTING/INPUT/FORWARD), -o memfilter interface keluar (hanya valid di OUTPUT/FORWARD/POSTROUTING).
Kekuatan iptables muncul saat match digabung — semua kondisi harus terpenuhi (logika AND):
sudo iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPTAturan di atas hanya menerima SSH yang masuk lewat eth0, dari subnet 192.168.1.0/24, ke port 22. SSH dari interface lain atau dari IP di luar subnet tidak cocok — dan akan jatuh ke policy chain.
Note
Kebalikan dari -s/-i adalah negasi dengan !, misalnya -s ! 192.168.1.0/24 atau -i ! eth0. Kombinasi "kecuali" ini sangat berguna untuk deny-list — tetapi pakai dengan hati-hati karena negasi adalah sumber umum aturan yang tidak berperilaku seperti yang dibayangkan.
Selain target built-in, aturan bisa melompat ke chain yang kita buat sendiri — semacam "subroutine" untuk menata ruleset kompleks:
sudo iptables -N WEB
sudo iptables -A WEB -p tcp --dport 80 -j ACCEPT
sudo iptables -A WEB -p tcp --dport 443 -j ACCEPT
sudo iptables -A WEB -j RETURN
sudo iptables -A INPUT -i eth0 -j WEBPaket yang masuk ke chain WEB dan tidak cocok dengan baris mana pun akan RETURN kembali ke chain INPUT. Chain user-defined adalah fondasi ruleset produksi yang rapi — kita kembangkan di episode 17.
Beberapa kesalahan paling sering di episode ini:
--dport tanpa -p tcp/-p udp — error FATAL: module not found atau aturan tidak pernah cocok.-i dipakai di OUTPUT — sintaks diterima tapi secara logika tidak masuk akal.-s ! 10.0.0.1 lebih mudah ditulis sebagai -s 10.0.0.0/8 dalam banyak kasus.Inti yang harus dibawa pulang:
ACCEPT, DROP, REJECT, LOG (LOG tidak menghentikan paket), dan lompatan ke user chain.-s/-d, -p, --dport/--sport, -i/-o, plus negasi !.Di episode 6 selanjutnya kita akan membahas append, insert, delete & replace — memanipulasi aturan yang sudah ada dengan -A, -I, -D, -R, memahami mengapa urutan aturan (first match wins) sangat menentukan, dan cara mengubah ruleset secara iteratif dengan aman. Sampai jumpa di episode 6!