1. iptables: Dasar-Dasar Firewall Linux
iptables adalah firewall berbasis tabel yang sudah menjadi standar di hampir semua distribusi Linux selama lebih dari dua dekade. iptables bekerja dengan memfilter paket jaringan berdasarkan sekumpulan aturan (rules) yang diterapkan pada berbagai titik dalam stack networking Linux melalui konsep chains dan tables.
Memahami iptables adalah fondasi penting karena konsep chains, rules, dan policies yang dipelajari di sini berlaku juga untuk successor modernnya seperti nftables. Bahkan UFW dan firewalld sebenarnya adalah frontend yang bekerja di atas iptables.
Memahami Tables dan Chains
iptables memiliki beberapa tabel, masing-masing menangani fungsi yang berbeda.
Tabel yang paling sering digunakan adalah filter (untuk memfilter paket)
dan nat (untuk Network Address Translation).
| Table | Fungsi | Chains yang Tersedia |
|---|---|---|
| filter | Memfilter paket (izinkan/blokir). Ini adalah tabel default. | INPUT, OUTPUT, FORWARD |
| nat | Network Address Translation — mengubah alamat IP/port paket. | PREROUTING, POSTROUTING, OUTPUT |
| mangle | Memodifikasi header paket (TTL, TOS, dll). | PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING |
| raw | Menangani paket yang belum terkait dengan koneksi (connection tracking). | PREROUTING, OUTPUT |
2. iptables Chains: Alur Paket
Setiap chain mewakili titik keputusan dalam alur paket jaringan. Memahami alur ini sangat penting agar rules yang kamu buat benar-benar berfungsi sesuai harapan.
3. Konfigurasi iptables Common Rules
Berikut adalah konfigurasi iptables lengkap yang dapat kamu gunakan sebagai baseline untuk mengamankan server Linux produksi. Konfigurasi ini mencakup proteksi terhadap berbagai jenis serangan umum.
#!/bin/bash
# ============================================
# Firewall Hardening Script — iptables
# Server Linux Production
# ============================================
set -e
echo "[*] Memulai konfigurasi firewall..."
# ============================================
# 1. Flush semua rules yang ada
# ============================================
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
# ============================================
# 2. Set default policy
# ============================================
# Tolak semua traffic masuk & forwarding
# Izinkan traffic keluar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# ============================================
# 3. Izinkan loopback (komunikasi internal)
# ============================================
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# ============================================
# 4. Izinkan koneksi established & related
# ============================================
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Drop paket invalid
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# ============================================
# 5. Proteksi Anti-Scanning (port scan)
# ============================================
# Drop paket XMAS (semua flag aktif)
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# Drop paket NULL (tidak ada flag)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Drop paket SYN-FIN (tidak lazim)
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Drop paket SYN-RST
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# Drop paket FIN tanpa ACK
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# ============================================
# 6. Proteksi SYN Flood
# ============================================
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# ============================================
# 7. Proteksi ICMP Flood (ping flood)
# ============================================
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Izinkan ICMP yang dibutuhkan (destination unreachable, time exceeded)
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# ============================================
# 8. SSH dari IP tertentu saja (port 22)
# ============================================
# Ganti dengan IP admin kamu
ADMIN_IP="203.0.113.10"
iptables -A INPUT -p tcp -s $ADMIN_IP --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# Rate limit SSH untuk proteksi brute force
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# ============================================
# 9. HTTP/HTTPS Web Server (port 80 & 443)
# ============================================
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
# ============================================
# 10. DNS (jika server bertindak sebagai DNS)
# ============================================
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# ============================================
# 11. NTP untuk sinkronisasi waktu
# ============================================
iptables -A INPUT -p udp --dport 123 -j ACCEPT
# ============================================
# 12. Proteksi Brute Force umum
# ============================================
# Rate limit koneksi baru per IP (maks 25 koneksi per 60 detik)
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m recent --set --name NEWCONN
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 25 --name NEWCONN -j DROP
# ============================================
# 13. Limit jumlah koneksi per IP
# ============================================
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j REJECT
# ============================================
# 14. Log paket yang ditolak (maks 5/menit)
# ============================================
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FW-DROP: " --log-level 4
# ============================================
# 15. Simpan rules agar persisten
# ============================================
# Debian/Ubuntu:
# apt install iptables-persistent
# netfilter-persistent save
# RHEL/CentOS:
# service iptables save
# Atau:
# iptables-save > /etc/sysconfig/iptables
echo "[✓] Firewall rules berhasil diterapkan!"
echo "[!] Jangan lupa simpan rules: netfilter-persistent save"
Sebelum menerapkan default DROP policy pada INPUT, pastikan kamu sudah
menambahkan rule untuk mengizinkan SSH dari IP kamu. Jika kamu terkunci
dari server, kamu harus mengakses melalui console fisik (VNC/KVM) atau recovery
mode untuk memperbaiki. Gunakan iptables -P INPUT ACCEPT sementara
saat testing rules baru.
4. UFW: Firewall Sederhana untuk Ubuntu
UFW (Uncomplicated Firewall) adalah antarmuka sederhana untuk iptables yang tersedia secara default di Ubuntu dan turunan Debian. UFW sangat cocok untuk administrator yang menginginkan konfigurasi firewall cepat tanpa harus menghafal sintaks iptables yang kompleks.
#!/bin/bash
# ============================================
# UFW (Uncomplicated Firewall) Setup
# Untuk Ubuntu/Debian Server
# ============================================
# Install UFW (jika belum terinstall)
sudo apt update && sudo apt install ufw -y
# ============================================
# 1. Set default policy
# ============================================
sudo ufw default deny incoming # Tolak semua yang masuk
sudo ufw default allow outgoing # Izinkan semua yang keluar
sudo ufw default deny forwarding # Tolak forwarding
# ============================================
# 2. Izinkan SSH (PENTING — lakukan ini dulu!)
# ============================================
# Izinkan SSH dari semua IP
sudo ufw allow 22/tcp comment "SSH"
# Atau izinkan SSH dari IP tertentu saja (lebih aman)
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp comment "SSH Admin Only"
# ============================================
# 3. Izinkan layanan web
# ============================================
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
# ============================================
# 4. Izinkan layanan spesifik
# ============================================
# DNS server
sudo ufw allow 53 comment "DNS"
# NTP
sudo ufw allow 123/udp comment "NTP"
# MySQL dari localhost saja
sudo ufw allow from 127.0.0.1 to any port 3306 proto tcp comment "MySQL Local"
# Redis dari localhost saja
sudo ufw allow from 127.0.0.1 to any port 6379 proto tcp comment "Redis Local"
# ============================================
# 5. Rate limiting (anti brute force)
# ============================================
# Rate limit SSH: maks 6 koneksi dalam 30 detik
sudo ufw limit 22/tcp comment "SSH Rate Limit"
# ============================================
# 6. Blokir IP spesifik
# ============================================
sudo ufw deny from 198.51.100.0/24 comment "Block malicious subnet"
# ============================================
# 7. Allow dari subnet tertentu
# ============================================
sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcp comment "Internal App"
# ============================================
# 8. Enable firewall
# ============================================
sudo ufw --force enable
sudo ufw enable
# ============================================
# 9. Verifikasi
# ============================================
sudo ufw status verbose
sudo ufw status numbered
UFW mendukung application profiles untuk layanan populer. Lihat daftar profiles
dengan ufw app list, lalu gunakan seperti:
ufw allow 'OpenSSH' atau ufw allow 'Nginx Full'.
Kamu juga bisa membuat custom profile di /etc/ufw/applications.d/.
5. firewalld: Firewall untuk RHEL/CentOS/Fedora
firewalld adalah firewall default di RHEL, CentOS, Fedora, dan openSUSE. Berbeda dengan iptables yang langsung mengedit rules, firewalld menggunakan konsep zones dan services yang memungkinkan perubahan konfigurasi tanpa restart firewall (zero-downtime).
#!/bin/bash
# ============================================
# firewalld Setup untuk RHEL/CentOS/Fedora
# ============================================
# Install firewalld (jika belum)
sudo dnf install firewalld -y
# Aktifkan dan mulai firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
# ============================================
# 1. Lihat zones yang tersedia
# ============================================
sudo firewall-cmd --get-zones
# Output: block dmz drop external home internal public trusted work
# ============================================
# 2. Lihat zone aktif dan konfigurasinya
# ============================================
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --list-all
# ============================================
# 3. Set default zone
# ============================================
sudo firewall-cmd --set-default-zone=public
# ============================================
# 4. Tambahkan layanan ke zone
# ============================================
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-service=ssh
# ============================================
# 5. Tambahkan port spesifik
# ============================================
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
sudo firewall-cmd --permanent --zone=public --add-port=8443/tcp
# ============================================
# 6. Blokir layanan/port
# ============================================
sudo firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
# ============================================
# 7. Rich Rules (aturan canggih)
# ============================================
# Izinkan SSH hanya dari IP tertentu
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="203.0.113.10/32"
port protocol="tcp" port="22"
accept'
# Rate limit untuk SSH
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
port protocol="tcp" port="22"
accept
limit value="5/m"'
# Blokir IP tertentu
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="198.51.100.0/24"
drop'
# Log paket yang ditolak
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
port protocol="tcp" port="22"
log prefix="FW-SSH: " level="info"
limit value="3/m"
accept'
# ============================================
# 8. Reload untuk menerapkan perubahan
# ============================================
sudo firewall-cmd --reload
# ============================================
# 9. Verifikasi
# ============================================
sudo firewall-cmd --list-all
sudo firewall-cmd --list-all-zones
| Fitur | iptables | UFW | firewalld |
|---|---|---|---|
| Kompleksitas | Tinggi — sintaks teknis | Rendah — sangat mudah | Sedang — konsep zones |
| Default di | Sebagian besar distro lama | Ubuntu, Debian | RHEL, CentOS, Fedora |
| Hot Reload | Ya (langsung diterapkan) | Ya | Ya (zero-downtime) |
| Dukungan Zone | Tidak (manual) | Tidak | Ya (bawaan) |
| Cocok Untuk | Konfigurasi kompleks, router | Pemula, server sederhana | Enterprise, data center |
6. Rate Limiting & Proteksi DDoS
Rate limiting adalah teknik yang sangat penting untuk melindungi server dari serangan brute force, DDoS, dan flood. Dengan membatasi jumlah koneksi atau request per IP dalam periode waktu tertentu, kamu dapat memitigasi sebagian besar serangan volumetrik.
#!/bin/bash
# ============================================
# Advanced Rate Limiting dengan iptables
# ============================================
# ============================================
# 1. SSH Brute Force Protection
# ============================================
# Maks 3 koneksi SSH baru per 60 detik per IP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSHBF
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update \
--seconds 60 --hitcount 3 --name SSHBF -j DROP
# ============================================
# 2. HTTP Flood Protection
# ============================================
# Maks 30 koneksi HTTP baru per detik (global)
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit \
--limit 30/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP
# Maks 20 koneksi per IP ke web server
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT \
--reject-with tcp-reset
# ============================================
# 3. UDP Flood Protection
# ============================================
iptables -A INPUT -p udp -m limit --limit 50/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p udp -j DROP
# ============================================
# 4. Fragment Attack Protection
# ============================================
iptables -A INPUT -f -j DROP
# ============================================
# 5. Synproxy (advanced SYN flood mitigation)
# ============================================
iptables -t raw -A PREROUTING -p tcp --syn -j NOTRACK
iptables -A INPUT -p tcp --syn -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -A INPUT -m state --state INVALID -j DROP
Rate limiting di iptables efektif untuk serangan skala kecil-menengah. Namun, untuk serangan DDoS volumetrik yang mencapai ratusan Gbps, kamu memerlukan layanan DDoS mitigation eksternal seperti Cloudflare, AWS Shield, atau Akamai Prolexic yang mampu menyerap traffic berbahaya sebelum mencapai server kamu.
7. Port Knocking: Hidden Door ke Server
Port knocking adalah teknik keamanan di mana layanan sensitif (seperti SSH) hanya dapat diakses setelah pengguna mengirimkan urutan paket ke port-port tertentu dalam urutan yang benar. Ini menambah lapisan keamanan karena port SSH tidak terlihat oleh scanner otomatis.
#!/bin/bash
# ============================================
# Port Knocking Setup dengan knockd
# ============================================
# Install knockd
sudo apt install knockd -y
# ============================================
# Konfigurasi knockd: /etc/knockd.conf
# ============================================
cat > /etc/knockd.conf << 'EOF'
[options]
UseSyslog
Interface = eth0
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
EOF
# Aktifkan knockd
sudo systemctl enable knockd
sudo systemctl start knockd
# ============================================
# Dari client, lakukan port knocking:
# ============================================
# Install knock client
sudo apt install knockd -y
# Buka akses SSH
knock -v server_ip 7000 8000 9000
# Sekarang kamu bisa SSH
ssh user@server_ip
# Tutup akses SSH setelah selesai
knock -v server_ip 9000 8000 7000
8. Firewall Logging dengan fail2ban
Logging adalah komponen krusial dalam firewall hardening. Dengan logging yang tepat, kamu dapat mendeteksi serangan, menganalisis pola traffic mencurigakan, dan mengambil tindakan otomatis untuk memblokir penyerang.
#!/bin/bash
# ============================================
# fail2ban Setup — Auto-ban Brute Force
# ============================================
# Install fail2ban
sudo apt install fail2ban -y
# Buat konfigurasi lokal
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
# Ban selama 1 jam
bantime = 3600
# Window waktu untuk menghitung percobaan
findtime = 600
# Maks percobaan sebelum ban
maxretry = 5
# Backend yang digunakan (systemd untuk modern distro)
backend = systemd
# Action: ban + kirim email notifikasi
action = %(action_mwl)s
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 7200
EOF
# Restart fail2ban
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
# ============================================
# Monitoring & Management
# ============================================
# Lihat status semua jail
sudo fail2ban-client status
# Lihat status jail SSH
sudo fail2ban-client status sshd
# Ban IP secara manual
sudo fail2ban-client set sshd banip 192.168.1.100
# Unban IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
# Lihat log fail2ban
sudo tail -f /var/log/fail2ban.log
# ============================================
# iptables Logging — Mengarahkan ke File Khusus
# ============================================
# Tambahkan rule log sebelum rule DROP/REJECT
iptables -A INPUT -m limit --limit 5/min --limit-burst 10 \
-j LOG --log-prefix "FW-INPUT-DROP: " --log-level 4
# Pisahkan log firewall ke file khusus
cat > /etc/rsyslog.d/10-iptables.conf << 'EOF'
:msg, contains, "FW-INPUT-DROP:" /var/log/iptables.log
& stop
EOF
# Restart rsyslog
sudo systemctl restart rsyslog
# Rotate log agar tidak memenuhi disk
cat > /etc/logrotate.d/iptables << 'EOF'
/var/log/iptables.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root adm
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
EOF
9. Best Practices Checklist
Gunakan checklist berikut sebagai panduan komprehensif untuk memastikan server Linux kamu memiliki pertahanan firewall yang solid.
| Kategori | Prioritas | Tindakan yang Harus Dilakukan |
|---|---|---|
| Default Policy | 🔴 Kritis | Set default INPUT ke DROP. Izinkan hanya port yang dibutuhkan (whitelist approach). Blokir semua port yang tidak digunakan. |
| SSH Hardening | 🔴 Kritis | Nonaktifkan password login, gunakan key-based auth. Ubah port default 22. Izinkan dari IP tertentu saja. Rate limit koneksi SSH. |
| Anti-Scanning | 🔴 Kritis | Blokir paket XMAS, NULL, SYN-FIN, dan SYN-RST. Drop paket fragment. Proteksi terhadap port scanning. |
| Rate Limiting | 🔴 Kritis | Terapkan rate limiting untuk SSH (3/min), HTTP (30/s per IP), dan UDP. Gunakan connlimit untuk batasi koneksi simultan. |
| Logging & Monitoring | 🟡 Penting | Aktifkan logging untuk semua paket yang ditolak. Pisahkan log ke file khusus. Konfigurasi log rotation. Deploy fail2ban untuk auto-ban. |
| Persistensi Rules | 🟡 Penting | Simpan rules menggunakan iptables-persistent atau iptables-save. Verifikasi rules aktif setelah reboot. |
| IPv6 Firewall | 🟡 Penting | Terapkan rules ip6tables yang konsisten. Banyak administrator lupa mengamankan IPv6 — penyerang bisa mengeksploitasi celah ini. |
| Backup & Recovery | 🟡 Penting | Backup rules sebelum perubahan besar. Simpan di lokasi terpisah. Buat script recovery untuk akses darurat. |
| Regular Audit | 🟢 Standar | Audit rules secara berkala. Hapus rules yang tidak diperlukan. Gunakan nmap untuk port scan dari luar. Review log setiap minggu. |
| Dokumentasi | 🟢 Standar | Dokumentasikan setiap rule dengan komentar. Buat diagram topologi jaringan. Simpan changelog konfigurasi firewall. |
Setelah menerapkan konfigurasi firewall, selalu verifikasi dari luar menggunakan
nmap -sS -sV -p- server_ip untuk memastikan hanya port yang
diizinkan yang terbuka. Juga cek dari ShieldsUP!
atau GRC untuk validasi
tambahan. Jika ada port terbuka yang tidak diharapkan, segera perbaiki rules.
10. Quiz: Uji Pemahamanmu
Jawab pertanyaan berikut untuk menguji pemahaman kamu tentang firewall hardening di Linux. Pilih satu jawaban terbaik untuk setiap pertanyaan.