เชื่อม Mikrotik กับ RADIUS เก็บเงินลูกค้าอัตโนมัติ (ฉบับทำจริง)

·

ในบทก่อนเราตั้ง PPPoE Server บน Mikrotik แล้วเพิ่มลูกค้าด้วย /ppp secret ทีละคน — ซึ่งพอลูกค้าหลักร้อยจะเริ่มไม่ไหว ทั้งเพิ่ม/ลบ user เอง ทั้งไล่ตัด-คืนสัญญาณเอง บทความนี้จะพาเปลี่ยนมาให้ Mikrotik ตรวจสอบผู้ใช้จาก RADIUS แทน เพื่อรวมศูนย์การจัดการ + ผูกกับระบบบิลลิ่งให้ "จ่ายเงิน→เปิดเน็ต / ค้างจ่าย→ตัดเน็ต" ทำงานเองอัตโนมัติ

เหมาะกับ: คนที่ตั้ง PPPoE Server เป็นแล้ว • Mikrotik RouterOS v6/v7 • RADIUS server (เช่น FreeRADIUS) ที่ลูกค้าเริ่มเยอะจนจัดการด้วยมือไม่ไหว

RADIUS ช่วยอะไร (เข้าใจใน 1 นาที)

RADIUS ทำหน้าที่ AAA ให้ระบบเน็ตของคุณ:

  • Authentication — ตรวจ username/password ของลูกค้าตอน dial PPPoE
  • Authorization — บอก Mikrotik ว่าลูกค้าคนนี้ได้ ความเร็ว/IP/แพ็กเกจ อะไร
  • Accounting — เก็บ log ว่าใครออนไลน์ตอนไหน ใช้เน็ตไปเท่าไร (ฐานของบิล + ดูสถานะ)
[ลูกค้า] --PPPoE--> [Mikrotik = NAS/RADIUS client] --1812/1813--> [RADIUS server] <--> [DB บิลลิ่ง/CRM]

จุดเปลี่ยนสำคัญคือ user ไม่ได้อยู่บน Mikrotik อีกต่อไป แต่อยู่ในฐานข้อมูลกลาง (RADIUS/บิลลิ่ง) — เปิด/ปิด/เปลี่ยนแพ็กเกจทำที่เดียว มีผลกับทุก Mikrotik ในระบบ

NAS (Network Access Server) = อุปกรณ์ที่รับลูกค้าเข้ามาแล้วถาม RADIUS — ในที่นี้คือ Mikrotik

สิ่งที่ต้องมีก่อน

  • Mikrotik ที่ตั้ง PPPoE Server ใช้งานได้แล้ว
  • RADIUS server ที่เข้าถึงกันได้ (สมมติ IP 10.0.0.5) — บทนี้ยกตัวอย่าง FreeRADIUS
  • เปิดพอร์ตระหว่าง Mikrotik ↔ RADIUS: 1812 (auth), 1813 (accounting), 3799 (CoA/disconnect)
  • ตั้ง shared secret ไว้ 1 ชุด (รหัสลับที่ Mikrotik กับ RADIUS ต้องตรงกัน)

ขั้นที่ 1 — เพิ่ม Mikrotik เป็น client บน RADIUS

ฝั่ง RADIUS ต้อง "รู้จัก" Mikrotik ก่อน ไม่งั้นจะเมิน request ทิ้ง ใน FreeRADIUS แก้ไฟล์ clients.conf:

client mikrotik-core {
    ipaddr = 10.0.0.1          # IP ของ Mikrotik (ฝั่งที่คุยกับ RADIUS)
    secret = THAIISP_SECRET    # ต้องตรงกับที่ตั้งใน Mikrotik
    nas_type = other
    shortname = core-rt
}

แล้ว reload: systemctl restart freeradius (หรือ freeradius -X เพื่อรันโหมด debug ดู log สด ๆ ตอนทดสอบ)

ขั้นที่ 2 — สร้างผู้ใช้ + กำหนดความเร็วแพ็กเกจ

ทดสอบเร็ว ๆ ด้วยไฟล์ users (โปรดักชันจริงควรเก็บใน SQL/บิลลิ่ง):

cust001  Cleartext-Password := "Secret#001"
         Framed-Pool = "pppoe-pool",
         Mikrotik-Rate-Limit = "50M/100M"
  • Framed-Pool = ชื่อ IP pool บน Mikrotik (จากบท PPPoE) ที่จะแจก IP ให้
  • Mikrotik-Rate-Limit = "50M/100M" = จำกัดความเร็ว อัปโหลด/ดาวน์โหลด (มุมลูกค้า) — รูปแบบเดียวกับ rate-limit ใน /ppp profile
  • หลายแพ็กเกจ → ตั้งคนละค่า Mikrotik-Rate-Limit ต่อ user (หรือดึงจากตารางแพ็กเกจในบิลลิ่ง)

💡 ข้อดีของจ่ายความเร็วจาก RADIUS: เปลี่ยนแพ็กเกจลูกค้า = แก้ค่าเดียวในระบบ ไม่ต้องไปแตะ Mikrotik เลย

ขั้นที่ 3 — ชี้ Mikrotik ให้ใช้ RADIUS

บน Mikrotik เพิ่ม RADIUS server (service = ppp เพราะเราใช้กับ PPPoE):

/radius
add service=ppp address=10.0.0.5 secret=THAIISP_SECRET timeout=300ms

เปิดรับ CoA/Disconnect จาก RADIUS (ใช้ตอนตัด-คืนสัญญาณ):

/radius incoming
set accept=yes port=3799

ขั้นที่ 4 — เปิดให้ PPP ใช้ RADIUS + เก็บ accounting

/ppp aaa
set use-radius=yes accounting=yes interim-update=5m
  • use-radius=yes = ตรวจ user จาก RADIUS (ถ้าไม่เจอใน /ppp secret จะถาม RADIUS)
  • accounting=yes = ส่ง Acct-Start/Stop/Interim ไปที่พอร์ต 1813 → บิลลิ่งรู้ว่าใครออนไลน์ + ใช้ไปกี่ไบต์
  • interim-update=5m = อัปเดตสถานะทุก 5 นาที (เห็น online/ปริมาณเน็ตแบบ near real-time)

เมื่อใช้ RADIUS แล้ว ลูกค้าใน /ppp secret เดิมไม่จำเป็นอีก — ย้ายไปจัดการที่ระบบกลางได้เลย (จะเก็บ secret ฉุกเฉินไว้ 1–2 ตัวสำหรับ admin ก็ได้)

ขั้นที่ 5 — ทดสอบ

ให้ลูกค้า (หรือเราเตอร์ทดสอบ) dial PPPoE ด้วย cust001 / Secret#001 แล้วดู:

/ppp active print
/radius monitor 0

ฝั่ง RADIUS ถ้ารัน freeradius -X จะเห็น Access-Accept พร้อม attribute ที่ส่งกลับ ถ้าได้ Access-Reject ให้ไล่ดูสาเหตุในตารางท้ายบทความ

ตัด-คืนสัญญาณอัตโนมัติด้วย CoA (หัวใจของการเก็บเงิน)

นี่คือเหตุผลที่เราเปิด /radius incoming ไว้ — RADIUS (หรือบิลลิ่ง) สามารถ "สั่ง" Mikrotik ได้ทันทีโดยไม่ต้องรอลูกค้า re-connect:

  • Disconnect-Request → เตะลูกค้าออกจากเซสชัน (เช่น พอครบกำหนดค้างจ่าย)
  • CoA (Change of Authorization) → เปลี่ยนค่ากลางคัน เช่นลดความเร็ว/ย้ายเข้า "หน้าแจ้งเตือนค้างจ่าย" โดยไม่ตัดขาด

ตัวอย่างสั่ง disconnect ด้วย radclient (ส่งไปพอร์ต 3799 ของ Mikrotik):

echo "User-Name=cust001" | radclient -x 10.0.0.1:3799 disconnect THAIISP_SECRET

พอลูกค้าจ่ายเงิน บิลลิ่งก็อัปเดตสถานะใน RADIUS → ครั้งหน้าที่ต่อก็ได้แพ็กเกจปกติคืน วงจร "ค้างจ่าย→ตัด / จ่ายแล้ว→คืน" จึงทำงานเองโดยไม่ต้องนั่งเฝ้า

รายละเอียดการวางกฎตัด-คืน + กันลูกค้าหลุดมั่ว อ่านต่อบท ระงับ/คืนสัญญาณเน็ตลูกค้าค้างจ่าย แบบอัตโนมัติ (บทถัดไป)

RADIUS attribute ที่ใช้บ่อยกับ Mikrotik

Attribute ใช้ทำอะไร
Mikrotik-Rate-Limit จำกัดความเร็ว (อัปโหลด/ดาวน์โหลด + burst ได้)
Framed-Pool เลือก IP pool ที่จะแจกให้ลูกค้า
Framed-IP-Address จ่าย IP คงที่ (fixed IP) ให้ลูกค้ารายนั้น
Mikrotik-Address-List ใส่ลูกค้าเข้า address-list (เอาไปทำ firewall/บล็อกได้)
Acct-Interim-Interval กำหนดรอบส่ง accounting จากฝั่ง RADIUS

แก้ปัญหาที่เจอบ่อย

อาการ สาเหตุ/วิธีแก้
ลูกค้า login ไม่ผ่าน (Access-Reject ทุกคน) secret ไม่ตรง ระหว่าง Mikrotik กับ clients.conf • user/password ผิด
RADIUS เงียบ ไม่ตอบเลย (timeout) Mikrotik ไม่ได้อยู่ใน clients.conf • ไฟร์วอลล์บล็อกพอร์ต 1812/1813 • address ผิด
login ผ่าน แต่ความเร็วไม่จำกัด ลืมส่ง Mikrotik-Rate-Limit • dictionary ของ Mikrotik ไม่ถูกโหลดใน FreeRADIUS
ความเร็วสลับ (อัปเป็นดาวน์) สลับค่า Mikrotik-Rate-Limit เป็น ดาวน์/อัป แล้วทดสอบใหม่
สั่ง disconnect แล้วไม่มีอะไรเกิด ลืม /radius incoming set accept=yes • ส่งผิดพอร์ต (ต้อง 3799) • secret ไม่ตรง
บิลไม่เห็นปริมาณเน็ต/สถานะ online ลืม accounting=yes • พอร์ต 1813 ถูกบล็อก

สรุป

ย้ายจาก /ppp secret มาเป็น RADIUS = ยกการจัดการผู้ใช้ขึ้นมาไว้ศูนย์กลาง แล้วผูกกับบิลลิ่งให้ตรวจสิทธิ์ จ่ายความเร็ว เก็บ accounting และตัด-คืนสัญญาณได้อัตโนมัติ — นี่คือกระดูกสันหลังของ "เน็ตหมู่บ้านที่เก็บเงินเองได้" เมื่อสเกลโตขึ้น

แต่การรัน FreeRADIUS เอง (ดูแล server, เขียน SQL schema, ผูกกับบิล, ทำ CoA, กันล่ม) ก็เป็นงานไม่เบา — ถ้าอยากข้ามขั้นนั้นไปเลย:

💡 ไม่อยากดูแล RADIUS server เอง? thaiISP มาพร้อม CloudRADIUS (RADIUS แบบ managed) ผูกกับบิลลิ่ง/CRM ในตัว — จ่ายเงินผ่านไลน์/พร้อมเพย์ + ตรวจสลิป แล้วเปิด-ปิด-คืนสัญญาณลูกค้าอัตโนมัติ ไม่ต้องแตะ config เอง — ดูระบบ →

← กลับหน้าคลังความรู้