Server/Infra 27 Sep 2026 49 views 0 komentar

Fail2ban dan UFW untuk VPS Ubuntu - Setup Firewall dan Ban IP otomatis Anti Brute Force

Fail2ban dan UFW untuk VPS Ubuntu - Setup Firewall dan Ban IP otomatis Anti Brute Force

Kemarin malam saya cek log SSH di VPS, dan kayaknya ada yang iseng banget. Lebih dari 2000 percobaan login gagal dalam 24 jam. Dari IP-address berbeda-beda, nyoba password "admin", "root", "123456", dan kombinasi lainnya. Kalau VPS kamu terbuka ke internet tanpa proteksi, ini cuma soal waktu sebelum ada yang tembus.

Cerita ini bikin saya sadar satu hal: setup firewall dan ban IP otomatis itu bukan opsional, tapi WAJIB dari hari pertama VPS kamu hidup. Dua tool yang paling sering saya pakai adalah UFW (Uncomplicated Firewall) untuk filter port, dan Fail2ban untuk otomatis ban IP yang nyoba brute force. Kombinasi keduanya bikin VPS jadi jauh lebih susah dibobol.

Di artikel ini saya mau share setup lengkap yang saya pakai di production, mulai dari instalasi, konfigurasi jail, sampai monitoring. Semuanya pakai Ubuntu 22.04/24.04 yang kebetulan paling umum dipakai.

Apa Itu UFW dan Kenapa Pakai Itu?

UFW singkatan dari Uncomplicated Firewall. Ini adalah frontend untuk iptables yang bikin konfigurasi firewall jauh lebih gampang. Daripada kamu hafal sintaks iptables yang rumit banget, UFW ngasih interface yang sederhana: ufw allow 22, ufw deny 3306, gitu aja.

Skenario yang paling sering saya temui: VPS baru dari provider (DigitalOcean, Vultr, atau Hetzner) default-nya semua port terbuka. Artinya MySQL (3306), PostgreSQL (5432), Redis (6379), bahkan Elasticsearch (9200) bisa diakses dari mana-mana. Ini berbahaya banget karena database-database itu biasanya tanpa password yang kuat di awal setup.

Step 1: Setup UFW Firewall

Pertama, install UFW (biasanya sudah pre-installed di Ubuntu):

# Install UFW
sudo apt update && sudo apt install ufw -y

# Pastikan default policy: deny incoming, allow outgoing
sudo ufw default deny incoming
sudo ufw default allow outgoing

# ALLOW SSH dulu sebelum enable firewall!
# Kalau kamu skip ini, kamu bakal lockout dari VPS sendiri
sudo ufw allow 22/tcp

# Optional: ganti SSH port ke non-standar (misal 2222)
# Edit /etc/ssh/sshd_config, set Port 2222
# Lalu: sudo ufw allow 2222/tcp

# Allow HTTP dan HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Kalau kamu jalanin web app di port lain
# sudo ufw allow 3000/tcp  # Node.js app
# sudo ufw allow 8080/tcp  # alternative HTTP

# DENY semua port database ke public
# Ini penting banget - jangan biarkan DB terbuka
# sudo ufw deny 3306/tcp    # MySQL
# sudo ufw deny 5432/tcp   # PostgreSQL
# sudo ufw deny 6379/tcp   # Redis

# Enable firewall
sudo ufw enable

# Cek status
sudo ufw status verbose

Output-nya kira-kira begini:

Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Penting: Kalau kamu pakai Cloudflare (dan seharusnya pakai), kamu bisa restrict HTTP/HTTPS port cuma dari IP Cloudflare. Tapi itu topik lanjutan yang butuh artikel sendiri. Untuk sekarang, allow 80/443 dari mana saja sudah cukup aman selama app kamu properly configured.

Step 2: Install dan Konfigurasi Fail2ban

UFW bagus untuk filter port, tapi dia gak bisa deteksi pola serangan. Kalau ada IP yang nyoba SSH 100 kali dalam 1 menit, UFW tetep ngijinin karena port 22 itu ALLOW. Nah, Fail2ban yang nangkap pola brute force ini dan otomatis ban IP-nya lewat iptables rules.

# Install Fail2ban
sudo apt update && sudo apt install fail2ban -y

# Cek status
sudo systemctl status fail2ban
sudo fail2ban-client status

Fail2ban punya konsep yang namanya jail. Setiap jail memantau satu service (SSH, Nginx, Apache, dll) dan ngeset rules kapan harus ban IP. Default-nya cuma jail SSH yang aktif, tapi kamu bisa enable jail lain.

Step 3: Konfigurasi SSH Jail

Fail2ban baca konfigurasi dari /etc/fail2ban/jail.local. Jangan edit jail.conf langsung karena bakal di-overwrite pas update. Buat file jail.local aja:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Setingan yang saya pakai di production:

[DEFAULT]
# Ban IP selama 1 jam (3600 detik)
# Untuk repeat offender, bisa naikkan ke 24 jam
bantime  = 3600

# Hitung percobaan dalam window 10 menit
findtime  = 600

# Ban kalau 3 kali gagal
maxretry  = 3

# Backend yang dipakai (systemd untuk Ubuntu 22.04+)
backend  = systemd

# Email notifikasi kalau ada ban (butuh mailutils)
# destemail = [email protected]
# sender = [email protected]
# action = %(action_mwl)s

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600

Beberapa parameter yang penting:

  • bantime: Berapa lama IP di-ban. Default 1 jam. Untuk serangan intensif, naikkin ke 24 jam (86400) atau bahkan permanent (bantime = -1).
  • findtime: Window waktu untuk hitung maxretry. Kalau 3 kali gagal dalam 10 menit, ban.
  • maxretry: Jumlah maksimal percobaan gagal sebelum ban. 3 itu balance yang baik.
  • backend: Ubuntu 22.04+ pakai systemd untuk logging, jari pakai backend = systemd.

Restart Fail2ban setelah edit konfigurasi:

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

Output:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

Step 4: Recidive Jail untuk Repeat Offender

Beberapa attacker gak kapok. Setelah ban 1 jam berakhir, mereka balik lagi nyoba. Fail2ban punya jail khusus buat mereka, namanya recidive. Jail ini memantau log Fail2ban sendiri dan nge-ban IP yang udah di-ban berulang kali dalam periode tertentu.

[recidive]
enabled = true
logpath  = /var/log/fail2ban.log
banaction = iptables-allports
bantime  = 604800    # 7 hari
findtime = 86400     # 24 jam window
maxretry = 3         # 3x kena ban dalam 24 jam = ban 7 hari

Ini bikin IP yang kepincang terus-terusan kena ban 7 hari otomatis. Super efektif untuk bot yang gak pernah nyerah.

Step 5: Enable Jail untuk Nginx dan Web Server

Kalau kamu jalanin web server di VPS, enable juga jail untuk Nginx. Ini nangkap bot yang nyoba scan vulnerability di URL:

[nginx-http-auth]
enabled = true
port    = http,https
logpath = %(nginx_error_log)s

[nginx-botsearch]
enabled  = true
port     = http,https
logpath  = %(nginx_error_log)s
maxretry = 2

nginx-botsearch nangkap bot yang nyoba akses file kaya /.env, /wp-admin, /phpmyadmin, dan path-path yang gak ada. Dua kali nyoba, langsung kena ban.

# Setelah nambah jail, reload
sudo systemctl reload fail2ban

# Lihat semua jail yang aktif
sudo fail2ban-client status

Output:

Status
|- Number of jail:  3
`- Jail list: nginx-botsearch, nginx-http-auth, sshd

Step 6: Manual Ban dan Unban IP

Kadang kamu perlu manual ban IP yang nakal, atau unban IP yang kepincang padahal itu kamu sendiri (bisa kejadian kalau kamu salah password SSH berkali-kali).

# Lihat daftar IP yang di-ban di jail sshd
sudo fail2ban-client status sshd

# Manual ban IP
sudo fail2ban-client set sshd banip 1.2.3.4

# Unban IP (kalau kamu sendiri yang kepincang)
sudo fail2ban-client set sshd unbanip 1.2.3.4

# Lihat semua banned IP di semua jail
sudo iptables -L f2b-sshd -n

# Cek log Fail2ban
sudo tail -f /var/log/fail2ban.log

Step 7: Whitelist IP Kamu Sendiri

Biar kamu gak pernah kepincang, tambahin IP kamu ke whitelist (ignoreip). Ini penting banget kalau kamu akses VPS dari IP statis (misal dari kantor atau VPN).

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.1.100

Untuk cek IP publik kamu:

curl -s ifconfig.me

Tambahkan IP itu ke ignoreip, reload Fail2ban, dan kamu aman dari self-ban.

Tips dari Pengalaman: Hal-Hal yang Sering Lupa

1. Jangan lupa sudo ufw allow 22/tcp SEBELUM sudo ufw enable. Saya pernah lockout dari VPS DigitalOcean gara-gara ini. Untungnya ada console recovery, tapi tetep ribet.

2. Kalau kamu pakai Cloudflare, traffic SSH dan HTTP datang dari IP Cloudflare, bukan IP asli attacker. Fail2ban tetep bisa kerja untuk SSH karena SSH biasanya gak lewat Cloudflare proxy. Tapi untuk web attack, kamu perlu extract real IP dari header X-Forwarded-For atau CF-Connecting-IP.

3. Test konfigurasi sebelum reload: sudo fail2ban-client -t. Kalau ada syntax error, Fail2ban gak mau restart dan jail yang udah aktif mati semua.

4. Kalau kamu pakai Docker, perlu hati-hati. Docker otomatis nambah iptables rules yang bisa konflik sama UFW. Solusinya: set "iptables": false di /etc/docker/daemon.json atau pakai ufw-docker tool.

5. Monitor Fail2ban secara berkala. Saya pakai command ini tiap pagi buat cek ada yang nakal semalam: sudo fail2ban-client status sshd | grep "Total banned"

UFW vs iptables vs nftables - Mana yang Pilih?

Buat kamu yang baru kenal Linux firewall, pasti bingung kenapa ada beberapa tool yang kayaknya sama aja. Sederhananya gini: iptables adalah firewall engine bawaan kernel Linux, udah ada sejak 2001. nftables adalah pengganti modern iptables (sejak kernel 3.13). UFW dan firewalld adalah frontend yang nge-wrap iptables/nftables dengan sintaks yang lebih gampang.

  • iptables langsung: Full control tapi sintaks rumit. Cocok buat admin yang udah pengalaman. Contoh: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • nftables: Lebih cepat dan clean, tapi kurva belajarnya curam. Ubuntu 22.04 udah pakai ini di belakang layar.
  • UFW: Sintaks paling gampang, cocok untuk developer dan sysadmin pemula. ufw allow 22 dan selesai.
  • firewalld: Default di RHEL/CentOS/Fedora. Pakai konsep zone (public, home, internal, dll).

Untuk VPS Ubuntu, UFW adalah pilihan terbaik. Setup cepat, dokumentasi lengkap, dan komunitas Ubuntu udah export semuanya. Saya cuma pakai iptables langsung kalau butuh rules yang spesifik banget kayak rate-limiting per-IP atau custom chains.

FAQ: Pertanyaan yang Sering Muncul

Apakah Fail2ban bikin VPS jadi lambat? Gak. Fail2ban cuma baca log file dan nambahin/del rules ke iptables. CPU usage hampir nol. Memory footprint-nya sekitar 30-50MB. Untuk VPS $5 dengan 1GB RAM, ini gak masalah sama sekali.

Berapa lama bantime yang ideal? Untuk SSH, 1 jam (3600s) sudah cukup. Bot brute force biasanya pindah IP setelah di-ban, jadi 1 jam cukup buat bikin mereka pindah target. Tapi kalau kamu liat IP yang sama balik terus, naikkan ke 24 jam atau enable jail recidive buat auto-extend ke 7 hari.

Bisa pakai UFW dan Fail2ban bareng Docker? Bisa, tapi butuh konfigurasi extra. Docker otomatis nambahin iptables rules yang UFW gak lihat. Set "iptables": false di /etc/docker/daemon.json lalu buka port yang dibutuhkan manual lewat UFW. Atau pakai tool ufw-docker yang bisa kamu install dari GitHub.

Bagaimana kalau saya pakai SSH key, masih perlu Fail2ban? Ya, tetap perlu. SSH key bikin brute force hampir mustahil berhasil, tapi Fail2ban juga jaga service lain (Nginx, Apache, mail server). Plus, mengurangi noise di log juga valuable - daripada 2000 baris failed login per hari, kamu cuma liat beberapa baris ban notification.

Cheatsheet: Command yang Sering Dipakai

Saya bikin cheatsheet ini buat referensi cepat. Simpan atau bookmark biar gampang nyari kalau lupa:

# === UFW ===
sudo ufw status verbose        # Lihat semua rules
sudo ufw allow 80/tcp          # Buka port HTTP
sudo ufw deny 3306/tcp         # Block port MySQL
sudo ufw delete allow 8080/tcp # Hapus rule
sudo ufw reset                 # Reset semua rules
sudo ufw reload                # Reload tanpa disable

# === Fail2ban ===
sudo fail2ban-client status              # List semua jail
sudo fail2ban-client status sshd         # Detail jail sshd
sudo fail2ban-client set sshd banip X    # Ban IP manual
sudo fail2ban-client set sshd unbanip X  # Unban IP
sudo fail2ban-client reload              # Reload semua jail
sudo fail2ban-client -t                  # Test config

# === Monitoring ===
sudo fail2ban-client status sshd | grep "Total banned"  # Quick check
sudo iptables -L f2b-sshd -n            # List banned IPs
sudo journalctl -u fail2ban -f          # Live log

Integrasi dengan Cloudflare

Kalau kamu pakai Cloudflare sebagai CDN dan DNS, ada beberapa hal extra yang perlu kamu setting. Cloudflare proxy nge-hide IP asli VPS kamu, yang bagus untuk privacy. Tapi itu juga berarti traffic HTTP/HTTPS yang sampai ke VPS datang dari IP Cloudflare, bukan dari IP visitor asli.

Untuk SSH, ini bukan masalah karena SSH biasanya gak lewat Cloudflare proxy. Tapi kalau kamu pengen Fail2ban bisa deteksi web attack dari real IP visitor, kamu perlu parse header CF-Connecting-IP atau X-Forwarded-For di log Nginx.

# nginx.conf - set log format untuk Cloudflare
log_format cloudflare '$http_cf_connecting_ip '
    '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent"';

# Pakai di server block
access_log /var/log/nginx/access.log cloudflare;

Dengan log format ini, Fail2ban bisa baca IP asli visitor dari field pertama. Filter nginx-botsearch bakal otomatis pakai field itu untuk ban.

Yang juga penting: kamu bisa restrict UFW cuma allow HTTP/HTTPS dari IP Cloudflare aja, bukan dari mana-mana. Cloudflare publish daftar IP mereka, jadi kamu bisa buat script yang auto-update:

#!/bin/bash
# /usr/local/bin/ufw-cloudflare-update.sh
# Update Cloudflare IP list di UFW

CF_IPS=$(curl -s https://www.cloudflare.com/ips-v4)

# Hapus rule lama
sudo ufw delete allow 80/tcp
sudo ufw delete allow 443/tcp

# Tambah rule baru dari Cloudflare IPs
for ip in $CF_IPS; do
    sudo ufw allow from $ip to any port 80
    sudo ufw allow from $ip to any port 443
done

Tambahkan ke cron biar auto-update tiap minggu:

# crontab -e
0 3 * * 0 /usr/local/bin/ufw-cloudflare-update.sh >> /var/log/cf-ufw-update.log 2>&1

Ini bikin port 80/443 cuma bisa diakses dari Cloudflare. Bot yang langsung scan IP VPS kamu tanpa lewat Cloudflare bakal dapat connection refused.

Checklist Sebelum Deploy ke Production

Buat kamu yang baru pertama kali setup security di VPS, ini checklist yang saya pakai tiap kali deploy server baru. Print atau simpan ini biar gak ada yang kelewat:

  • UFW aktif: sudo ufw status harus show "Status: active"
  • SSH port di-allow: Pastikan port 22 (atau custom port) di-allow sebelum enable UFW
  • Database port di-deny: Port 3306, 5432, 6379 gak boleh ALLOW dari public
  • Fail2ban running: sudo systemctl status fail2ban harus active (running)
  • Jail SSH aktif: sudo fail2ban-client status sshd harus show jail info
  • Whitelist IP sendiri: Tambah IP kamu ke ignoreip biar gak self-ban
  • Recidive jail aktif: Untuk auto-extend ban buat repeat offender
  • SSH key authentication: Disable password auth di sshd_config: PasswordAuthentication no
  • Test SSH dari luar: Coba login dari komputer lain untuk pastikan gak lockout
  • Log monitoring: Set up logwatch atau journalctl alert buat daily summary

Kesimpulan

Setup UFW + Fail2ban ini cuma butuh 15-30 menit, tapi dampaknya keamanan VPS jadi jauh lebih baik. UFW nge-filter port yang terbuka, Fail2ban otomatis nge-ban IP yang nyoba brute force. Kombinasinya powerful banget, dan yang penting GRATIS.

Kalau kamu VPS-nya baru, jangan tunda setup ini. Saya udah liat terlalu banyak kasus VPS di-bobol cuma karena SSH terbuka tanpa proteksi. Iklan-iklan "cloud server mulai $5/bulan" dari provider kayak Vultr atau Hetzner itu beneran murah, tapi $5 itu bakal jadi sia-sia kalau VPS-nya gak diproteksi dari hari pertama.

Kamu udah setup firewall dan fail2ban di VPS-mu? Ada konfigurasi tambahan yang kamu pakai? Share di komen, saya pengen denger approach lain yang mungkin lebih bagus!


Bagikan artikel ini:

Komentar (0)

Belum ada komentar. Jadilah yang pertama memberikan tanggapan!

Tinggalkan Komentar