บทความนี้อาจมีลิงก์ affiliate — เราได้รับค่าคอมมิชชันเมื่อท่านซื้อผ่านลิงก์ของเรา ไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับท่าน
คู่มือ Fail2ban 2026: ป้องกัน SSH Brute Force บน VPS Linux ทีละขั้นตอน

VPS Security · Linux

คู่มือ Fail2ban 2026: ป้องกัน SSH Brute Force บน VPS Linux ทีละขั้นตอน

โดย ทีมรีวิว CloudPicked · อัปเดตล่าสุด ตุลาคม 2026

สารบัญ

  1. Fail2ban คืออะไร
  2. หลักการทำงาน
  3. ติดตั้ง Fail2ban บน Ubuntu/Debian
  4. ตั้งค่า jail.local
  5. ปกป้อง SSH
  6. ปกป้อง Nginx, Apache, WordPress
  7. คำสั่งพื้นฐาน
  8. การตั้งค่าขั้นสูง (Recidive Jail)
  9. Fail2ban vs CrowdSec
  10. FAQ

ทุกครั้งที่ 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 และอื่นๆ

ข้อเท็จจริงที่ verify แล้ว (GitHub fail2ban/fail2ban, ตุลาคม 2026)

Fail2ban v1.1.x · Python ≥ 3.5 · GPLv2 · รองรับ IPv6 ตั้งแต่ v0.10 · ใช้งานได้กับ iptables / nftables / ufw

หลักการทำงานของ Fail2ban

Fail2ban ทำงานเป็น 3 ขั้นตอน:

  1. Monitor log — อ่าน log file เช่น /var/log/auth.log, /var/log/nginx/access.log อย่างต่อเนื่อง
  2. Match filter — ใช้ regular expression ตรวจจับบรรทัดที่ตรงกับ pattern เช่น "Failed password" หรือ "Invalid user"
  3. 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.4ban IP ทันที
sudo fail2ban-client reloadโหลด config ใหม่โดยไม่ restart
sudo fail2ban-client restartrestart 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: เลือกอะไรดี

ฟีเจอร์Fail2banCrowdSec
ฟรี/Open-sourceใช่ (GPLv2)ใช่ (MIT)
รูปแบบ threat intelligenceLocal log เท่านั้นCrowdsourced + shared blocklist
ความซับซ้อนง่าย ตั้งค่าไวมากกว่า มี API, bouncer
False positiveบางครั้งน้อยกว่า (community verified)
Resource usageเบา (~10-20 MB RAM)มากกว่าเล็กน้อย
Community/docsเยอะมาก มี 10+ ปีกำลังโต (2020+)
เหมาะกับVPS เดี่ยว, shared hostingMulti-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 นั้นก่อน

ข้อมูลในบทความนี้อ้างอิงจาก GitHub repository fail2ban/fail2ban และเอกสาร official ณ ตุลาคม 2026 — ตรวจสอบเวอร์ชันล่าสุดที่ fail2ban.org