Belajar Iptables - Anti-Scan & DDoS Mitigation Dasar
Episode 16 of 23

Belajar Iptables - Anti-Scan & DDoS Mitigation Dasar

Membangun pertahanan dasar untuk server yang menghadap internet: membatasi laju koneksi NEW, menjatuhkan paket INVALID, dasar-dasar proteksi SYN flood, kontrol lalu lintas ICMP, serta menyingkirkan paket yang tidak layak diproses sebelum sampai ke layanan

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Ruleset di episode 15 sudah membuka layanan dengan benar — tapi di internet yang sebenarnya, server kalian akan terus-menerus di-scan, di-flood, dan dites. Episode 16 menjawab pertanyaan: bagaimana membuat firewall bekerja lebih keras sebagai pertahanan proaktif? Ini adalah baseline anti-scan & DDoS mitigation yang realistis untuk server internet-facing.

Penting untuk tetap jujur soal skala: iptables tidak akan menghentikan serangan DDoS volume raksasa sendirian. Tapi ia mampu menghilangkan sebagian besar noise otomatis — scan, crawler kasar, paket sampah — yang justru paling sering membebani layanan. Menghilangkan noise adalah 80% dari pekerjaan.

Drop Paket INVALID: Sampah Sebelum Masuk

Paket INVALID adalah paket yang tidak cocok dengan koneksi mana pun yang dikenal conntrack — hasil koneksi yang sudah mati, paket spoofed, atau sintaks rusak. Tidak ada alasan sah untuk menerimanya:

Drop INVALID di semua jalur
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

Letakkan aturan ini di atas aturan ESTABLISHED,RELATED — paket INVALID harus dibuang sebelum sempat dibandingkan dengan aturan lain.

Batasi Koneksi NEW

Setiap serangan dimulai dari koneksi NEW yang tak wajar. Batasi laju dan jumlahnya:

Batasi koneksi NEW per IP
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m limit --limit 30/sec --limit-burst 50 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j DROP

Aturan ini menetapkan langit-langit untuk koneksi baru: hingga 50 koneksi awal, lalu maksimal 30 per detik. Di atas itu — DROP. Layanan web normal tidak akan pernah mendekati batas ini, sementara connection flood cepat diredam.

Gabungkan dengan recent untuk membatasi per-IP:

Batas koneksi per IP
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --set --name CONN
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --update --name CONN --seconds 10 --hitcount 20 -j DROP

Satu IP yang membuka lebih dari 20 koneksi dalam 10 detik langsung dibatasi.

Proteksi SYN Flood Dasar

SYN flood membanjiri server dengan paket SYN tanpa pernah menyelesaikan handshake. Dua lapis dasar yang bisa dipasang di iptables:

Lapis 1 — kernel tuning: kurangi ukuran backlog dan percepat siklus half-open connection:

Tuning kernel SYN
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sudo sysctl -w net.ipv4.tcp_synack_retries=2

Lapis 2 — rate limit SYN: batasi SYN NEW seperti di atas, dan jatuhkan sisa:

Rate limit SYN
sudo iptables -A INPUT -p tcp --syn -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

Note

tcp_syncookies=1 adalah pertahanan kernel yang paling efektif untuk SYN flood — ketika backlog penuh, kernel mengirim SYN-ACK yang dihitung secara khusus, membuat server tetap merespons tanpa mengalokasikan memori per koneksi. iptables berperan sebagai pre-filter, kernel syncookies sebagai pertahanan terakhir.

Kontrol ICMP yang Realistis

ICMP sering disalahpahami sebagai "berbahaya" lalu diblokir total — padahal ICMP penting untuk operasional jaringan (PMTU discovery, error reporting). Pendekatan yang sehat:

Kontrol ICMP
# Ping dibatasi lajunya
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/sec --limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
 
# Error & essential tetap diterima
sudo iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Ping dibatasi tapi tidak dimatikan — berguna untuk troubleshooting kalian sendiri — sementara paket ICMP error yang dibutuhkan protokol tetap lewat. Untuk IPv6, ingat aturan ipv6-icmp dari episode 15.

Aturan "Tidak Layak Diproses"

Beberapa paket seharusnya tidak pernah eksis di internet normal. Men-DROP paket-paket ini mengurangi permukaan serangan:

Drop paket tidak wajar
# Trafik dari alamat yang tidak mungkin (invalid / broadcast source)
sudo iptables -A INPUT -s 0.0.0.0/8 -j DROP
sudo iptables -A INPUT -s 127.0.0.0/8 ! -i lo -j DROP
 
# Port yang jarang sah untuk datang dari luar
sudo iptables -A INPUT -p tcp --dport 137:139 -j DROP
sudo iptables -A INPUT -p udp --dport 137:139 -j DROP

Paket yang dikenali di sini bisa di-DROP tanpa logging — mereka noise murni, dan mencatatnya hanya membuang siklus CPU dan ruang disk.

Logging yang Tetap Sehat

Pertahanan aktif berarti log tambahan — dan log tambahan harus dibatasi (episode 12):

Log yang dibatasi
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT:DROP: "
sudo iptables -A INPUT -j DROP

Perakitan: Baseline Anti-Scan

Menyusun semua lapisan ke dalam satu urutan yang benar:

Baseline anti-scan lengkap
sudo iptables -P INPUT DROP
 
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
sudo iptables -A INPUT -s 0.0.0.0/8 -j DROP
sudo iptables -A INPUT -s 127.0.0.0/8 ! -i lo -j DROP
 
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/sec --limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
 
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m limit --limit 30/sec --limit-burst 50 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j DROP
 
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT:DROP: "
sudo iptables -A INPUT -j DROP

Common Pitfalls

  • Meletakkan rule INVALID di bawah ESTABLISHED — paket sampah sudah sempat diproses aturan lain.
  • Rate limit yang terlalu ketat — koneksi sah ikut terbuang di balik load balancer atau NAT (semua pengguna terlihat dari satu IP).
  • Memblokir semua ICMP — PMTU discovery mati, koneksi besar mendadak hang.
  • Berharap iptables menahan DDoS raksasa — itu kerja mitigasi upstream (CDN, anycast); iptables membersihkan noise.

Warning

Rate limit per-IP (recent) bermasalah ketika banyak pengguna sah berbagi satu IP — misalnya di belakang NAT kantor atau CGNAT. Sebelum mengetatkan, kenali pola pengguna kalian. Aturan yang terlalu agresif bisa memblokir pengguna sah lebih cepat daripada menyerang penyerang.

Penutup

Inti yang harus dibawa pulang:

  • Drop INVALID di awal INPUT dan FORWARD — sampah dibuang sebelum diproses.
  • Batasi koneksi NEW (global dengan limit, per-IP dengan recent).
  • SYN flood dilawan berlapis: tcp_syncookies=1 + rate limit SYN.
  • ICMP dibatasi, bukan dibunuh; paket "tidak wajar" di-DROP tanpa log.
  • iptables membersihkan noise; DDoS volume besar butuh mitigasi upstream.

Di episode 17 selanjutnya kita akan membahas ruleset produksi & best practice — merancang default-drop dengan allowlist layanan, meminimalkan permukaan serangan, menyusun chain user-defined yang rapi, menyimpan ruleset di git/IaC, memakai modul comment, dan melakukan audit berkala. Sampai jumpa di episode 17!

Belajar Iptables - Anti-Scan & DDoS Mitigation Dasar | Belajar Iptables