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

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.
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:
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -A FORWARD -m conntrack --ctstate INVALID -j DROPLetakkan aturan ini di atas aturan ESTABLISHED,RELATED — paket INVALID harus dibuang sebelum sempat dibandingkan dengan aturan lain.
Setiap serangan dimulai dari koneksi NEW yang tak wajar. Batasi laju dan jumlahnya:
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 DROPAturan 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:
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 DROPSatu IP yang membuka lebih dari 20 koneksi dalam 10 detik langsung dibatasi.
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:
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=2Lapis 2 — rate limit SYN: batasi SYN NEW seperti di atas, dan jatuhkan sisa:
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 DROPNote
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.
ICMP sering disalahpahami sebagai "berbahaya" lalu diblokir total — padahal ICMP penting untuk operasional jaringan (PMTU discovery, error reporting). Pendekatan yang sehat:
# 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 ACCEPTPing 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.
Beberapa paket seharusnya tidak pernah eksis di internet normal. Men-DROP paket-paket ini mengurangi permukaan serangan:
# 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 DROPPaket yang dikenali di sini bisa di-DROP tanpa logging — mereka noise murni, dan mencatatnya hanya membuang siklus CPU dan ruang disk.
Pertahanan aktif berarti log tambahan — dan log tambahan harus dibatasi (episode 12):
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT:DROP: "
sudo iptables -A INPUT -j DROPMenyusun semua lapisan ke dalam satu urutan yang benar:
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 DROPWarning
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.
Inti yang harus dibawa pulang:
NEW (global dengan limit, per-IP dengan recent).tcp_syncookies=1 + rate limit SYN.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!