วิธีเก็บ Log จาก Mikrotik
ลงฐานข้อมูล MongoDB
คู่มือฉบับจับมือทำ ทีละขั้นตอน เปลี่ยนการดู Log แบบเดิมๆ ให้เป็นระบบ Centralized Log ที่ค้นหาง่ายและปลอดภัย บน Ubuntu Server
บทนำ: ทำไมต้องทำสิ่งนี้?
ปกติ Log (บันทึกเหตุการณ์) ของ Mikrotik จะเก็บไว้ใน RAM ของตัว Router เอง ซึ่งมีข้อเสียคือ:
- พื้นที่จำกัด: เก็บได้ไม่กี่บรรทัด ข้อมูลเก่าจะหายไปเร็วมาก
- หายเมื่อไฟดับ: ถ้า Router รีบูต Log ทั้งหมดจะหายไปทันที
- ค้นหายาก: การไล่ดู text file ธรรมดาทำได้ยาก
ทางแก้คือ: ส่ง Log ออกมาเก็บที่เครื่อง Server (Ubuntu) และใช้ syslog-ng เป็นตัวรับและจัดเรียงข้อมูลลง MongoDB (ฐานข้อมูล)
1. ติดตั้งซอฟต์แวร์บน Ubuntu
เปิด Terminal บน Ubuntu Server ของคุณ แล้วพิมพ์คำสั่งตามลำดับ
sudo apt update
เราจำเป็นต้องลง syslog-ng-mod-mongodb เพิ่มเติม เพื่อให้ syslog-ng รู้จักวิธีคุยกับ MongoDB ครับ
sudo apt install syslog-ng syslog-ng-mod-mongodb -y
sudo apt install mongodb-server -y
# ตรวจสอบว่า MongoDB ทำงานไหม
sudo systemctl status mongodb
ถ้าขึ้นคำว่า active (running) สีเขียว แสดงว่าฐานข้อมูลพร้อมใช้งานครับ กด q เพื่อออกจากหน้านั้น
2. ตั้งค่า Mikrotik
เราต้องสั่งให้ Mikrotik "โยน" ข้อมูล Log ออกมาหา Server ของเราครับ (Remote Logging)
ข้อมูลที่ต้องใช้:
IP Address ของเครื่อง Ubuntu: 192.168.1.10 (สมมติ)
* กรุณาเช็ค IP จริงของเครื่อง Server คุณด้วยคำสั่ง ip a
เปิด New Terminal ใน Winbox แล้วก๊อปปี้คำสั่งนี้ไปวาง (อย่าลืมแก้ IP):
# 1. สร้างปลายทาง (Action) ชื่อ syslog-server
/system logging action
add name=syslog-server remote=192.168.1.10 target=remote remote-port=514
# 2. บอกให้ส่ง Log ประเภทต่างๆ ไปยังปลายทางที่สร้างไว้
/system logging
add action=syslog-server topics=info
add action=syslog-server topics=error
add action=syslog-server topics=critical
3. เตรียม MongoDB
สร้างฐานข้อมูล (Database) และคอลเลกชัน (Collection) เพื่อรองรับข้อมูล
# เข้าสู่หน้าจอสั่งงาน MongoDB
mongo
# สั่งใช้ฐานข้อมูลชื่อ syslog_db (ถ้าไม่มีมันจะสร้างให้เอง)
use syslog_db
# สร้างที่เก็บข้อมูลชื่อ logs
db.createCollection("logs")
# ออกจากโปรแกรม
exit
4. คอนฟิก syslog-ng (สำคัญมาก)
ไฟล์คอนฟิกเปรียบเสมือน "แผนที่" บอก syslog-ng ว่าให้รับของจากไหน แล้วเอาไปทิ้งที่ไหน
แก้ไขไฟล์ด้วยคำสั่ง: sudo nano /etc/syslog-ng/syslog-ng.conf
คำอธิบายโค้ด
source s_network: เปิดรับข้อมูลผ่าน UDP พอร์ต 514 (มาตรฐาน Syslog)destination d_mongodb: บอกวิธีเชื่อมต่อ MongoDB และการจับคู่ฟิลด์ข้อมูลlog { ... }: คำสั่งให้เชื่อม Source เข้ากับ Destination
ให้ Copy โค้ดนี้ไปวางต่อท้ายไฟล์เดิมได้เลยครับ:
# -------------------------------------------
# เริ่มต้น Config สำหรับ Mikrotik to MongoDB
# -------------------------------------------
# 1. แหล่งที่มา (Source): รับข้อมูลจาก Network (UDP/514)
source s_network {
network(
transport("udp")
port(514)
);
};
# 2. ปลายทาง (Destination): ส่งลง MongoDB
destination d_mongodb {
mongodb(
servers("127.0.0.1:27017") # IP ของ MongoDB (localhost)
database("syslog_db") # ชื่อ Database ที่เราสร้าง
collection("logs") # ชื่อ Collection
# ส่วนสำคัญ: การ mapping ข้อมูล
value-pairs(
scope("dot-nv" "pair-list" "sdata")
# dot-nv จะช่วยแตกข้อมูล message ให้อัตโนมัติ
)
);
};
# 3. การจับคู่ (Log Path): เอาของจาก 1 ไปใส่ 2
log {
source(s_network);
destination(d_mongodb);
};
เมื่อแก้เสร็จแล้ว ให้กด Ctrl+O เพื่อบันทึก, Enter เพื่อยืนยัน, และ Ctrl+X เพื่อออก
จากนั้นรีสตาร์ทโปรแกรมเพื่อให้ค่าใหม่ทำงาน:
sudo systemctl restart syslog-ng
5. ตรวจสอบ & แก้ปัญหา
รอสักพัก (1-2 นาที) ให้ Mikrotik มีการทำงาน แล้วมาเช็คที่ Server
# เข้า MongoDB
mongo
# เลือกฐานข้อมูล
use syslog_db
# ขอดูข้อมูลล่าสุด 1 รายการ แบบจัดหน้าสวยๆ (pretty)
db.logs.find().sort({_id:-1}).limit(1).pretty()
{
"_id" : ObjectId("65c1..."),
"MESSAGE" : "system,info,account user admin logged in from 192.168.88.254 via winbox",
"HOST" : "Mikrotik-Main",
"PROGRAM" : "system",
"DATE" : "2024-02-06T12:00:00+07:00"
}
ถ้าไม่เจอข้อมูล (Troubleshooting)
1. ติด Firewall หรือไม่?
Ubuntu อาจบล็อกพอร์ต 514 อยู่ ลองสั่งเปิดพอร์ต:
sudo ufw allow 514/udp
2. Mikrotik ส่งออกไหม?
ใน Mikrotik ลองไปที่เมนู Log ดูว่ามี log ใหม่ๆ ขึ้นหรือไม่ และตรวจสอบ IP Server ในเมนู System > Logging > Actions อีกครั้ง