
VPS ที่เปิดให้เข้าถึงจากอินเทอร์เน็ตจะโดน bot สแกนและลองล็อกอินตลอดเวลา โดยเฉพาะเว็บที่รันบน Nginx Fail2Ban ช่วยบล็อก IP พวกนี้อัตโนมัติ บทความนี้จะตั้งค่า Fail2Ban สำหรับ Nginx บน Ubuntu ทีละขั้น
Fail2Ban คืออะไร
Fail2Ban คือโปรแกรมความปลอดภัยที่คอยเฝ้าอ่าน log ของบริการต่างๆ เช่น SSH, Nginx, mail เมื่อพบ IP ที่ทำผิดซ้ำ (เช่น ล็อกอินผิดหลายครั้ง หรือยิง request ถี่ผิดปกติ) Fail2Ban จะสั่ง firewall (iptables/nftables) บล็อก IP นั้นชั่วคราวตามเวลาที่กำหนด ทำให้การโจมตีแบบ brute force หยุดเองโดยไม่ต้องเฝ้าหน้าจอ
ขั้นที่ 1 — ติดตั้ง Fail2Ban
ขั้นที่ 2 — สร้างไฟล์ jail.local
อย่าแก้ jail.conf โดยตรง ให้สร้าง jail.local แทนเพื่อไม่ให้ถูกเขียนทับตอนอัปเดต:
ขั้นที่ 3 — เปิด Jail สำหรับ Nginx
เพิ่ม jail สำหรับ Nginx ในไฟล์เดียวกัน ครอบคลุมการเดารหัส HTTP auth และ bot ที่สแกนหาไฟล์:
ขั้นที่ 4 — รีสตาร์ทและตรวจสอบ
คำสั่งนี้จะแสดงจำนวน IP ที่ถูกบล็อกและ log ที่กำลังเฝ้าดูอยู่
เคล็ดลับ: ใส่ IP สำนักงานหรือ IP บ้านของคุณใน ignoreip เสมอ เพื่อป้องกันไม่ให้คุณเองถูกบล็อกเมื่อพิมพ์รหัสผิด
ปลดบล็อก IP (unban)
หากต้องการปลดบล็อก IP ที่โดนแบนผิด ใช้คำสั่ง:
เพิ่ม Jail สำหรับ Rate Limit (nginx-req-limit)
นอกจาก jail มาตรฐาน ยังสามารถป้องกัน Request flood ที่ยิงเร็วผิดปกติได้ด้วยการสร้าง filter เองสำหรับ Nginx limit_req log สร้างไฟล์ filter ที่ /etc/fail2ban/filter.d/nginx-req-limit.conf:
จากนั้นเพิ่ม jail ใน jail.local:
Jail นี้จะบล็อก IP ที่ถูก Nginx ตัดด้วย rate limit เกิน 10 ครั้งในช่วง findtime — ป้องกัน DDoS ระดับ application layer ได้อีกชั้น
ตรวจสอบและ Monitor Fail2Ban แบบ Real-time
การ monitor สถานะ jail อย่างสม่ำเสมอช่วยให้รู้ว่า Fail2Ban ทำงานถูกต้องและ IP ไหนถูกบล็อกอยู่
ดูสถานะ jail ทั้งหมด
ดูรายละเอียด jail เฉพาะ
ดู Log แบบ real-time
ใน log จะเห็น Ban และ Unban พร้อม IP และ jail ที่เกี่ยวข้อง ช่วยวิเคราะห์ว่า pattern ใดถูก match มากที่สุด
ตรวจสอบเพิ่มเติม: ใช้ sudo iptables -L f2b-nginx-http-auth -n --line-numbers เพื่อดู IP ที่ถูกบล็อกใน iptables chain โดยตรง ซึ่งจะแสดงผลทันทีโดยไม่ต้องรอ log update
ปรับแต่ง bantime และ findtime ขั้นสูง
Fail2Ban รองรับการตั้งค่า bantime แบบ incremental คือเพิ่มระยะเวลาบล็อกทุกครั้งที่ IP นั้นถูก ban ซ้ำ ป้องกัน attacker ที่พยายามซ้ำหลายรอบ
| ครั้งที่ Ban | ระยะเวลาบล็อก | หมายเหตุ |
|---|---|---|
| 1 | 1 ชั่วโมง | ค่าเริ่มต้น bantime |
| 2 | 2 ชั่วโมง | Increment เริ่มทำงาน |
| 3 | 4 ชั่วโมง | เพิ่มแบบ exponential |
| 4+ | สูงสุด 24 ชั่วโมง | จำกัดด้วย bantime.maxtime |
ส่ง Email Alert เมื่อมี IP ถูก Ban
Fail2Ban สามารถส่ง email แจ้งเตือนเมื่อมี IP ใหม่ถูก ban ผ่าน action sendmail-whois ตั้งค่าใน jail.local ส่วน DEFAULT:
ค่า action_mwl (mail with log) จะส่ง email พร้อม log ที่เกี่ยวข้อง ทำให้ตรวจสอบที่มาของการโจมตีได้ทันที หากไม่มี sendmail สามารถใช้ mailutils แทนได้:
เปรียบเทียบ Fail2Ban กับเครื่องมือป้องกันอื่น
เมื่อเลือกเครื่องมือป้องกัน VPS ควรเข้าใจจุดแข็งของแต่ละตัวก่อนตัดสินใจ
| เครื่องมือ | หลักการทำงาน | จุดแข็ง | ข้อจำกัด |
|---|---|---|---|
| Fail2Ban | วิเคราะห์ log แบบ dynamic บล็อก IP อัตโนมัติ | ตอบสนองต่อพฤติกรรมจริง กำหนด rule ได้ยืดหยุ่น | ต้องมี log ที่ match regex ก่อน |
| UFW / iptables | กำหนด rule เปิด-ปิด port แบบ static | ง่าย เร็ว ทำงานระดับ kernel | ไม่ตอบสนองต่อพฤติกรรม ต้องตั้งเอง |
| CrowdSec | ชุมชนแชร์ blocklist IP เลว ร่วมกัน | ได้รับข้อมูลจาก community ทั่วโลก | ต้องพึ่ง external service |
| ModSecurity (WAF) | ตรวจ HTTP request payload วิเคราะห์ pattern | ป้องกัน SQLi/XSS ระดับ application | ใช้ทรัพยากรสูงกว่า ต้อง tune rule |
ในทางปฏิบัติ ควรใช้ Fail2Ban ร่วมกับ UFW เสมอ เพราะทั้งสองทำงานเสริมกัน UFW ปิด port ที่ไม่จำเป็น ส่วน Fail2Ban ดูแล port ที่ต้องเปิด เช่น 80/443 โดยบล็อก IP ที่มีพฤติกรรมน่าสงสัย
Whitelist IP (ignoreip) — ป้องกันการบล็อกตัวเอง
ก่อนนำ Fail2Ban ไปใช้งานจริง ควรเพิ่ม IP ที่เชื่อถือได้ทั้งหมดใน ignoreip เพื่อป้องกันไม่ให้ทีมงานหรือระบบ monitoring โดนบล็อกโดยไม่ตั้งใจ
ตรวจสอบ IP ปัจจุบันของตัวเองก่อนเพิ่ม Fail2Ban เสมอ โดยใช้คำสั่ง curl ifconfig.me บนเครื่องที่จะเชื่อมต่อเข้า VPS
- เพิ่ม IP ทุกเครื่องในทีมที่ต้องเข้าถึง VPS เป็นประจำ
- เพิ่ม IP ของ Load Balancer หรือ Proxy หน้า VPS ด้วย
- ถ้าใช้ VPN ให้เพิ่ม IP ของ VPN Gateway ด้วย
- ทบทวน ignoreip list ทุก 3 เดือนเพื่อลบ IP ที่ไม่ได้ใช้แล้ว
การตรวจสอบ Log และแนวทาง Debug
เมื่อ Fail2Ban ไม่ทำงานตามที่คาดหวัง ให้เริ่มจากการตรวจสอบ log และ filter เพื่อหาสาเหตุ
ทดสอบ Filter กับ Log จริง
ก่อน Deploy filter ใหม่ สามารถทดสอบว่า regex match กับ log หรือไม่ด้วยคำสั่ง:
ผลลัพธ์จะแสดงจำนวน line ที่ match และ line ที่ไม่ match ซึ่งช่วยยืนยันว่า filter ทำงานถูกต้องก่อน restart service จริง
ดู Log ของ Fail2Ban โดยตรง
ตรวจสอบว่า jail โหลด filter ถูกต้อง
คำสั่งเหล่านี้แสดงค่าจริงที่ Fail2Ban กำลังใช้งานอยู่ในขณะนั้น ซึ่งอาจต่างจากไฟล์ config ถ้ายังไม่ได้ restart service หลังแก้ไข
ข้อควรระวัง: หลังแก้ไข jail.local หรือ filter ทุกครั้ง ต้องรัน sudo systemctl restart fail2ban เสมอ เพราะ Fail2Ban โหลด config ตอน startup เท่านั้น การแก้ไขไฟล์โดยไม่ restart จะไม่มีผลใดๆ
Checklist ความปลอดภัย VPS ที่ครบรอบด้าน
Fail2Ban เป็นเพียงส่วนหนึ่งของการรักษาความปลอดภัย VPS อย่างครบถ้วน ควรทำตาม checklist นี้ควบคู่กันเสมอ
- ติดตั้งและเปิดใช้ Fail2Ban: ดูแล SSH, Nginx, และบริการอื่นๆ ตามที่ระบุในบทความนี้
- ตั้งค่า UFW Firewall: ปิดทุก port ที่ไม่จำเป็น เปิดเฉพาะ 22 (SSH), 80, 443
- ปิด SSH Password Authentication: ใช้ SSH Key เท่านั้น แก้
PasswordAuthentication noใน/etc/ssh/sshd_config - เปลี่ยน SSH Port (ตัวเลือก): เปลี่ยนจาก 22 เป็น port อื่น เพื่อลด bot scan ที่ยิงมาที่ port 22 โดยอัตโนมัติ
- อัปเดต Package เป็นประจำ: รัน
sudo apt update && sudo apt upgrade -yทุกสัปดาห์หรือตั้ง unattended-upgrades - ติดตั้ง ModSecurity หรือ NAXSI: WAF ระดับ application สำหรับป้องกัน SQLi และ XSS บน Nginx
- ตั้งค่า Nginx Rate Limiting: ใช้
limit_req_zoneเพื่อจำกัด Request Rate ก่อนที่ Fail2Ban จะเข้ามาจัดการต่อ
การทำความปลอดภัยเป็นกระบวนการต่อเนื่อง ไม่ใช่งานทำครั้งเดียวเสร็จ ควรทบทวน log และ config อย่างน้อยเดือนละครั้ง และติดตามข่าวสาร CVE ที่เกี่ยวข้องกับ Software ที่ใช้บน VPS เสมอ
คำถามที่พบบ่อย
Fail2Ban คือโปรแกรมความปลอดภัยบน Linux ที่คอยอ่าน log แล้วตรวจจับ IP ที่พยายามล็อกอินผิดหรือโจมตีซ้ำๆ จากนั้นสั่ง firewall บล็อก IP นั้นโดยอัตโนมัติชั่วคราว ช่วยลดการโจมตีแบบ brute force และ bot
UFW เป็น firewall ที่กำหนดกฎเปิด-ปิด port แบบคงที่ ส่วน Fail2Ban ทำงานแบบ dynamic คือดู log แล้วบล็อก IP ที่มีพฤติกรรมน่าสงสัยเป็นช่วงเวลา ทั้งสองตัวใช้ร่วมกันได้และเสริมกัน
ใช้คำสั่ง fail2ban-client set
VPS พร้อม Full Root สำหรับตั้งค่าความปลอดภัยเอง
AsiaGB VPS ให้สิทธิ์ Root เต็มรูปแบบ ติดตั้ง Fail2Ban และปรับแต่งได้อิสระ เริ่มต้น 500 บาท/เดือน
ดูแพ็กเกจ VPS