ลูกค้าเช็คเมลแล้วโดน firewall แบนยกออฟฟิศ — แก้ด้วย auto-whitelist จาก login
ฝั่งหนึ่ง bot สแกน POP3/IMAP/SMTP ทั้งวันทั้งคืน อีกฝั่งลูกค้าจริงยิงรหัสเก่าผิดรัวๆ จากเครื่องที่ลืมแก้ — เส้นแบ่งที่ใช้ได้จริงไม่ใช่ IP แต่คือ "ใครมีรหัสถูกในมือ" ระบบนี้ whitelist ที่พฤติกรรม ไม่ใช่ตัวตน
พอดีโฮสติ้งที่เปิดบริการเมลจะเจอ dilemma นี้ทุกเจ้าครับ:
ฝั่งหนึ่ง — bot สแกน POP3/IMAP/SMTP ทั้งวันทั้งคืน ต้องมี fail2ban/CSF-LFD คอยแบน IP ที่เดารหัสผิดซ้ำๆ ไม่งั้นโดน brute force จน account แตก
อีกฝั่ง — พฤติกรรมลูกค้าจริงหน้าตาเหมือน bot เป๊ะ:
- ออฟฟิศหนึ่งใช้ mailbox ร่วมกัน 5-6 เครื่อง (เมลกลาง sales@ ที่ทุกคน add ไว้) — พนักงานคนเดียวเปลี่ยนรหัส อีก 5 เครื่องที่เหลือยิงรหัสเก่ารัวๆ อัตโนมัติ = โดนแบน ทั้งออฟฟิศเน็ตเดียวกันเจ็บหมด
- เน็ตบ้าน/มือถือของไทย IP เปลี่ยนตลอด (dynamic) — whitelist IP ถาวรให้ลูกค้าเป็นรายๆ เลยไร้ความหมาย พรุ่งนี้ IP ก็ไม่ใช่ตัวเดิมแล้ว
- trigger ที่โหดสุดคือพวก distributed rule (เช่น LF_DISTSMTP ของ CSF) — เห็น "หลาย IP ใช้ account เดียวกัน" คิดว่าโดน compromise แต่ความจริงคือออฟฟิศ + 4G ของพนักงานนั่นแหละ
ผลคือ ticket "เช็คเมลไม่ได้" เข้าเป็นระยะ แก้ทีละเคสด้วย csf -dr ปลดแบนมือ — ไม่จบไม่สิ้น ผมเลยนั่งออกแบบระบบให้มันแก้ตัวเองได้ IP และชื่อในบทความเป็นค่าสมมติทั้งหมด (เป็นระบบป้องกันฝั่งเซิร์ฟเวอร์ล้วนๆ)
แนวคิด: login สำเร็จ = มนุษย์ที่มีรหัสถูก — whitelist ชั่วคราวให้เลย
หัวใจของระบบอยู่ที่ข้อสังเกตง่ายๆ ครับ: bot เดารหัส ไม่มีรหัสถูก ส่วนคนที่ login สำเร็จได้แปลว่ามีรหัสจริงในมือ ต่อให้อีกเครื่องของเขายิงรหัสเก่าผิดตามมา ก็ไม่ควรถึงขั้นแบนทั้งวง
เขียนเป็น daemon เฝ้า log — โค้ดแกนกลาง (ตัดจากของจริง เหลือ logic หลัก):
#!/bin/bash
# mail-autowl: login สำเร็จจาก IP ไทย -> temp allow 24h กัน LFD/BFM แบนทับ
tail -Fn0 /var/log/dovecot.log /var/log/exim/mainlog | \
while read -r line; do
case "$line" in
*'Login: user='*|*'A=dovecot_login'*) ;;
*) continue ;;
esac
ip=$(grep -oE 'rip=[0-9.]+|\[[0-9.]+\]' <<<"$line" | grep -oE '[0-9.]+' | head -1)
[ -z "$ip" ] && continue
# ข้าม IP ที่ allow อยู่แล้ว (กัน spam คำสั่ง csf)
csf -g "$ip" 2>/dev/null | grep -q 'csf.allow\|Temporary Allow' && continue
# GeoIP: เอาเฉพาะไทย — ระวัง! ต้อง match ให้แม่น
cc=$(geoiplookup "$ip" | grep -oE ': [A-Z]{2},' | tr -d ':, ')
[ "$cc" = "TH" ] || continue
csf -ta "$ip" 86400 -p "110,143,993,995,25,465,587" "mail-autowl login-ok" >/dev/null
logger -t mail-autowl "allow $ip (login ok)"
done
รายละเอียดที่เจ็บมาแล้ว อยากให้ระวัง
1. regex GeoIP ต้อง match ให้แม่น
ตอนแรกผม match [A-Z]{2} เฉยๆ ปรากฏไปเจอตัวอักษรอื่นใน output ของ geoiplookup ก่อนถึง country code — ผลคือประเทศอะไรก็ผ่านหมด กลายเป็น whitelist โลกทั้งใบเงียบๆ อยู่หลายชั่วโมง โชคดีเช็ค log ทัน — ต้อง match [A-Z]{2}, (มี comma ปิด) แบบในสคริปต์
2. temp allow ต้องระบุ port — csf -ta แบบไม่จำกัด port = เปิดทุกบริการให้ IP นั้น เราต้องการแค่ mail ports ก็ให้แค่นั้น ตาม least privilege
3. อย่ารัน daemon แบบนี้ด้วยสิทธิ์กว้างเกิน — ถ้าแยก user รันแล้วให้ sudo เฉพาะ csf -ta ระวังกับดัก sudoers: wildcard * ใน sudoers match ข้าม argument ได้ (csf -ta * แปลว่า argument อะไรก็ได้กี่ตัวก็ได้ รวมถึง flag อื่นของ csf!) ต้องเขียน pattern จำกัดรูปแบบ IP จริงจัง หรือครอบด้วย wrapper script ที่ validate input ก่อนค่อย sudo ตัว wrapper แทน
4. ต้องมี self-heal — ระบบพวกนี้ตายเงียบแล้วไม่มีใครรู้จนลูกค้าโวย ผมใส่ systemd Restart=always + OnFailure= ยิงแจ้งเตือนเข้า Telegram และ cron เช็คทุก 15 นาทีว่า process ยังอยู่
5. panel/อัปเดตระบบอาจเขียน config ทับ — พวก control panel ชอบ regenerate config ตอนอัปเดต ถ้า hook/service ของเราไปพิงไฟล์ที่มัน generate ให้ทำ checker คอยตรวจว่าของเรายังอยู่หลังอัปเดตทุกครั้ง
ผลหลังใช้งานจริง
ticket "เช็คเมลไม่ได้เพราะโดนแบน" ที่เคยเข้าเป็นระยะ แทบเป็นศูนย์ ในขณะที่ log ฝั่ง LFD ยังเห็น bot ต่างชาติโดนแบนรัวๆ ตามปกติ — ระบบแยก "คนจริงรหัสถูก" ออกจาก "bot เดารหัส" ได้ตรงจุดกว่า whitelist IP ถาวรแบบเดิมมาก และไม่ต้องมีใครมานั่งปลดแบนมืออีก
แนวคิดนี้ประยุกต์ได้กับทุกบริการที่มี "เหตุการณ์พิสูจน์ตัวตนสำเร็จ" ให้เกาะ — FTP, panel login ฯลฯ หลักการเดียวกัน: อย่า whitelist ที่ตัวตน (IP) ให้ whitelist ที่พฤติกรรม (login สำเร็จ)
ส่วนตัวผมมองว่าระบบกันภัยที่ดีต้องไม่สร้างงานให้คนดูแลเพิ่ม — ถ้ายังต้องนั่งปลดแบนมือทุกสัปดาห์ แปลว่า design ยังไม่จบ ใครจะเอาโครงนี้ไปปรับใช้กับ fail2ban หรือ firewall ตัวอื่นก็ได้ตามสะดวกครับ ตรงไหนผมอธิบายตกหล่นหรือพิมพ์ผิด เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
อยากให้เราทำให้ไหม?
ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า
เคยเจองานแบบนี้ไหม? ติดตรงไหน?
มาแลกวิธีกันต่อในบอร์ด LinuxThai



ความคิดเห็น 0
ยังไม่มีความคิดเห็น — เป็นคนแรกเลย