Belajar Iptables - Skenario Server: Web, SSH & Mail
Episode 15 of 23

Belajar Iptables - Skenario Server: Web, SSH & Mail

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

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

Pendahuluan

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".

Prinsip Penyusunan

Ikuti kerangka baku yang sudah kita bangun bertahap:

  1. Policy default DROP untuk INPUT dan FORWARD.
  2. ESTABLISHED,RELATED di paling atas — balasan koneksi sah bebas.
  3. Rate limit & proteksi brute-force untuk SSH.
  4. Allow layanan publik (web, mail).
  5. Logging untuk yang ditolak — dibatasi lajunya.
  6. Ruleset IPv6 paralel.

Ruleset Web + SSH

Mulai dari chain filter untuk server web dengan SSH:

Ruleset dasar web + 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 DROP

Perhatikan 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.

Jangan Lupa IPv6

Skenario yang paling berbahaya: IPv4 terkunci, IPv6 terbuka (episode 14). Ruleset paralel untuk IPv6:

Ruleset IPv6 paralel
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 DROP

Catatan 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: Port dan Hardening

Mail server menambah nuansa: empat port berbeda dengan peran berbeda:

PortProtokolPeran
25SMTPMenerima email dari server lain
587SubmissionKlien mengirim email (STARTTLS)
993IMAPSKlien membaca email (encrypted)
465SMTPSSMTP via SSL (alternatif submission)

Aturan stateful untuk mail server:

Ruleset 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 ACCEPT

Relay 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.

Persisten dan Diverifikasi

Jangan biarkan ruleset hebat ini mati saat reboot:

Simpan kedua ruleset
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
sudo netfilter-persistent save

Verifikasi dari sisi klien setelah semua terpasang:

Verifikasi dari mesin lain
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 25

Tiga perintah pertama harus berhasil; nc ke port 25 dari luar range yang diizinkan harus gagal — itulah bukti relay hardening bekerja.

Common Pitfalls

  • Menaruh rate limit SSH di bawah rule ACCEPT luas — urutan salah membuat proteksi mati.
  • Melupakan -i lo -j ACCEPT — tool lokal (database, monitoring agent) mendadak "rusak".
  • Men-DROP semua ICMPv6 — IPv6 jaringan gagal karena NDP mati.
  • Membuka port 25 untuk semua orang — server kalian jadi relay terbuka untuk scan & abuse.
  • Menyimpan hanya 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.

Penutup

Inti yang harus dibawa pulang:

  • Kerangka baku: policy DROP → ESTABLISHED,RELATED → loopback → ICMP terbatas → proteksi SSH → layanan publik → LOG + DROP.
  • Ruleset IPv6 paralel adalah keharusan; gunakan ipv6-icmp dan jangan blokir NDP.
  • Mail server: 25 (SMTP relay, hanya partner dikenal), 587 (submission), 993 (IMAPS), 465 (SMTPS).
  • Simpan dengan 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!

Belajar Iptables - Skenario Server: Web, SSH & Mail | Belajar Iptables