ภาพรวมระบบการทำงาน
1. MikroTik Router
Users ใช้งานอินเทอร์เน็ต
Router ส่ง Log ผ่าน UDP:514
2. Ubuntu Server
syslog-ng รับข้อมูล
และกรองข้อมูล
3. MariaDB (MySQL)
บันทึกข้อมูลลงตาราง
เพื่อเรียกดูย้อนหลัง
เตรียมฐานข้อมูล (Database Setup)
เราจะใช้ MariaDB เป็นตัวเก็บข้อมูล เนื่องจากมีความรวดเร็วและเป็น Open Source โครงสร้างตารางจะออกแบบมารองรับมาตรฐาน Syslog Protocol
1.1 ติดตั้ง MariaDB Server
sudo apt update
sudo apt install mariadb-server mariadb-client -y
# (แนะนำ) ตั้งค่าความปลอดภัยเบื้องต้น
sudo mysql_secure_installation
1.2 สร้าง Database และ Table
โครงสร้าง Table นี้ออกแบบมาให้ตรงกับ Field มาตรฐานของ Syslog
sudo mysql -u root
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
host VARCHAR(64) NULL,
facility VARCHAR(10) NULL,
priority VARCHAR(10) NULL,
level VARCHAR(10) NULL,
tag VARCHAR(10) NULL,
datetime DATETIME NULL,
program VARCHAR(32) NULL,
msg TEXT NULL
);
-- สร้าง User สำหรับให้ syslog-ng ใช้งาน
CREATE USER 'syslog_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON syslog.* TO 'syslog_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
syslog_user) ออกจาก root เป็นแนวทางปฏิบัติที่ดีด้านความปลอดภัย
ติดตั้งและตั้งค่า Syslog-ng
Syslog-ng จะทำหน้าที่เป็น "ตัวกลาง" ที่รับข้อความจาก Router แล้วแปลงให้เป็นคำสั่ง SQL เพื่อยัดลง Database
2.1 ติดตั้ง Package
# ติดตั้ง syslog-ng และ libdbd-mysql สำหรับคุยกับ Database
sudo apt install syslog-ng syslog-ng-mod-sql -y
2.2 แก้ไขไฟล์ Config
ไฟล์ตั้งค่าอยู่ที่ /etc/syslog-ng/syslog-ng.conf ให้เพิ่มโค้ดด้านล่างนี้ไว้ท้ายไฟล์
sudo nano /etc/syslog-ng/syslog-ng.conf
# ==============================================
# Custom Configuration for MySQL Logging
# ==============================================
# 1. SOURCE: รับ Log ผ่าน UDP Port 514 (มาตรฐาน Network Log)
source s_net {
udp(ip(0.0.0.0) port(514));
};
# 2. DESTINATION: ส่งข้อมูลไปยัง MySQL Database
destination d_mysql {
sql(type(mysql)
host("localhost")
username("syslog_user")
password("StrongPassword123!") # ใส่รหัสที่ตั้งไว้ในขั้นตอนที่ 1
database("syslog")
table("logs")
columns("host", "facility", "priority", "level", "tag", "datetime", "program", "msg")
values("$HOST", "$FACILITY", "$PRIORITY", "$LEVEL", "$TAG", "$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC", "$PROGRAM", "$MSG")
indexes("host", "datetime", "program")); # สร้าง Index เพื่อให้ค้นหาเร็ว
};
# 3. LOG PATH: จับคู่ Source กับ Destination
log {
source(s_net);
destination(d_mysql);
};
อธิบายคำสั่งสำคัญ:
udp(ip(0.0.0.0) port(514)): เปิดรับ Log จากทุก IP ที่ส่งมายัง Port 514$HOST, $MSG: ตัวแปรภายในของ syslog-ng ที่ดึงค่ามาจาก Log package โดยอัตโนมัติindexes(...): สำคัญมาก ช่วยให้เมื่อ Log มีเยอะๆ แล้ว Query ไม่ช้า
2.3 Restart Service
sudo systemctl restart syslog-ng
sudo systemctl status syslog-ng
ตั้งค่า MikroTik ให้ส่ง Log
ขั้นตอนนี้เราจะบอก MikroTik ว่าเมื่อมีเหตุการณ์เกิดขึ้น (เช่น คน Login, เน็ตหลุด, Firewall Drop) ให้ส่งข้อมูลไปที่ Server Ubuntu ของเรา
-
1
สร้าง Action Remote
ไปที่
System>Logging> แท็บActionsกด + ตั้งชื่อ
syslog-serverเลือก Type เป็นremoteใส่ IP Server Ubuntu และ Port514 -
2
จับคู่ Rules
ไปที่แท็บ
Rulesกด +เลือก Topics ที่ต้องการ (เช่น
info,warning,firewall) และเลือก Action เป็นsyslog-serverที่สร้างไว้เมื่อกี้
CLI Command (Copy ไปวางได้เลย)
/system logging action
add name=syslog-server remote=192.168.1.100 target=remote port=514
/system logging
add action=syslog-server topics=info
add action=syslog-server topics=warning
add action=syslog-server topics=error
add action=syslog-server topics=system
add action=syslog-server topics=account
| # | Name | Type | Target | Remote / Port |
|---|---|---|---|---|
| 1 | syslog-server | remote | remote | 514 |
| 2 | disk | disk | disk1 | 1000 |
| Topics | Action | Prefix | Disabled |
|---|---|---|---|
| info | syslog-server | ||
| warning | syslog-server | ||
| error | syslog-server | ||
| firewall | syslog-server | ||
| system | syslog-server | ||
| account | syslog-server |
การตรวจสอบและแก้ปัญหาเบื้องต้น
1. เช็คว่า Port 514 เปิดอยู่หรือไม่
sudo netstat -tulpn | grep 514
ต้องขึ้นว่า udp ... 0.0.0.0:514 ... syslog-ng
2. ดูข้อมูลล่าสุดใน Database
sudo mysql -u syslog_user -p -e "SELECT datetime, host, msg FROM syslog.logs ORDER BY id DESC LIMIT 5;"
ถ้า Log ไม่เข้า ทำอย่างไร?
- Firewall: ตรวจสอบว่า Ubuntu เปิด Port UDP 514 หรือยัง
sudo ufw allow 514/udp - Ping: ลอง Ping จาก MikroTik มาที่ Ubuntu ว่าเจอกันหรือไม่
- AppArmor: บางครั้ง AppArmor อาจบล็อก MySQL ให้ตรวจสอบ Log ของระบบ
dmesg | grep syslog-ng
| datetime | host | program | msg |
|---|---|---|---|
| 2026-02-06 16:15:04 | 192.168.1.1 | dhcp | dhcp1 assigned IP 192.168.1.100 |
| 2026-02-06 16:14:22 | 192.168.1.1 | firewall | firewall rule added: accept src 192.168.1.0/24 |
| 2026-02-06 16:12:55 | 192.168.1.1 | system | system rebooted successfully |
| 2026-02-06 16:10:10 | 192.168.1.1 | account | user admin logged in via winbox |