ติดตั้ง Fail2ban บน VPS ป้องกัน Brute Force อัตโนมัติ
Fail2ban คือ daemon ที่คอย scan log file และ ban IP ที่พยายาม login ผิดเกินจำนวนที่กำหนดโดยอัตโนมัติ ไม่ต้องคอยดูเองทุกวัน เหมาะกับทุก VPS ที่ expose SSH หรือ web service ออก internet
ติดตั้ง Fail2ban
apt update
apt install fail2ban -y
สร้าง Local Config (อย่าแก้ไฟล์ .conf โดยตรง)
Fail2ban ใช้ระบบ override — ไฟล์ .local override ค่าจาก .conf เมื่ออัปเดต package ค่าจะไม่หายไป:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local
ตั้งค่า Default ใน [DEFAULT]
[DEFAULT]
bantime = 1h # ban นาน 1 ชั่วโมง
findtime = 10m # นับ attempt ใน 10 นาที
maxretry = 5 # ผิด 5 ครั้งโดน ban
ignoreip = 127.0.0.1/8 ::1 YOUR_HOME_IP
ใส่ IP บ้านหรือ IP office ใน ignoreip เพื่อป้องกัน lock ตัวเอง
เปิด SSH Jail
[sshd]
enabled = true
port = 2222 # ถ้าเปลี่ยน SSH port แล้ว
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
เปิด Nginx Jail (ถ้าใช้ Nginx)
[nginx-http-auth]
enabled = true
[nginx-limit-req]
enabled = true
logpath = /var/log/nginx/error.log
Start และ Enable Fail2ban
systemctl enable fail2ban
systemctl start fail2ban
ดู Status และ Banned IP
# ดู jail ที่ active
fail2ban-client status
# ดู IP ที่โดน ban ใน SSH jail
fail2ban-client status sshd
# ดู log
tail -f /var/log/fail2ban.log
Unban IP (กรณี lock ตัวเอง)
fail2ban-client set sshd unbanip 1.2.3.4
ทดสอบว่า Ban ทำงาน
# ลอง SSH ผิดรหัสหลายครั้งจากเครื่องอื่น
# แล้วดู log
grep "Ban" /var/log/fail2ban.log
Jail สำหรับ WordPress Login
ถ้ารัน WordPress ควรตั้ง jail ป้องกัน brute force ที่ wp-login.php ด้วย:
# /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^ .* "POST /wp-login.php
ignoreregex =
# /etc/fail2ban/jail.local — เพิ่ม section นี้
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/access.log # หรือ apache2/access.log
maxretry = 5
bantime = 1h
findtime = 10m
systemctl reload fail2ban
fail2ban-client status wordpress
Jail สำหรับ Nginx 4xx Errors
ป้องกัน scanner ที่ probe URL สุ่ม:
[nginx-badbots]
enabled = true
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 24h
[nginx-noscript]
enabled = true
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
Recidive Jail: ถ้าโดน ban ซ้ำ ban ยาวขึ้น
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
bantime = 1w # ban 1 สัปดาห์
findtime = 1d # ถ้าโดน ban 5 ครั้งใน 1 วัน
maxretry = 5
ตรวจสอบว่า Fail2ban ทำงานถูกต้อง
ยืนยันว่า service ทำงาน และ jail กำลัง monitor log จริง ก่อนวางใจว่าเซิร์ฟเวอร์ถูกป้องกัน:
# 1. service ทำงานอยู่หรือไม่
systemctl status fail2ban
# 2. ดูสถานะ jail ทั้งหมดที่ enable
fail2ban-client status
# 3. ดูรายละเอียด jail sshd (จำนวน IP ที่โดน ban + log path)
fail2ban-client status sshd
# 4. ทดสอบ regex ของ filter กับ log จริง
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# 5. ดู iptables rule ที่ fail2ban สร้าง
iptables -L -n | grep -i f2b
fail2ban-regex จะบอกจำนวน "matched lines" — ถ้าได้ 0 ทั้งที่มี failed login ใน log แปลว่า filter regex ไม่ตรงกับรูปแบบ log ของเครื่องนี้ ต้องปรับ logpath หรือ filter ให้ถูก distroแก้ปัญหาที่พบบ่อย
Fail2ban start ล้มเหลว: "ERROR NOK: ('Failed to start',)"
# ดู error ละเอียด
journalctl -u fail2ban -n 50 --no-pager
# มักเกิดจาก jail.local syntax ผิด ตรวจสอบ
fail2ban-client -t # test config ก่อน start
IP ตัวเองโดน ban กลับเข้า SSH ไม่ได้
ignoreip ใน [DEFAULT] เสมอถ้าเกิดแล้ว ต้องใช้ console ของ provider (KVM console) เข้าไปแก้:
fail2ban-client set sshd unbanip YOUR.IP.HERE
# หรือ restart fail2ban (จะ clear ban ทั้งหมด ชั่วคราว)
systemctl restart fail2ban
Fail2ban ไม่ ban ทั้งที่ login ผิดซ้ำ ๆ
# ตรวจ log path ว่าถูกต้อง
fail2ban-client get sshd logpath
# ตรวจว่า filter regex match กับ log จริง
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# ดู jail status
fail2ban-client status sshd
Action iptables หาย หลัง reboot
Fail2ban เพิ่ม iptables rules ชั่วคราว ถ้า fail2ban ไม่ได้ start ก่อน network rules จะหาย ตรวจสอบ:
systemctl enable fail2ban # ให้ start อัตโนมัติ
systemctl status fail2ban
คำถามที่พบบ่อย
Fail2ban กับ UFW ทำงานร่วมกันได้ไหม?
ได้ Fail2ban จะเพิ่ม iptables rules โดยตรง ไม่ผ่าน UFW แต่ไม่ conflict กัน UFW จัดการ rule พื้นฐาน (เปิด/ปิด port) ส่วน Fail2ban จัดการ dynamic ban ตาม behavior ทั้งสองทำงานร่วมกันได้ดี
ควรตั้ง bantime นานแค่ไหน?
1 ชั่วโมงเพียงพอสำหรับ bot ทั่วไปที่ rotate IP บ่อย สำหรับ targeted attack ที่มาจาก IP ซ้ำให้ใช้ recidive jail ที่เพิ่ม bantime ทุกครั้งที่โดน ban ซ้ำ ระวังการตั้ง permanent ban (-1) โดยไม่มี ignoreip ที่ครอบคลุมพอ
Fail2ban กิน CPU หรือ RAM มากไหม?
น้อยมาก โดยปกติใช้ RAM ไม่เกิน 20–30 MB และ CPU ใกล้ 0% ยกเว้นตอนที่มี burst ของ log entries จำนวนมาก ปลอดภัยที่จะรันบน VPS 1 GB RAM
สรุป
Fail2ban ติดตั้งง่ายและทำงานอัตโนมัติโดยไม่ต้องดูแล เป็น layer แรกที่ควรมีทุก VPS ควบคู่กับ SSH hardening และ firewall ที่ตั้งค่าดีแล้ว อย่าลืมใส่ IP ตัวเองใน ignoreip ก่อนเสมอ