VPS Security · Linux
คู่มือ Fail2ban 2026: ป้องกัน SSH Brute Force บน VPS Linux ทีละขั้นตอน
สารบัญ
ทุกครั้งที่ VPS ของคุณออนไลน์ มี bot นับพันตระเวนสแกนพอร์ต 22 ตลอด 24 ชั่วโมง พยายาม login ด้วย password คาดเดาได้ซ้ำแล้วซ้ำเล่า Fail2ban คือเครื่องมือมาตรฐานของ Linux server ที่จับพฤติกรรมเหล่านี้และบล็อก IP อัตโนมัติก่อนที่จะเจาะระบบได้
Fail2ban คืออะไร และทำไม VPS ทุกเครื่องต้องมี
Fail2ban เป็น open-source daemon ที่พัฒนาด้วย Python สแกน log file ของระบบแล้วตรวจจับ pattern ที่น่าสงสัย เช่น login ผิดซ้ำหลายครั้ง เมื่อตรวจพบ มันจะเพิ่มกฎ firewall (iptables, nftables, หรือ ufw) เพื่อบล็อก IP นั้นชั่วคราว
เวอร์ชันล่าสุดคือ v1.1.x รองรับ Python ≥ 3.5 และใช้งานได้กับ Ubuntu, Debian, CentOS, AlmaLinux, Rocky Linux และ distro อื่นๆ ทุกตัว Fail2ban ปกป้องได้หลาย service พร้อมกัน: SSH, Nginx, Apache, WordPress login, FTP, Mail server และอื่นๆ
- ฟรี 100% เป็น open-source ภายใต้ GPLv2 license
- รองรับ IPv4 และ IPv6 (ตั้งแต่ v0.10 เป็นต้นไป)
- ทำงานร่วมกับ iptables, nftables, ufw, pf (BSD), firewalld
- มี filter สำเร็จรูปสำหรับ service ยอดนิยม (sshd, nginx, apache, postfix ฯลฯ)
- ตั้งค่าผ่านไฟล์ .conf ธรรมดา ง่ายต่อการ customize
ข้อเท็จจริงที่ verify แล้ว (GitHub fail2ban/fail2ban, ตุลาคม 2026)
Fail2ban v1.1.x · Python ≥ 3.5 · GPLv2 · รองรับ IPv6 ตั้งแต่ v0.10 · ใช้งานได้กับ iptables / nftables / ufw
หลักการทำงานของ Fail2ban
Fail2ban ทำงานเป็น 3 ขั้นตอน:
- Monitor log — อ่าน log file เช่น
/var/log/auth.log,/var/log/nginx/access.logอย่างต่อเนื่อง - Match filter — ใช้ regular expression ตรวจจับบรรทัดที่ตรงกับ pattern เช่น "Failed password" หรือ "Invalid user"
- Execute action — เมื่อ IP เดียวกัน trigger filter เกิน
maxretryครั้งในfindtimeวินาที จะสั่ง ban IP นั้นเป็นเวลาbantime
กฎ firewall ที่สร้างขึ้นอยู่ใน chain พิเศษ f2b-sshd (สำหรับ sshd) ทำให้ไม่รบกวนกฎ firewall เดิมของคุณ
# ตัวอย่าง log ที่ Fail2ban ตรวจจับ (SSH)
Oct 30 01:23:45 myserver sshd[12345]: Failed password for root from 45.142.212.10 port 54321 ssh2
Oct 30 01:23:47 myserver sshd[12345]: Failed password for root from 45.142.212.10 port 54321 ssh2
Oct 30 01:23:49 myserver sshd[12345]: Failed password for root from 45.142.212.10 port 54321 ssh2
# → ครบ maxretry=3 ใน findtime → Fail2ban ban IP นี้
ติดตั้ง Fail2ban บน Ubuntu/Debian
เปิด terminal แล้วรันคำสั่งต่อไปนี้:
# อัพเดท package list และติดตั้ง
sudo apt update
sudo apt install fail2ban -y
# ตรวจสอบว่า service รันอยู่
sudo systemctl status fail2ban
# เปิดให้ start อัตโนมัติเมื่อ reboot
sudo systemctl enable fail2ban
หลังติดตั้ง Fail2ban จะทำงานทันทีพร้อม config default ที่ปกป้อง SSH ด้วยค่า maxretry=5 แต่เราควรปรับแต่งเพิ่มเติม
หมายเหตุสำหรับ CentOS/AlmaLinux/Rocky Linux
# ติดตั้งผ่าน EPEL repository
sudo dnf install epel-release -y
sudo dnf install fail2ban -y
sudo systemctl enable --now fail2ban
ตั้งค่า jail.local — ไฟล์หลักที่ต้องแก้
กฎ: อย่าแก้ /etc/fail2ban/jail.conf โดยตรง เพราะจะถูกทับเมื่อ update package แทนที่ ให้สร้าง jail.local ซึ่งจะ override ค่าใน jail.conf:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
ค่าพื้นฐานใน [DEFAULT] section
[DEFAULT]
# ระยะเวลา ban IP (วินาที, นาที, ชั่วโมง) — 1h = บล็อก 1 ชั่วโมง
bantime = 1h
# หน้าต่างเวลาที่นับ maxretry (10 นาที)
findtime = 10m
# จำนวนครั้งที่ผิดก่อน ban
maxretry = 5
# IP ที่ไม่ ban เด็ดขาด (ใส่ IP ของคุณด้วย!)
ignoreip = 127.0.0.1/8 ::1 YOUR_HOME_IP/32
# backend สำหรับ monitor log (auto = ตรวจหาอัตโนมัติ)
backend = auto
ต้องการ VPS ที่เหมาะกับการรัน Fail2ban?
แนะนำ VPS ที่มี root access เต็มรูปแบบ รองรับ Ubuntu/Debian ล่าสุด และมีเซิร์ฟเวอร์ในไทย/สิงคโปร์
ดู DigitalOcean Droplets AsiaGB VPS ไทยปกป้อง SSH — Jail ที่สำคัญที่สุด
Fail2ban มาพร้อม filter sshd สำเร็จรูป ใน jail.local เพิ่ม:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 2h
findtime = 5m
ถ้าคุณเปลี่ยน SSH port เป็นอื่น (เช่น 2222) ให้แก้ port = 2222
หลังแก้ไขแล้วให้ reload:
sudo systemctl reload fail2ban
# หรือ
sudo fail2ban-client reload
ปกป้อง Nginx, Apache และ WordPress Login
Fail2ban มี filter สำหรับ web server หลายตัว:
Nginx — ป้องกัน HTTP flooding และ bad bots
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
Apache
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
WordPress Login (wp-login.php) — สำคัญมาก
สร้าง filter ใหม่สำหรับ WordPress โดยตรง:
# สร้างไฟล์ filter
sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 200
ignoreregex =
จากนั้นเพิ่มใน jail.local:
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 5m
bantime = 24h
คำสั่งพื้นฐาน Fail2ban ที่ต้องรู้
| คำสั่ง | ความหมาย |
|---|---|
sudo fail2ban-client status | แสดง jail ทั้งหมดที่ active |
sudo fail2ban-client status sshd | ดูสถานะ sshd jail + IP ที่ถูก ban |
sudo fail2ban-client set sshd unbanip 1.2.3.4 | ปลดบล็อก IP ที่ ban อยู่ |
sudo fail2ban-client set sshd banip 1.2.3.4 | ban IP ทันที |
sudo fail2ban-client reload | โหลด config ใหม่โดยไม่ restart |
sudo fail2ban-client restart | restart Fail2ban |
sudo tail -f /var/log/fail2ban.log | ดู log แบบ real-time |
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf | ทดสอบ filter กับ log จริง |
การตั้งค่าขั้นสูง: Recidive Jail (แบน permanent)
Recidive jail เพิ่มชั้นป้องกันพิเศษ: ถ้า IP ถูก ban ซ้ำหลายครั้งใน jail อื่น recidive จะ ban นาน 1 สัปดาห์หรือถาวร ป้องกัน attacker ที่วนกลับมาหลัง bantime หมด
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = iptables-allports[name=recidive]
bantime = 1w
findtime = 1d
maxretry = 5
Whitelist IP สำคัญ (ป้องกัน lock out ตัวเอง)
ใส่ IP ของคุณใน ignoreip ใน [DEFAULT] เสมอ:
ignoreip = 127.0.0.1/8 ::1 203.0.113.10/32 10.0.0.0/8
ถ้า IP ไม่คงที่ ให้ whitelist ที่ firewall หรือใช้ SSH key แทน password authentication
ตั้งค่า Email Alert เมื่อมีการ ban
[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban Alert
mta = sendmail
action = %(action_mwl)s # ban + whois + log
Fail2ban vs CrowdSec: เลือกอะไรดี
| ฟีเจอร์ | Fail2ban | CrowdSec |
|---|---|---|
| ฟรี/Open-source | ใช่ (GPLv2) | ใช่ (MIT) |
| รูปแบบ threat intelligence | Local log เท่านั้น | Crowdsourced + shared blocklist |
| ความซับซ้อน | ง่าย ตั้งค่าไว | มากกว่า มี API, bouncer |
| False positive | บางครั้ง | น้อยกว่า (community verified) |
| Resource usage | เบา (~10-20 MB RAM) | มากกว่าเล็กน้อย |
| Community/docs | เยอะมาก มี 10+ ปี | กำลังโต (2020+) |
| เหมาะกับ | VPS เดี่ยว, shared hosting | Multi-server, enterprise |
คำแนะนำ: สำหรับ VPS ส่วนตัวหรือ small business server แนะนำ Fail2ban เป็นตัวแรก เพราะติดตั้งง่าย documentation เยอะ และเป็น standard ที่ sysadmin ทั่วโลกรู้จักดี CrowdSec เหมาะกับ infrastructure หลาย server ที่อยากแชร์ threat data กัน
อ่านเพิ่มเติม
คำถามที่พบบ่อย (FAQ)
Q: Fail2ban ทำงานกับ UFW ได้ไหม?
A: ได้ ตั้งค่า banaction = ufw ใน jail.local หรือใช้ action = %(action_)s ซึ่งจะตรวจ backend อัตโนมัติ Fail2ban รองรับทั้ง iptables, nftables และ ufw
Q: Fail2ban ใช้ RAM เท่าไร?
A: โดยทั่วไป 10-20 MB ขึ้นอยู่กับจำนวน jail ที่เปิด เหมาะกับ VPS ขนาดเล็กตั้งแต่ 512 MB RAM ขึ้นไป
Q: Fail2ban รีเซ็ต ban list เมื่อ restart ไหม?
A: ค่า default = ใช่ IP ที่ ban อยู่จะถูกปลดเมื่อ Fail2ban restart ถ้าต้องการให้คงอยู่ ใช้ dbfile = /var/lib/fail2ban/fail2ban.sqlite3 (default ใน version ใหม่)
Q: ถ้า block ตัวเองโดยไม่ตั้งใจต้องทำอย่างไร?
A: เข้า server ผ่าน VPS Console (KVM/IPMI) ของ provider แล้วรัน sudo fail2ban-client set sshd unbanip YOUR_IP หรือ sudo iptables -D f2b-sshd -s YOUR_IP -j REJECT
Q: Fail2ban ทำงานกับ IPv6 ได้ไหม?
A: ได้ตั้งแต่ v0.10 รองรับ IPv6 เต็มรูปแบบ ตรวจสอบว่า backend (iptables/ip6tables หรือ nftables) รองรับ IPv6 ด้วย
Q: ควรตั้ง maxretry เท่าไรสำหรับ SSH?
A: แนะนำ maxretry = 3 สำหรับ SSH เพราะคนปกติไม่ควร login ผิดเกิน 3 ครั้ง ถ้า login ผิดบ่อยจาก IP ของตัวเอง ควร whitelist IP นั้นก่อน