Firewall Hardening: Mengamankan Server Linux

TOKEN
📅 25 Juni 2026
📖 13 menit baca
Menengah
🔒 Keamanan Server

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.

📊 Alur Paket dalam iptables
🌐
INTERNET
Paket Masuk
🔍
PREROUTING
nat/mangle/raw
📥
INPUT
Ke lokal (server ini)
◄──►
🔀
FORWARD
Routing ke host lain
📤
OUTPUT → POSTROUTING
Paket keluar dari server

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.

Bash — iptables Complete Hardening Script
#!/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"
      
⚠️ Peringatan: Jangan Lock Out Diri Sendiri

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.

Bash — UFW Complete Setup
#!/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
      
✅ Tips: UFW Application Profiles

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

Bash — firewalld Configuration
#!/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.

Bash — Advanced Rate Limiting
#!/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
      
💡 Tips: Kapan Perlu DDoS Mitigation Eksternal

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.

Bash — Port Knocking dengan knockd
#!/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.

Bash — fail2ban Setup
#!/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
      
Bash — iptables Logging Configuration
# ============================================
# 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.
✅ Tips: Verifikasi Firewall dari Luar

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.

📝 Quiz Firewall Hardening

1. Default policy iptables apa yang paling aman untuk server produksi?

2. Chain mana dalam iptables yang menangani paket yang ditujukan untuk proses lokal di server?

3. Apa keunggulan utama firewalld dibandingkan iptables?

4. Apa fungsi utama fail2ban dalam konteks firewall hardening?

5. Apa yang dimaksud dengan port knocking?