
VPS ที่เชื่อมต่ออินเทอร์เน็ตโดยตรงจะต้องเผชิญกับ SSH Brute Force Attack อยู่ตลอดเวลา บอทจากทั่วโลกสแกนหา Port 22 และพยายาม Login ด้วย username/password รวมกันนับล้านชุดต่อวัน แม้คุณจะตั้งรหัสผ่านที่แข็งแกร่ง แต่ก็ยังเปลืองทรัพยากรเซิร์ฟเวอร์โดยไม่จำเป็น
Fail2Ban คือเครื่องมือที่ออกแบบมาแก้ปัญหานี้โดยตรง ทำงานโดยอ่าน Log ไฟล์แบบ Real-time และแบน IP ที่พยายาม Login ผิดเกินกำหนดโดยอัตโนมัติ บทความนี้พาคุณตั้งค่าตั้งแต่ต้นจนจบบน Ubuntu 22.04
สิ่งที่ต้องมีก่อน: VPS Ubuntu 20.04/22.04 ที่มี Root หรือ Sudo access, เข้าถึงได้ผ่าน SSH
SSH Brute Force Attack คืออะไร?
Brute Force Attack คือการพยายาม Login โดยลอง username/password ทุกชุดที่เป็นไปได้ ไม่ว่าจะเป็น root/123456, admin/password หรือรหัสผ่านที่รั่วออกมาจาก Data Breach ครั้งก่อน ๆ
ปัญหาคือแม้รหัสผ่านจะแข็งแกร่ง บอทก็ยังส่ง Request มาเรื่อย ๆ ซึ่งสร้างภาระให้ CPU, เปลือง Log Space และทำให้ auth.log อ่านยากจนหาเหตุการณ์จริงไม่เจอ
Fail2Ban คืออะไร ทำงานอย่างไร?
Fail2Ban เป็น Intrusion Prevention Framework ที่เขียนด้วย Python ทำงาน 3 ขั้นตอนหลัก:
- Monitor: อ่าน Log ไฟล์ต่าง ๆ เช่น
/var/log/auth.logแบบ Real-time - Detect: ตรวจหา Pattern ที่ตรงกับ Filter (เช่น Failed password for root from 1.2.3.4)
- Act: เพิ่มกฎ iptables หรือ nftables เพื่อ Block IP นั้นชั่วคราว
เมื่อ IP ถูกแบน Traffic จากต้นทางนั้นจะถูก Drop ที่ Firewall ทันที Fail2Ban จะ Unban อัตโนมัติหลังครบเวลาที่ตั้งไว้ (default 10 นาที)
ขั้นที่ 1 — อัปเดตระบบและติดตั้ง Fail2Ban
sudo apt update && sudo apt upgrade -y sudo apt install fail2ban -y
ตรวจสอบว่าติดตั้งสำเร็จและเริ่มทำงานแล้ว:
sudo systemctl status fail2ban
ถ้าเห็น Active: active (running) แสดงว่า Fail2Ban ทำงานปกติด้วยค่า Default แล้ว
ตั้งให้เริ่มอัตโนมัติหลัง Reboot:
sudo systemctl enable fail2ban
ขั้นที่ 2 — เข้าใจโครงสร้าง Config
Fail2Ban มีไฟล์ Config หลัก 2 ไฟล์ที่ต้องรู้จัก:
/etc/fail2ban/jail.conf— ค่า Default ที่มาจาก Package ห้ามแก้ไขโดยตรง เพราะจะถูก Overwrite เมื่ออัปเดต/etc/fail2ban/jail.local— ไฟล์ Custom ของเรา สร้างขึ้นเองและ Override ค่าใน jail.conf
Best Practice: แก้ไขเฉพาะ jail.local เสมอ อย่าแตะ jail.conf เพื่อให้ Config ของเราปลอดภัยเมื่ออัปเดต Package
ขั้นที่ 3 — สร้างและตั้งค่า jail.local
สร้างไฟล์ jail.local ใหม่:
sudo nano /etc/fail2ban/jail.local
วาง Config นี้ลงไป แล้วปรับค่าตามต้องการ:
[DEFAULT] # แบน IP ที่ Login ผิด 5 ครั้งภายใน 10 นาที bantime = 3600 # แบนนาน 1 ชั่วโมง (วินาที) findtime = 600 # ช่วงเวลาที่นับการผิด (10 นาที) maxretry = 5 # จำนวนครั้งที่ยอมให้ผิด # IP ที่ไม่ต้องการแบน (เครื่องของคุณเอง) ignoreip = 127.0.0.1/8 ::1 [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 # SSH เข้มงวดกว่า — ผิด 3 ครั้งก็แบนแล้ว bantime = 7200 # แบน 2 ชั่วโมง
⚠️ สำคัญ: ถ้าคุณเปลี่ยน SSH Port ให้ระบุ Port ที่ถูกต้อง เช่น port = 2222 แทน port = ssh มิฉะนั้น Fail2Ban จะไม่ Monitor Port ที่คุณใช้จริง
บันทึกไฟล์ด้วย Ctrl+O แล้วออกด้วย Ctrl+X จากนั้น Restart Fail2Ban:
sudo systemctl restart fail2ban
ขั้นที่ 4 — ตรวจสอบสถานะและ Jail ที่ทำงานอยู่
ดูสรุปสถานะ Fail2Ban ทั้งหมด:
sudo fail2ban-client status
ดูรายละเอียดเฉพาะ SSH jail:
sudo fail2ban-client status sshd
ผลลัพธ์จะแสดงจำนวน IP ที่ถูกแบนอยู่ในปัจจุบัน และจำนวน IP ทั้งหมดที่เคยถูกแบน
ขั้นที่ 5 — Unban IP ที่แบนผิดพลาด
ถ้าคุณหรือผู้ใช้งานที่ถูกต้องถูกแบนโดยไม่ตั้งใจ ให้ Unban ด้วยคำสั่ง:
sudo fail2ban-client set sshd unbanip 1.2.3.4
แทน 1.2.3.4 ด้วย IP ที่ต้องการ Unban
ป้องกันล่วงหน้า: เพิ่ม IP ของคุณใน ignoreip ภายใน jail.local เพื่อไม่ให้ถูกแบนไม่ว่าจะผิดกี่ครั้ง
ขั้นที่ 6 — ดู Log และตรวจสอบการทำงาน
Fail2Ban บันทึก Log ทุกการแบนและ Unban ไว้ที่:
sudo tail -f /var/log/fail2ban.log
ตัวอย่าง Log ที่แสดงการแบน IP:
2026-05-11 14:32:01,782 fail2ban.actions [12345]: NOTICE [sshd] Ban 185.22.xxx.xxx 2026-05-11 14:32:01,783 fail2ban.actions [12345]: NOTICE [sshd] Ban 91.108.xxx.xxx
ดู Log ของ SSH เพื่อยืนยันว่า Fail2Ban รับรู้ Attempt จริง:
sudo grep "Failed password" /var/log/auth.log | tail -20
ปรับแต่งเพิ่มเติม: เพิ่ม bantime สำหรับผู้ที่ถูกแบนซ้ำ
Fail2Ban รองรับ Recidive Jail ซึ่งจะแบน IP นาน 1 สัปดาห์ หาก IP นั้นถูกแบนซ้ำหลายครั้ง เพิ่มใน jail.local:
[recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 604800 # 1 สัปดาห์ findtime = 86400 # ดูย้อนหลัง 1 วัน maxretry = 3 # ถูกแบน 3 ครั้งใน 1 วัน → แบน 1 สัปดาห์
เพิ่ม jail สำหรับ Nginx, Apache และ WordPress
Fail2Ban ไม่ได้ปกป้องแค่ SSH เท่านั้น ถ้า VPS ของคุณรันเว็บเซิร์ฟเวอร์ Nginx หรือ Apache คุณสามารถเพิ่ม jail เพื่อบล็อก IP ที่โจมตี Layer 7 เช่น Brute Force หน้า Login ของ WordPress, การยิง 404 รัวๆ เพื่อสแกนช่องโหว่ หรือ Bad Bot ที่ดูดข้อมูลหนักจนเปลือง Bandwidth
jail สำหรับ Nginx (HTTP Auth + Bad Bot)
เพิ่มบล็อกนี้ลงใน /etc/fail2ban/jail.local สำหรับ VPS ที่ใช้ Nginx เป็น Web Server:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
[nginx-botsearch]
enabled = true
filter = nginx-botsearch
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 600
bantime = 7200 # บล็อกบอทที่สแกนหา path ช่องโหว่jail สำหรับ Apache
ถ้า VPS ของคุณใช้ Apache (เช่นมากับ DirectAdmin) ให้ใช้ filter ตระกูล apache-* แทน:
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 3600
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 86400 # บล็อก Bad Bot 1 วันjail สำหรับ WordPress (wp-login.php / xmlrpc.php)
WordPress คือเป้าหมายอันดับต้นๆ ของ Brute Force ผ่าน wp-login.php และ xmlrpc.php Fail2Ban ไม่มี filter สำเร็จรูปสำหรับ WordPress จึงต้องสร้าง filter เองที่ /etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =จากนั้นเพิ่ม jail ที่อ้างถึง filter นี้ใน jail.local (ปรับ logpath ให้ตรงกับ Access Log ของโดเมนคุณ):
[wordpress] enabled = true filter = wordpress port = http,https logpath = /var/log/nginx/access.log maxretry = 5 findtime = 300 bantime = 7200
⚠️ ระวัง: ถ้าเว็บอยู่หลัง Cloudflare หรือ Reverse Proxy IP ใน Log จะเป็น IP ของ Proxy ไม่ใช่ IP ผู้ใช้จริง ต้องตั้งให้ Nginx/Apache บันทึก X-Forwarded-For ลง Log ก่อน มิฉะนั้น Fail2Ban จะแบน IP ของ Cloudflare แทนผู้โจมตี
หลังเพิ่ม jail ใหม่ทุกครั้ง อย่าลืม Restart และตรวจว่า filter ไม่มี Syntax Error:
sudo fail2ban-client reload sudo fail2ban-client status
ตรวจสอบและจัดการ Ban ด้วย fail2ban-client
เมื่อมีหลาย jail ทำงานพร้อมกัน คุณต้องรู้คำสั่ง fail2ban-client เพื่อดูภาพรวมและจัดการ IP ที่ถูกแบน คำสั่งพื้นฐานที่ใช้บ่อยที่สุดมีดังนี้
ดูรายชื่อ jail ทั้งหมดที่กำลังทำงานอยู่:
sudo fail2ban-client status
ดูรายละเอียดของ jail ใดjail หนึ่ง รวมถึงรายการ IP ที่ถูกแบนอยู่ตอนนี้:
sudo fail2ban-client status wordpress
ตารางด้านล่างสรุปคำสั่งจัดการที่ใช้บ่อยและความหมาย:
| คำสั่ง | ความหมาย |
|---|---|
fail2ban-client status |
ดู jail ทั้งหมดที่ทำงานอยู่ |
fail2ban-client status sshd |
ดู IP ที่ถูกแบนใน jail sshd |
fail2ban-client set sshd unbanip IP |
ปลดแบน IP ที่ระบุ |
fail2ban-client set sshd banip IP |
แบน IP ด้วยตนเองทันที |
fail2ban-client reload |
โหลด Config ใหม่โดยไม่หยุดบริการ |
ถ้าต้องการดูจำนวน IP ที่ถูกแบนสะสมแบบรวดเร็ว ใช้คำสั่งนับจาก Log ได้เลย:
sudo zgrep "Ban" /var/log/fail2ban.log* | wc -l
คำสั่งนี้จะรวมไฟล์ Log ที่ถูกบีบอัด (.gz) ด้วย ทำให้เห็นภาพรวมว่ามี IP โจมตีกี่ครั้งตั้งแต่เริ่มใช้งาน
Whitelist IP และปัญหาที่พบบ่อย
เรื่องที่ทำให้ผู้ดูแลระบบปวดหัวที่สุดคือ "เผลอแบนตัวเอง" จนเข้า VPS ไม่ได้ การตั้ง Whitelist (ignoreip) ที่ถูกต้องจึงสำคัญไม่แพ้การตั้งค่าแบน เพิ่ม IP บ้าน/ออฟฟิศของคุณ และช่วง IP ภายในที่เชื่อถือได้ลงใน jail.local:
[DEFAULT]
# เว้นวรรคคั่นแต่ละ IP/range — รองรับทั้ง IPv4 และ IPv6
ignoreip = 127.0.0.1/8 ::1 203.0.113.45 198.51.100.0/24หลังแก้ ignoreip ต้อง sudo systemctl restart fail2ban เสมอ เพื่อให้ค่าใหม่มีผล ตารางด้านล่างรวมปัญหาที่พบบ่อยและวิธีแก้:
| อาการ | สาเหตุ / วิธีแก้ |
|---|---|
| Fail2Ban ไม่แบน IP เลย | logpath ชี้ผิดไฟล์ หรือ SSH ใช้ Port อื่นที่ไม่ได้ระบุใน jail |
| เข้า SSH ไม่ได้ทันที | โดนแบนตัวเอง — เข้าผ่าน Console ของผู้ให้บริการ แล้ว unbanip + เพิ่ม ignoreip |
| แบน IP ของ Cloudflare | Log บันทึก IP Proxy — ตั้ง real_ip / X-Forwarded-For ใน Web Server |
| Ubuntu ใหม่ไม่มี auth.log | Ubuntu บางรุ่นใช้ journald — ตั้ง backend = systemd ใน jail |
เทคนิคกันล็อกตัวเอง: ถ้าใช้ IP บ้านแบบ Dynamic ที่เปลี่ยนบ่อย ให้ตั้ง SSH Key Authentication และปิด Password Login ไปเลย จะปลอดภัยกว่าและไม่ต้องกังวลเรื่อง Brute Force หน้า SSH อีก
สรุป Checklist การตั้งค่า Fail2Ban
- ติดตั้ง Fail2Ban และเปิดใช้ Autostart
- สร้าง
/etc/fail2ban/jail.local— ห้ามแก้jail.conf - ตั้งค่า
[sshd]jail พร้อมกำหนด Port ที่ถูกต้อง - ใส่ IP ของตัวเองใน
ignoreipเพื่อป้องกันตัวเองถูกล็อค - ตรวจสอบสถานะด้วย
fail2ban-client status sshd - ใช้ Recidive Jail แบน IP ที่กวนซ้ำ ๆ เป็นสัปดาห์
คำถามที่พบบ่อยเกี่ยวกับ Fail2Ban
Fail2Ban แตกต่างจาก Firewall (UFW/iptables) อย่างไร?
Firewall อย่าง UFW หรือ iptables ทำหน้าที่กำหนดกฎคงที่ว่า Port ไหนเปิด/ปิด ส่วน Fail2Ban เป็นระบบ Dynamic ที่อ่าน Log แล้วสั่ง Firewall บล็อก IP ที่มีพฤติกรรมโจมตีโดยอัตโนมัติ และปลดแบนเมื่อครบเวลา ทั้งสองทำงานร่วมกัน — Fail2Ban เพิ่มกฎ iptables/nftables ชั่วคราวให้เอง คุณไม่ได้เลือกอย่างใดอย่างหนึ่ง แต่ควรใช้ทั้งคู่
Fail2Ban กินทรัพยากร VPS มากไหม?
น้อยมาก Fail2Ban เป็น Python Daemon ที่อ่าน Log แบบ Tail ใช้ RAM ประมาณ 20-40 MB และ CPU แทบไม่กระเทือนบน VPS ทั่วไป แม้แต่ VPS เริ่มต้น 500 บาท/เดือนของ AsiaGB ก็รันได้สบายโดยไม่กระทบเว็บหรือแอปอื่น เว้นแต่คุณตั้ง findtime กว้างมากบน Log ที่ใหญ่ระดับ GB ซึ่งกรณีทั่วไปไม่เป็นแบบนั้น
ถ้าผมเปลี่ยน SSH Port แล้ว ยังจำเป็นต้องใช้ Fail2Ban อีกไหม?
ยังควรใช้ การเปลี่ยน Port ช่วยลดบอทที่สแกน Port 22 ตรงๆ ได้มาก แต่ไม่ได้กันบอทที่สแกนทุก Port หรือเป้าหมายเฉพาะ Fail2Ban ยังช่วยจับและแบน IP ที่หา Port เจอ เพียงแต่อย่าลืมแก้ port = ssh ใน jail ให้เป็น Port ใหม่ของคุณ มิฉะนั้น Fail2Ban จะ Monitor ผิด Port
IP ที่ถูกแบนจะถูกปลดแบนเองหรือต้องปลดด้วยมือ?
ปลดแบนเองอัตโนมัติเมื่อครบ bantime ที่ตั้งไว้ เช่น ตั้ง 7200 วินาที IP นั้นจะถูกบล็อก 2 ชั่วโมงแล้วปลดเอง คุณปลดแบนก่อนเวลาได้ด้วย fail2ban-client set [jail] unbanip [IP] และถ้าตั้ง bantime = -1 จะเป็นการแบนถาวรจนกว่าจะปลดด้วยมือเอง
VPS พร้อม Full Root Access เพื่อความปลอดภัยสูงสุด
ควบคุมการตั้งค่า Security ทุกอย่างด้วยตัวเอง VPS Linux เริ่มต้น 500 บาท/เดือน ทำเลไทย / สิงคโปร์
ดูแพ็กเกจ VPS