ตั้งค่า Fail2Ban สำหรับ Nginx บน VPS

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

sudo apt update sudo apt install fail2ban -y sudo systemctl enable --now fail2ban

ขั้นที่ 2 — สร้างไฟล์ jail.local

อย่าแก้ jail.conf โดยตรง ให้สร้าง jail.local แทนเพื่อไม่ให้ถูกเขียนทับตอนอัปเดต:

[DEFAULT] bantime = 1h findtime = 10m maxretry = 5 ignoreip = 127.0.0.1/8 ::1 YOUR_TRUSTED_IP

ขั้นที่ 3 — เปิด Jail สำหรับ Nginx

เพิ่ม jail สำหรับ Nginx ในไฟล์เดียวกัน ครอบคลุมการเดารหัส HTTP auth และ bot ที่สแกนหาไฟล์:

[nginx-http-auth] enabled = true port = http,https logpath = /var/log/nginx/error.log [nginx-botsearch] enabled = true port = http,https logpath = /var/log/nginx/access.log maxretry = 2

ขั้นที่ 4 — รีสตาร์ทและตรวจสอบ

sudo systemctl restart fail2ban sudo fail2ban-client status nginx-http-auth

คำสั่งนี้จะแสดงจำนวน IP ที่ถูกบล็อกและ log ที่กำลังเฝ้าดูอยู่

เคล็ดลับ: ใส่ IP สำนักงานหรือ IP บ้านของคุณใน ignoreip เสมอ เพื่อป้องกันไม่ให้คุณเองถูกบล็อกเมื่อพิมพ์รหัสผิด

ปลดบล็อก IP (unban)

หากต้องการปลดบล็อก IP ที่โดนแบนผิด ใช้คำสั่ง:

sudo fail2ban-client set nginx-http-auth unbanip 1.2.3.4

เพิ่ม Jail สำหรับ Rate Limit (nginx-req-limit)

นอกจาก jail มาตรฐาน ยังสามารถป้องกัน Request flood ที่ยิงเร็วผิดปกติได้ด้วยการสร้าง filter เองสำหรับ Nginx limit_req log สร้างไฟล์ filter ที่ /etc/fail2ban/filter.d/nginx-req-limit.conf:

[Definition] failregex = limiting requests, excess:.* by zone .*, client: <HOST> ignoreregex =

จากนั้นเพิ่ม jail ใน jail.local:

[nginx-req-limit] enabled = true port = http,https filter = nginx-req-limit logpath = /var/log/nginx/error.log maxretry = 10 bantime = 30m

Jail นี้จะบล็อก IP ที่ถูก Nginx ตัดด้วย rate limit เกิน 10 ครั้งในช่วง findtime — ป้องกัน DDoS ระดับ application layer ได้อีกชั้น

ตรวจสอบและ Monitor Fail2Ban แบบ Real-time

การ monitor สถานะ jail อย่างสม่ำเสมอช่วยให้รู้ว่า Fail2Ban ทำงานถูกต้องและ IP ไหนถูกบล็อกอยู่

ดูสถานะ jail ทั้งหมด

sudo fail2ban-client status

ดูรายละเอียด jail เฉพาะ

sudo fail2ban-client status nginx-http-auth sudo fail2ban-client status nginx-botsearch

ดู Log แบบ real-time

sudo tail -f /var/log/fail2ban.log

ใน 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 ที่พยายามซ้ำหลายรอบ

[DEFAULT] bantime.increment = true bantime.factor = 1 bantime.formula = ban * (1 << (ban - 1)) * banFactor bantime.maxtime = 24h bantime.overalljails = true
ครั้งที่ 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:

[DEFAULT] destemail = [email protected] sender = [email protected] mta = sendmail action = %(action_mwl)s

ค่า action_mwl (mail with log) จะส่ง email พร้อม log ที่เกี่ยวข้อง ทำให้ตรวจสอบที่มาของการโจมตีได้ทันที หากไม่มี sendmail สามารถใช้ mailutils แทนได้:

sudo apt install mailutils -y

เปรียบเทียบ 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 โดนบล็อกโดยไม่ตั้งใจ

[DEFAULT] # รองรับหลาย IP, CIDR block และ hostname ignoreip = 127.0.0.1/8 ::1 203.0.113.10 # IP สำนักงาน 198.51.100.0/24 # IP range ทีมงาน monitoring.example.com # hostname ระบบ monitor

ตรวจสอบ IP ปัจจุบันของตัวเองก่อนเพิ่ม Fail2Ban เสมอ โดยใช้คำสั่ง curl ifconfig.me บนเครื่องที่จะเชื่อมต่อเข้า VPS

การตรวจสอบ Log และแนวทาง Debug

เมื่อ Fail2Ban ไม่ทำงานตามที่คาดหวัง ให้เริ่มจากการตรวจสอบ log และ filter เพื่อหาสาเหตุ

ทดสอบ Filter กับ Log จริง

ก่อน Deploy filter ใหม่ สามารถทดสอบว่า regex match กับ log หรือไม่ด้วยคำสั่ง:

sudo fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-http-auth.conf

ผลลัพธ์จะแสดงจำนวน line ที่ match และ line ที่ไม่ match ซึ่งช่วยยืนยันว่า filter ทำงานถูกต้องก่อน restart service จริง

ดู Log ของ Fail2Ban โดยตรง

sudo journalctl -u fail2ban --since "1 hour ago" # หรือดู log file โดยตรง sudo grep -i "ban\|error\|warning" /var/log/fail2ban.log | tail -50

ตรวจสอบว่า jail โหลด filter ถูกต้อง

sudo fail2ban-client get nginx-http-auth logpath sudo fail2ban-client get nginx-http-auth maxretry sudo fail2ban-client get nginx-http-auth bantime

คำสั่งเหล่านี้แสดงค่าจริงที่ Fail2Ban กำลังใช้งานอยู่ในขณะนั้น ซึ่งอาจต่างจากไฟล์ config ถ้ายังไม่ได้ restart service หลังแก้ไข

ข้อควรระวัง: หลังแก้ไข jail.local หรือ filter ทุกครั้ง ต้องรัน sudo systemctl restart fail2ban เสมอ เพราะ Fail2Ban โหลด config ตอน startup เท่านั้น การแก้ไขไฟล์โดยไม่ restart จะไม่มีผลใดๆ

Checklist ความปลอดภัย VPS ที่ครบรอบด้าน

Fail2Ban เป็นเพียงส่วนหนึ่งของการรักษาความปลอดภัย VPS อย่างครบถ้วน ควรทำตาม checklist นี้ควบคู่กันเสมอ

การทำความปลอดภัยเป็นกระบวนการต่อเนื่อง ไม่ใช่งานทำครั้งเดียวเสร็จ ควรทบทวน log และ config อย่างน้อยเดือนละครั้ง และติดตามข่าวสาร CVE ที่เกี่ยวข้องกับ Software ที่ใช้บน VPS เสมอ

คำถามที่พบบ่อย

Fail2Ban คืออะไร?

Fail2Ban คือโปรแกรมความปลอดภัยบน Linux ที่คอยอ่าน log แล้วตรวจจับ IP ที่พยายามล็อกอินผิดหรือโจมตีซ้ำๆ จากนั้นสั่ง firewall บล็อก IP นั้นโดยอัตโนมัติชั่วคราว ช่วยลดการโจมตีแบบ brute force และ bot

Fail2Ban ต่างจาก UFW Firewall อย่างไร?

UFW เป็น firewall ที่กำหนดกฎเปิด-ปิด port แบบคงที่ ส่วน Fail2Ban ทำงานแบบ dynamic คือดู log แล้วบล็อก IP ที่มีพฤติกรรมน่าสงสัยเป็นช่วงเวลา ทั้งสองตัวใช้ร่วมกันได้และเสริมกัน

ถ้าตัวเองโดนบล็อกต้องทำอย่างไร?

ใช้คำสั่ง fail2ban-client set unbanip เพื่อปลดบล็อก IP ของตัวเอง และควรเพิ่ม IP ที่เชื่อถือได้ใน ignoreip เพื่อไม่ให้โดนบล็อกอีก

VPS พร้อม Full Root สำหรับตั้งค่าความปลอดภัยเอง

AsiaGB VPS ให้สิทธิ์ Root เต็มรูปแบบ ติดตั้ง Fail2Ban และปรับแต่งได้อิสระ เริ่มต้น 500 บาท/เดือน

ดูแพ็กเกจ VPS