Melindungi Apache dari Brute Force, Bot, Scanning, dan HTTP Flood
Alur kerja sederhana :

Instalasi :
su -
apt update
apt install fail2ban nftables -y
Aktifkan Fail2ban agar berjalan sekarang dan otomatis ketika server boot:
systemctl enable --now fail2ban
Periksa status:
systemctl status fail2ban --no-pager
Kondisi yang diharapkan adalah service berstatus:
Active: active (running)
Pastikan APache mencatat log
Fail2ban bergantung pada log. Pastikan file log Apache tersedia:
ls -lh /var/log/apache2/
File yang umum antara lain:
- /var/log/apache2/access.log
- /var/log/apache2/error.log
- /var/log/apache2/other_vhosts_access.log
Pantau access log secara real-time:
tail -f /var/log/apache2/access.log
Contoh baris log:
103.10.20.30 - - [08/Sep/2026:10:10:22 +0700] "GET /index.php HTTP/1.1" 200 5812
Prinsip konfigurasi fail2ban
Hindari mengubah /etc/fail2ban/jail.conf secara langsung. Simpan kustomisasi di jail.local atau di direktori /etc/fail2ban/jail.d/. Pada tutorial ini digunakan:
/etc/fail2ban/jail.d/apache.local
Aktifkan jail apache bawaan
Buat file konfigurasi:
nano /etc/fail2ban/jail.d/apache.local
Contoh baseline:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1d
banaction = nftables
[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache2/*error.log
maxretry = 5
[apache-badbots]
enabled = true
port = http,https
logpath = /var/log/apache2/*access.log
maxretry = 1
bantime = 24h
[apache-botsearch]
enabled = true
port = http,https
logpath = /var/log/apache2/*error.log
maxretry = 2
[apache-noscript]
enabled = true
port = http,https
logpath = /var/log/apache2/*error.log
maxretry = 3
[apache-overflows]
enabled = true
port = http,https
logpath = /var/log/apache2/*error.log
maxretry = 2
Membuat filter http flood
Untuk menghitung request HTTP dari alamat IP yang sama, buat filter khusus:
nano /etc/fail2ban/filter.d/apache-rate-limit.conf
[Definition]
failregex = ^(?:\S+:\d+\s+)?<HOST>\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?:GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH)\s+\S+(?:\s+HTTP/\d(?:\.\d+)?)?"\s+\d{3}\s+
ignoreregex =
Perhatian: Regex harus sesuai dengan format LogFormat Apache yang digunakan. Selalu uji dengan fail2ban-regex sebelum mengandalkannya di server produksi.
Membuat jail rate limit apache
Tambahkan ke /etc/fail2ban/jail.d/apache.local:
[apache-rate-limit]
enabled = true
filter = apache-rate-limit
port = http,https
protocol = tcp
logpath = /var/log/apache2/*access.log
findtime = 10
maxretry = 150
bantime = 1h
banaction = nftables
| Parameter | Contoh | Makna |
| findtime | 10 | Jendela waktu pengamatan 10 detik. |
| maxretry | 150 | Jika 150 kecocokan terjadi dalam jendela waktu, IP dapat diban. |
| bantime | 1h | IP diblokir selama 1 jam. |
| banaction | nftables | Action firewall yang digunakan untuk memasang blokir. |
Nilai 150 request/10 detik bukan angka universal. Website API, AJAX-heavy, reverse proxy, atau banyak pengguna di balik NAT mungkin membutuhkan threshold lebih tinggi untuk mengurangi false positive.
ISI FILE nftables.conf
/etc/nftables.conf
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
iifname "lo" accept
ct state established,related accept
ct state invalid drop
ip protocol icmp accept
ip6 nexthdr ipv6-icmp accept
tcp dport 22 accept
tcp dport 80 accept
tcp dport 443 accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
Whitelist Alamat IP Administrator
Tambahkan pada bagian [DEFAULT] bila diperlukan:
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
Jika memiliki IP publik administrator statis, tambahkan hanya IP tersebut. Hindari whitelist subnet publik yang terlalu luas.
Validasi Konfigurasi
Sebelum restart Fail2ban, lakukan test konfigurasi:
fail2ban-client -t
Kondisi yang diharapkan:
OK: configuration test is successful
Uji Regex
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-rate-limit.conf
Periksa jumlah matched. Jika selalu 0 meskipun access.log berisi request, kemungkinan format log tidak cocok dengan regex.
Restart dan Verifikasi Jail
systemctl restart fail2ban
systemctl status fail2ban --no-pager
fail2ban-client status
Periksa jail rate limit:
fail2ban-client status apache-rate-limit
Contoh informasi penting: Currently failed, Total failed, Currently banned, Total banned, dan Banned IP list.
Melihat Log Fail2ban
tail -f /var/log/fail2ban.log
# atau
journalctl -u fail2ban -f
Ketika ban terjadi, biasanya muncul baris dengan nama jail dan alamat IP yang diblokir.
Melihat Rule nftables
nft list ruleset
# atau lebih spesifik
nft list ruleset | grep -i f2b
Poin penting: Jika nft list ruleset menghasilkan output kosong, itu berarti belum ada ruleset nftables aktif pada saat perintah dijalankan. Hal ini bisa terjadi meskipun paket nftables sudah terinstal. Fail2ban harus memiliki jail aktif dan action firewall yang benar agar rule terkait Fail2ban muncul.
Troubleshooting : nft list ruleset Kosong
Lakukan pemeriksaan berurutan berikut.
Periksa service Fail2ban :
systemctl status fail2ban --no-pager
Pastikan Active: active (running).
Periksa konfigurasi :
fail2ban-client -t
Perbaiki error konfigurasi jika test gagal.
Periksa daftar jail :
fail2ban-client status
Jika Number of jail: 0, maka tidak ada jail yang aktif.
Periksa jail Apache :
fail2ban-client status apache-rate-limit
Jika jail tidak ditemukan, konfigurasi belum termuat.
Periksa action nftables :
fail2ban-client get apache-rate-limit actions
Pastikan jail mempunyai action firewall.
Cari konfigurasi nftables :
fail2ban-client -d | grep -i nft
Membantu melihat action/config yang di-resolve Fail2ban.
Periksa ruleset :
nft list ruleset
Setelah jail/action aktif, rule Fail2ban seharusnya dapat muncul.
Pengujian Ban Manual
Untuk memastikan action firewall benar-benar bekerja, gunakan IP dokumentasi berikut sebagai target uji:
fail2ban-client set apache-rate-limit banip 192.0.2.100
Periksa status jail:
fail2ban-client status apache-rate-limit
Kemudian periksa nftables:
nft list ruleset
Jika rule muncul dan IP terdaftar sebagai banned, jalur Fail2ban -> nftables bekerja.
Hapus ban setelah pengujian:
fail2ban-client set apache-rate-limit unbanip 192.0.2.100
Jail Recidive untuk Penyerang Berulang
Recidive dapat digunakan untuk memberi ban lebih lama kepada IP yang berkali-kali terkena ban.
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
findtime = 1d
maxretry = 5
bantime = 7d
banaction = nftables[type=allports]
Setelah menambah konfigurasi:
fail2ban-client -t
systemctl restart fail2ban
