EST. 2026 — บันทึกงานเซิร์ฟเวอร์จริง SYSADMIN · SECURITY · AI · DIRECTADMIN เล่มที่ 01
THE SYSADMIN ALMANAC
หน้าหลัก / Security / ลูกค้าเช็คเมลแล้วโดน firewall แบนยกออฟฟิศ — แก้ด้วย auto-whitelist จาก login
Security

ลูกค้าเช็คเมลแล้วโดน firewall แบนยกออฟฟิศ — แก้ด้วย auto-whitelist จาก login

โดย Ton-Or ·10 ก.ค. 2026·อ่าน 9 นาที
ลูกค้าเช็คเมลแล้วโดน 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 สำเร็จได้แปลว่ามีรหัสจริงในมือ ต่อให้อีกเครื่องของเขายิงรหัสเก่าผิดตามมา ก็ไม่ควรถึงขั้นแบนทั้งวง

เส้นทางการตัดสินใจtail -F logdovecot + exim mainlog→login สำเร็จ?Login OK / A=dovecot_login→GeoIP = TH?ลูกค้าเราเกือบทั้งหมดอยู่ไทย→csf -ta 24hเฉพาะ mail ports

เขียนเป็น 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 ให้แม่น

เกือบ whitelist โลกทั้งใบ

ตอนแรกผม 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

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