Merancang ruleset lengkap untuk server yang melayani publik: membuka port 80 dan 443 untuk web, rate limit port 22 SSH dengan proteksi brute-force, menjatuhkan scan, serta mengamankan mail server di port 25 587 993 dan 465 dengan pola stateful dan relay hardening

Di episode 14 kalian sudah paham bahwa IPv4 dan IPv6 harus dijaga paralel. Sekarang waktunya merangkai semua keterampilan dari episode 4-13 menjadi satu ruleset utuh untuk server yang benar-benar melayani publik: web server, SSH, dan mail server. Inilah momen di mana kalian berhenti berlatih per-bagian dan mulai membangun satu firewall yang koheren.
Skenario ini adalah latihan paling dekat dengan pekerjaan SysAdmin harian: satu mesin, beberapa layanan, ancaman nyata (scan, brute-force, crawler jahat), dan tuntutan "layanan harus jalan, sisanya jangan".
Ikuti kerangka baku yang sudah kita bangun bertahap:
ESTABLISHED,RELATED di paling atas — balasan koneksi sah bebas.Mulai dari chain filter untuk server web dengan SSH:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/sec -j ACCEPT
# SSH dengan rate limit brute-force
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --name SSH --seconds 60 --hitcount 4 -j REJECT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Web
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Jatuhkan sisanya sambil dicatat
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT:DROP: "
sudo iptables -A INPUT -j DROPPerhatikan urutannya: loopback diterima (banyak tool lokal butuh), stateful menangkap balasan, ICMP dibatasi, SSH di-rate-limit dulu baru diizinkan, web diizinkan, dan bagian bawah chain mencakup segala yang tersisa.
Note
Aturan SSH memakai recent dari episode 13: pencatatan di baris pertama, penolakan setelah 4 percobaan dalam 60 detik di baris kedua, dan ACCEPT untuk koneksi yang lolos batas. Bagi pengguna sah yang mencoba sekali-dua kali, tidak ada efek sama sekali.
Skenario yang paling berbahaya: IPv4 terkunci, IPv6 terbuka (episode 14). Ruleset paralel untuk IPv6:
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -m limit --limit 1/sec -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -A INPUT -j DROPCatatan penting: protokol ICMP di IPv6 adalah ipv6-icmp (bukan icmp), dan lalu lintas ICMPv6 tertentu (seperti NDP neighbor discovery) memang wajib diizinkan agar IPv6 berfungsi — jangan pernah men-DROP semua ICMPv6.
Mail server menambah nuansa: empat port berbeda dengan peran berbeda:
| Port | Protokol | Peran |
|---|---|---|
| 25 | SMTP | Menerima email dari server lain |
| 587 | Submission | Klien mengirim email (STARTTLS) |
| 993 | IMAPS | Klien membaca email (encrypted) |
| 465 | SMTPS | SMTP via SSL (alternatif submission) |
Aturan stateful untuk mail server:
# Stateful: balasan koneksi yang sah
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SMTP masuk — hanya dari server yang dikenal (relay)
sudo iptables -A INPUT -p tcp --dport 25 -s 203.0.113.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 25 -j DROP
# Submission & IMAP untuk klien
sudo iptables -A INPUT -p tcp --dport 587 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 993 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPTRelay hardening adalah kuncinya: port 25 hanya menerima dari mail exchanger partner yang dikenal (range IP di atas), sementara semua SMTP lain di-DROP. Ini memotong banyak trafik spam dan scan sebelum menyentuh MTA.
Jangan biarkan ruleset hebat ini mati saat reboot:
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
sudo netfilter-persistent saveVerifikasi dari sisi klien setelah semua terpasang:
curl -sI https://server.example.com | head -1
ssh -o ConnectTimeout=5 admin@server.example.com
nc -vz server.example.com 587
nc -vz server.example.com 25Tiga perintah pertama harus berhasil; nc ke port 25 dari luar range yang diizinkan harus gagal — itulah bukti relay hardening bekerja.
-i lo -j ACCEPT — tool lokal (database, monitoring agent) mendadak "rusak".rules.v4 — IPv6 kembali telanjang setelah reboot.Tip
Skenario ini adalah template yang bisa kalian salin untuk server apa pun: tentukan daftar layanan publik, proteksi SSH selalu di depan, taruh LOG + DROP di dasar chain, dan tulis versi IPv6 yang setara. Template itulah yang nanti kita rapi-kan jadi "ruleset produksi" di episode 17.
Inti yang harus dibawa pulang:
ESTABLISHED,RELATED → loopback → ICMP terbatas → proteksi SSH → layanan publik → LOG + DROP.ipv6-icmp dan jangan blokir NDP.iptables-save/ip6tables-save dan verifikasi dari mesin eksternal.Di episode 16 selanjutnya kita akan membahas anti-scan & DDoS mitigation dasar — membatasi koneksi NEW, men-DROP paket INVALID, dasar-dasar proteksi SYN flood, dan kontrol ICMP, sebagai baseline untuk server yang menghadap internet. Sampai jumpa di episode 16!