Panduan komprehensif tentang fundamental iptables, arsitektur packet filtering, dan strategi hardening keamanan real-world untuk server Linux production. Pelajari cara membangun aturan firewall defense-in-depth yang melindungi infrastruktur Anda.

Setiap server Linux production berada di bawah serangan konstan. Port scan, brute force attempt, DDoS flood, dan exploit probe terjadi 24/7. Aplikasi Anda mungkin aman, tetapi tanpa filtering di level network yang tepat, Anda membiarkan pintu depan terbuka lebar.
iptables adalah solusi firewall de facto untuk sistem Linux, berada di level kernel antara network interface dan aplikasi Anda. Ini bukan hanya tentang memblokir port—ini tentang membangun aturan packet filtering yang intelligent dan stateful yang membentuk garis pertahanan pertama dalam arsitektur keamanan Anda.
Ini bukan tutorial untuk pemula. Kita akan mendalami bagaimana iptables sebenarnya bekerja, aliran paket melalui netfilter hooks, arsitektur table dan chain, dan yang paling penting, cara mengimplementasikan hardening keamanan production-grade yang akan Anda deploy di infrastruktur nyata.
Sebelum menulis satu aturan pun, Anda perlu memahami apa yang terjadi ketika sebuah paket mencapai server Anda.
iptables adalah tool userspace yang mengkonfigurasi netfilter, framework packet filtering yang dibangun ke dalam kernel Linux. Ketika sebuah paket tiba di network interface Anda, paket tersebut tidak langsung menuju aplikasi Anda—paket mengalir melalui serangkaian decision point yang disebut hooks.
Bayangkan netfilter hooks sebagai security checkpoint. Setiap checkpoint memeriksa paket dan memutuskan apakah akan menerima, drop, atau memodifikasinya. Ada lima hooks dalam perjalanan paket:
PREROUTING - Paket baru tiba, sebelum keputusan routingINPUT - Paket ditujukan untuk proses lokalFORWARD - Paket di-route melalui sistemOUTPUT - Paket dihasilkan oleh proses lokalPOSTROUTING - Paket akan keluar, setelah keputusan routingKeputusan routing terjadi antara PREROUTING dan INPUT/FORWARD. Kernel melihat IP tujuan dan memutuskan: apakah paket ini untuk saya, atau haruskah saya forward ke host lain?
Inilah insight kritis: berbagai jenis traffic mengalir melalui hooks yang berbeda. Paket yang ditujukan untuk web server Anda melewati PREROUTING → INPUT. Paket yang dikirim server Anda melewati OUTPUT → POSTROUTING. Paket yang di-route melalui server Anda (jika Anda bertindak sebagai router/gateway) melewati PREROUTING → FORWARD → POSTROUTING.
iptables mengorganisir rules ke dalam tables, dan setiap table berisi chains. Hierarki ini ada karena operasi yang berbeda perlu terjadi pada tahap pemrosesan paket yang berbeda.
Ada empat main tables:
filter - Table default untuk packet filtering (keputusan accept/drop). Di sinilah sebagian besar firewall rules berada. Berisi chains INPUT, FORWARD, dan OUTPUT.
nat - Network Address Translation. Digunakan untuk memodifikasi alamat source/destination. Berisi chains PREROUTING, OUTPUT, dan POSTROUTING. Di sinilah Anda akan mengkonfigurasi port forwarding atau masquerading.
mangle - Packet alteration untuk routing khusus. Dapat memodifikasi TTL, TOS, dan header paket lainnya. Berisi semua lima chains.
raw - Connection tracking exemptions. Diproses sebelum table lainnya. Berisi chains PREROUTING dan OUTPUT.
Urutan pemrosesan penting: raw → mangle → nat → filter. Paket mencapai raw terlebih dahulu, kemudian mangle, kemudian nat, kemudian filter.
Dalam setiap table, chains adalah hook points. Ketika Anda menulis rule, Anda menambahkannya ke chain tertentu dalam table tertentu. Misalnya:
# Rule ini masuk ke filter table, INPUT chain
iptables -A INPUT -p tcp --dport 22 -j ACCEPTRules dievaluasi dari atas ke bawah. Rule yang cocok pertama menang. Jika tidak ada rule yang cocok, default policy chain berlaku (biasanya ACCEPT atau DROP).
Setiap rule iptables memiliki dua bagian: matching criteria dan target (action).
Matching criteria mendefinisikan paket mana yang berlaku untuk rule tersebut. Anda dapat match berdasarkan:
-p tcp, -p udp, -p icmp)-s 192.168.1.0/24, -d 10.0.0.5)--sport 1024:65535, --dport 443)-i eth0, -o wlan0)-m state --state ESTABLISHED,RELATED)Target mendefinisikan apa yang terjadi ketika paket cocok. Target umum:
ACCEPT - Izinkan paket lewatDROP - Buang paket secara diam-diamREJECT - Buang dan kirim error responseLOG - Log paket dan lanjutkan pemrosesanRETURN - Hentikan pemrosesan chain ini, kembali ke calling chainDi sinilah menjadi menarik: connection state tracking. Module -m state (atau yang lebih baru -m conntrack) memungkinkan Anda menulis stateful firewall rules.
# Izinkan established connections
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTRule tunggal ini mengizinkan semua response traffic untuk koneksi yang Anda inisiasi. Jika server Anda membuat HTTP request ke external API, response packets secara otomatis diizinkan masuk kembali. Inilah cara firewall modern bekerja—Anda tidak perlu secara manual mengizinkan setiap possible response port.
Connection states:
NEW - Paket pertama dari koneksi baruESTABLISHED - Bagian dari koneksi yang adaRELATED - Terkait dengan koneksi yang ada (seperti FTP data channel)INVALID - Paket tidak cocok dengan koneksi yang diketahuiDefault policy adalah apa yang terjadi ketika paket tidak cocok dengan rule apa pun. Ini adalah baseline keamanan Anda.
Sebagian besar sistem production menggunakan pendekatan "default deny":
# Set default policies ke DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTIni berarti: drop semua incoming traffic kecuali secara eksplisit diizinkan, drop semua forwarded traffic kecuali secara eksplisit diizinkan, tetapi izinkan semua outgoing traffic.
Mengapa mengizinkan OUTPUT secara default? Karena memblokir outgoing traffic dapat merusak fungsionalitas sistem (DNS lookups, package updates, API calls). Di lingkungan high-security, Anda mungkin set OUTPUT ke DROP dan whitelist koneksi outbound tertentu, tetapi itu memerlukan perencanaan yang cermat.
Warning
Jangan pernah set default policies ke DROP tanpa terlebih dahulu menambahkan rules untuk mengizinkan akses SSH. Anda akan mengunci diri Anda sendiri dari server. Selalu test perubahan firewall dengan scheduled reboot atau failsafe script yang flush rules setelah 5 menit.
Mari kita bangun firewall real-world untuk web server yang menjalankan nginx di port 80/443 dan SSH di port 22.
Pertama, flush existing rules dan set default policies:
# Flush semua rules
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Set default policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTIzinkan loopback traffic (kritis untuk layanan lokal):
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPTIzinkan established dan related connections:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTIzinkan SSH (dengan rate limiting untuk mencegah brute force):
# Izinkan SSH tetapi batasi koneksi baru menjadi 3 per menit per IP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPTIni menggunakan module recent untuk melacak connection attempts. Jika sebuah IP membuat lebih dari 3 koneksi SSH baru dalam 60 detik, upaya berikutnya di-drop. Ini secara signifikan memperlambat brute force attacks.
Izinkan HTTP dan HTTPS:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPTIzinkan ICMP ping (opsional, tetapi berguna untuk monitoring):
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTDrop invalid packets:
iptables -A INPUT -m conntrack --ctstate INVALID -j DROPLog dropped packets (untuk debugging):
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-dropped: " --log-level 4--limit mencegah log flooding. Tanpa itu, serangan dapat mengisi disk Anda dengan log entries.
SYN flood attacks mengeksploitasi TCP three-way handshake dengan mengirim SYN packets tanpa menyelesaikan koneksi, menghabiskan resource server.
# Enable SYN cookies di level kernel
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Batasi SYN packets per detik
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROPPort scanners mengirim packets ke multiple ports dengan cepat. Deteksi dan blokir mereka:
# Deteksi port scanning
iptables -N port-scanning
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
iptables -A port-scanning -j DROP
# Terapkan ke INPUT chain
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scanningIni membuat custom chain yang mendeteksi RST packets (umum dalam port scans) dan drop upaya yang berlebihan.
Blokir seluruh negara menggunakan ipset (lebih efisien daripada individual IP rules):
# Install ipset
apt-get install ipset
# Buat set untuk negara yang diblokir
ipset create blocked-countries hash:net
# Tambahkan IP ranges (contoh: blokir CIDR tertentu)
ipset add blocked-countries 203.0.113.0/24
# Blokir set tersebut
iptables -A INPUT -m set --match-set blocked-countries src -j DROPDi production, Anda akan mengisi ini dengan actual country IP ranges dari database seperti MaxMind.
Untuk database server yang hanya harus menerima koneksi dari application servers:
# Izinkan PostgreSQL hanya dari app servers
iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 5432 -j ACCEPT
# Izinkan MySQL hanya dari IP tertentu
iptables -A INPUT -p tcp -s 10.0.1.10 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.1.11 --dport 3306 -j ACCEPT
# Drop semua database traffic lainnya
iptables -A INPUT -p tcp --dport 5432 -j DROP
iptables -A INPUT -p tcp --dport 3306 -j DROPDocker memanipulasi iptables rules secara otomatis, yang dapat konflik dengan custom rules Anda. Docker menambahkan rules ke FORWARD chain dan membuat chains sendiri.
iptables -L DOCKER -n -v
iptables -L DOCKER-USER -n -vUntuk menambahkan custom rules yang berlaku untuk Docker containers, gunakan DOCKER-USER chain:
# Blokir akses eksternal ke container port
iptables -I DOCKER-USER -p tcp --dport 6379 ! -s 10.0.0.0/8 -j DROP
# Izinkan hanya IP tertentu untuk mengakses container
iptables -I DOCKER-USER -p tcp --dport 8080 -s 192.168.1.100 -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport 8080 -j DROPNetwork Address Translation dikonfigurasi di nat table. Use case umum:
Membuat internal network traffic tampak berasal dari gateway:
# Enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEForward external port ke internal server:
# Forward external port 8080 ke internal server port 80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# Izinkan forwarded traffic
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPTDistribusikan traffic ke multiple backends:
# Round-robin load balancing ke tiga backends
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.12:80Ini adalah load balancing dasar. Untuk production, gunakan dedicated load balancers seperti HAProxy atau nginx.
iptables rules tidak persistent secara default. Rules hilang saat reboot.
# Simpan current rules
iptables-save > /etc/iptables/rules.v4
# Install persistence package
apt-get install iptables-persistent
# Rules secara otomatis dimuat dari /etc/iptables/rules.v4# List semua rules dengan line numbers
iptables -L -n -v --line-numbers
# Tampilkan rules dalam format command (lebih mudah dibaca)
iptables -S
# Tampilkan NAT rules
iptables -t nat -L -n -v# Hapus berdasarkan line number
iptables -D INPUT 5
# Hapus berdasarkan specification
iptables -D INPUT -p tcp --dport 8080 -j ACCEPTJangan pernah test perubahan firewall langsung di production server tanpa failsafe:
#!/bin/bash
# Terapkan rules baru
iptables-restore < /etc/iptables/rules.v4.new
# Jadwalkan rule flush dalam 5 menit
at now + 5 minutes <<EOF
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
EOF
echo "Rules diterapkan. Anda punya 5 menit untuk test."
echo "Jika semuanya bekerja, batalkan scheduled flush dengan: atrm <job_id>"Jika Anda kehilangan konektivitas, rules akan otomatis flush setelah 5 menit.
Admin baru sering menulis rules seperti ini:
iptables -A INPUT -p tcp --dport 80 -j ACCEPTIni mengizinkan incoming connections ke port 80, tetapi tanpa rule untuk established connections, response packets mungkin di-drop. Selalu sertakan:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPTRules dievaluasi dari atas ke bawah. Ini tidak akan bekerja:
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPTRule DROP cocok dengan semuanya terlebih dahulu. SSH tidak pernah diizinkan. Urutan yang benar:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROPSelalu test akses SSH sebelum set default DROP policy. Gunakan console atau out-of-band access method.
Tanpa logging, Anda terbang buta. Anda tidak akan tahu apa yang diblokir atau mengapa koneksi gagal.
iptables -A INPUT -p tcp -j ACCEPTIni mengizinkan semua TCP traffic. Jadilah spesifik tentang ports dan sources.
iptables cepat, tetapi rules yang tidak efisien dapat berdampak pada performance di high-traffic servers.
Alih-alih matching setiap paket secara individual, gunakan connection tracking:
# Bagus: Satu rule menangani semua response traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Buruk: Rules terpisah untuk setiap possible response port
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -j ACCEPT
# ... ratusan rules lagiMatching terhadap ribuan IPs dengan individual rules lambat:
iptables -A INPUT -s 1.2.3.4 -j DROP
iptables -A INPUT -s 5.6.7.8 -j DROP
# ... ribuan lagiGunakan ipset sebagai gantinya:
ipset create blocklist hash:ip
ipset add blocklist 1.2.3.4
ipset add blocklist 5.6.7.8
iptables -A INPUT -m set --match-set blocklist src -j DROPipset menggunakan hash tables untuk O(1) lookups alih-alih O(n) rule traversal.
Setiap paket diperiksa terhadap setiap rule sampai match ditemukan. Letakkan frequently-matched rules di atas:
# Sebagian besar traffic adalah established connections - cek ini dulu
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Kemudian common services
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Kemudian less common services
iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables powerful, tetapi tidak selalu tool yang tepat.
iptables beroperasi di layers 3-4 (IP/TCP/UDP). Tidak dapat memeriksa HTTP headers, parse JSON, atau membuat keputusan berdasarkan application logic. Untuk itu, gunakan application-level firewalls atau reverse proxies seperti nginx, HAProxy, atau Envoy.
Jika Anda menjalankan di AWS, GCP, atau Azure, gunakan native security groups mereka alih-alih iptables. Mereka lebih terintegrasi dengan cloud platform, lebih mudah dikelola dalam skala, dan tidak mengonsumsi resource server.
nftables adalah penerus iptables, menawarkan performance yang lebih baik dan syntax yang lebih bersih. Ini telah menjadi default di distribusi Linux yang lebih baru. Jika Anda memulai dari awal, pelajari nftables sebagai gantinya.
# iptables
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# nftables
nft add rule ip filter input tcp dport 22 acceptUntuk multi-gigabit networks atau skenario routing yang kompleks, dedicated hardware firewalls atau specialized software seperti pfSense, OPNsense, atau VyOS lebih tepat.
Berikut adalah complete, production-ready firewall script untuk typical web application server:
Script ini menyediakan:
iptables -L -n -vPacket dan byte counters menunjukkan berapa kali setiap rule telah di-match. Jika sebuah rule memiliki zero hits, mungkin misconfigured atau unreachable.
iptables -ZBerguna untuk testing specific rules.
tail -f /var/log/kern.log | grep iptables-dropped# Test TCP connection
nc -zv target-server 80
# Test dengan timeout
timeout 5 telnet target-server 443
# Cek apakah port filtered atau closed
nmap -p 22,80,443 target-serverGunakan TRACE target untuk melihat persis rule mana yang cocok dengan paket:
# Load module
modprobe nf_log_ipv4
# Enable tracing untuk specific traffic
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
# Watch trace
tail -f /var/log/kern.log | grep TRACEIni menunjukkan setiap table, chain, dan rule yang dilalui paket. Hapus TRACE rule setelah selesai—ini menghasilkan log yang massive.
iptables lebih dari sekadar firewall—ini adalah complete packet filtering dan manipulation framework. Memahami arsitektur netfilter, hierarki table/chain, dan connection state tracking sangat penting untuk membangun sistem production yang aman.
Prinsip kunci:
Keamanan berlapis. iptables adalah garis pertahanan pertama Anda, tetapi tidak cukup sendiri. Kombinasikan dengan application-level security, intrusion detection, regular patching, dan monitoring untuk membangun defense-in-depth.
Mulai dengan production example script, sesuaikan dengan layanan spesifik Anda, dan test secara menyeluruh. Infrastruktur Anda akan jauh lebih resilient terhadap barisan serangan konstan yang dialami setiap server yang menghadap internet.