Giới thiệu chương trình giám sát kết nối IP Lan thông minh trên Router Mikrotik
Đoạn code chúng đưa ra bên dưới dùng để giám sát trạng thái kết nối của các thiết bị trong mạng LAN trên Router MikroTik. Cụ thể ví dụ Tôi có 5 IP LAN 172.16.90.2 đến 172.16.90.5 cần kiểm tra thiết bị mất kết nối lúc nào, online / offline lúc nào và lưu lại thông tin online / offline vào 1 file .txt dùng để xem lại kể cả khi router mất điện, khởi động lại…
Mục đích chính:
Theo dõi tình trạng hoạt động của các thiết bị nội bộ trong mạng (LAN) thông qua lệnh ping định kỳ. Cụ thể trong ví dụ này, hệ thống sẽ kiểm tra 5 địa chỉ IP từ 172.16.90.2 đến 172.16.90.5.
-
Kiểm tra kết nối: Router sẽ tự động ping từng IP trong danh sách để xác định thiết bị đang Online hay Offline.
-
Ghi log trạng thái thay đổi:
-
Khi thiết bị mất kết nối → ghi log cảnh báo (warning).
-
Khi thiết bị kết nối trở lại → ghi log thông tin (info).
-
-
Lưu kết quả vào file .txt:
Toàn bộ thông tin trạng thái (Online/Offline, thời điểm thay đổi) được ghi lại vào một tệp .txt lưu trên USB hoặc ổ lưu trữ nội bộ của router.
File này vẫn được giữ nguyên sau khi router khởi động lại hoặc mất điện, giúp người quản trị dễ dàng xem lại lịch sử kết nối. -
Chống spam log: Script chỉ ghi lại khi trạng thái thay đổi, tránh tình trạng log bị tràn hoặc khó đọc.
Chi tiết hoạt động:
- Tạo danh sách IP cần kiểm tra.
- Lặp qua từng IP:
- Ping 1 lần với khoảng cách 500ms.
- Nếu không trả lời → trạng thái
"offline". - Nếu trả lời → trạng thái
"online".
-
So sánh trạng thái mới với trạng thái cũ:
- Nếu khác nhau → ghi log và cập nhật trạng thái.
- Nếu không khác → không ghi log.
Lợi ích:
- Giúp quản trị viên phát hiện kịp thời khi thiết bị trong mạng LAN bị mất kết nối.
- Không làm log đầy quá nhanh (chỉ khi có thay đổi trạng thái).
- Giảm tải log hệ thống, chỉ lưu sự kiện quan trọng.
- Dễ dàng theo dõi, thống kê và truy xuất lịch sử hoạt động của các thiết bị.
- Có thể mở rộng thêm chức năng như gửi email cảnh báo hoặc ghi log ra server từ xa.
Nói cách khác, script này là “trình giám sát kết nối LAN thông minh” cho MikroTik.
Tạo script mới với đầy đủ quyền trong MikroTik
Câu lệnh sau trong MikroTik dùng để tạo một script mới: sau đó copy các lệnh ở script V5 hay V6 vào source của script1 nhé
Giải thích nhanh từng phần:
/system script add→ Tạo một script mới trong hệ thống.name="script1"→ Tên của script là script1.owner="admin"→ Script này thuộc quyền sở hữu của user admin.policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon→ Cácquyền (permissions) mà script này được phép thực hiện.
Ví dụ:read, write→ đọc/ghi cấu hìnhreboot→ có thể khởi động lại routersniff→ truy cập dữ liệu trafficpassword→ truy cập các mật khẩusensitive→ cho phép đọc các thông tin nhạy cảmromon→ điều khiển qua RoMON
dont-require-permissions=no→ script bắt buộc phải tuân thủ quyền hạn của user (không vượt quyền).source=""→ nội dung script hiện đang trống, chưa có lệnh nào bên trong.
👉 Tóm lại:
Lệnh này chỉ tạo một script trống tên “script1” với đầy đủ quyền truy cập và chưa có nội dung thực thi.
Script V5 chỉ hiện thị trên Log
# script mikrotik kiem tra ip lan roi ping mat ket noi toi router khong spam log v5 va buoc luu tren usb khong goi han
# --- danh sach ip can kiem tra ---
:local iplist {"172.16.90.2";"172.16.90.3";"172.16.90.4";"172.16.90.5"}
# --- bien toan cuc luu trang thai ---
:global devicestatus
# --- neu chua ton tai thi khoi tao dictionary rong ---
:if ([:typeof $devicestatus] != "array") do={
:set devicestatus [:toarray ""]
}
# --- lap qua tung ip ---
:foreach ip in=$iplist do={
:local currentstatus "unknown"
:if ([:typeof ($devicestatus->$ip)] != "nothing") do={
:set currentstatus ($devicestatus->$ip)
}
# ping 1 lan voi interval 500ms
:local result [/ping address=$ip count=1 interval=500ms]
:local newstatus " online"
:if ($result = 0) do={ :set newstatus " mat ket noi" }
# neu trang thai thay doi thi ghi log
:if ($currentstatus != $newstatus) do={
:if ($newstatus = " mat ket noi") do={
:log warning ("thiet bi " . $ip . " mat ket noi")
} else={
:log info ("thiet bi " . $ip . " da online tro lai.")
}
:set ($devicestatus->$ip) $newstatus
}
}
Giải thích Script V5 chi tiết từng phần
1 Danh sách IP cần kiểm tra
-
:local iplist {...}: Tạo một biến cục bộ têniplistchứa danh sách các địa chỉ IP bạn muốn kiểm tra. -
Các IP được đặt trong
{}và phân tách bằng;. -
Đây là các thiết bị LAN bạn muốn ping để kiểm tra trạng thái.
2 Biến toàn cục lưu trạng thái
-
:global devicestatus: Tạo biến toàn cục (global) để lưu trạng thái “online/offline” của từng IP. -
Dùng biến toàn cục để lần chạy script sau vẫn nhớ trạng thái cũ, tránh spam log nếu trạng thái không thay đổi.
3 Khởi tạo dictionary nếu chưa có
-
[:typeof $devicestatus]kiểm tra kiểu dữ liệu của biếndevicestatus. -
Nếu biến chưa tồn tại hoặc không phải array, script sẽ khởi tạo nó thành một mảng rỗng (
array) để lưu trạng thái từng IP. -
Dictionary ở đây sẽ dùng theo kiểu
devicestatus->IPđể lưu"online"hoặc"offline".
4 Vòng lặp qua từng IP
-
Dùng
:foreachđể lặp qua từng IP trong danh sáchiplist. -
Biến
ipsẽ lần lượt nhận giá trị từng địa chỉ IP.
5 Lấy trạng thái hiện tại
-
:local currentstatus "unknown": Khởi tạo trạng thái hiện tại làunknown. -
Kiểm tra xem IP này đã được lưu trong
devicestatuschưa.-
Nếu có, gán trạng thái hiện tại (
currentstatus) bằng giá trị đã lưu. -
Nếu chưa có, mặc định là
"unknown".
-
6 Ping từng IP
-
[/ping address=$ip count=1 interval=500ms]: Ping IP 1 lần, khoảng cách giữa các gói là 500ms. -
Lưu kết quả vào
result(số gói nhận được). -
Nếu
result = 0(không nhận được ping), gán trạng thái mới là"offline". -
Nếu nhận được ping (
result > 0), mặc định"online".
7 Ghi log khi trạng thái thay đổi
- Kiểm tra trạng thái cũ (
currentstatus) và trạng thái mới (newstatus) có khác nhau không. - Nếu khác:
- Nếu mới là
offline, ghi log cảnh báo (warning). - Nếu mới là
online, ghi log thông tin (info) rằng thiết bị đã kết nối lại.
- Nếu mới là
-
Cập nhật trạng thái mới vào dictionary:
devicestatus->IP = newstatus.
8 Tóm tắt hoạt động của script
- Lấy danh sách IP LAN cần kiểm tra.
- Khởi tạo biến lưu trạng thái trước đó.
- Lặp qua từng IP:
- Lấy trạng thái cũ (online/offline).
- Ping IP một lần.
- So sánh trạng thái cũ và mới.
- Nếu thay đổi, ghi log và cập nhật trạng thái.
- Nhờ vậy, script chỉ ghi log khi có thay đổi trạng thái, tránh spam log liên tục.
Script V6 hiện thị trên Log và lưu Log đó trên USB ổ cứng
# script mikrotik kiem tra ip lan roi ping mat ket noi toi router khong spam log v6 luu tren usb hoac ỏn cung MIkrotik
# --- danh sach ip can kiem tra ---
:local iplist {"172.16.90.2";"172.16.90.3";"172.16.90.4";"172.16.90.5"}
# --- bien toan cuc luu trang thai ---
:global devicestatus
# --- neu chua ton tai thi khoi tao dictionary rong ---
:if ([:typeof $devicestatus] != "array") do={
:set devicestatus [:toarray ""]
}
# --- duong dan file log ---
:local statusfile "disk1/lan_status.txt"
# --- lay ngay gio hien tai ---
:local currenttime [/system clock get time]
:local currentdate [/system clock get date]
# --- lap qua tung ip ---
:foreach ip in=$iplist do={
:local currentstatus "unknown"
:if ([:typeof ($devicestatus->$ip)] != "nothing") do={
:set currentstatus ($devicestatus->$ip)
}
# ping 1 lan
:local result [/ping address=$ip count=1 interval=500ms]
:local newstatus "online"
:if ($result = 0) do={ :set newstatus " mat ket noi" }
# neu trang thai thay doi thi log va ghi file
:if ($currentstatus != $newstatus) do={
# log ra terminal
:if ($newstatus = " mat ket noi") do={
:log warning ("thiet bi " . $ip . " mat ket noi")
} else={
:log info ("thiet bi " . $ip . " da online tro lai")
}
# cap nhat trang thai moi
:set ($devicestatus->$ip) $newstatus
# ghi vao file disk1 (append)
:local line ("($currentdate $currenttime) $ip=$newstatusn")
:if ([:len [/file find name=$statusfile]] > 0) do={
:local old [/file get $statusfile contents]
/file set $statusfile contents=($old . $line)
} else={
/file add name=$statusfile contents=$line
}
}
}
Giải thích Script v6 và phân tích chi tiết
1 Khai báo danh sách IP cần kiểm tra
-
:local iplist→ tạo biến cục bộ trong script có têniplist. -
{...}→ là một danh sách (array) chứa các địa chỉ IP LAN bạn muốn kiểm tra. -
Script sẽ lặp qua từng IP trong danh sách này để ping.
➡️ Đây chính là nơi bạn có thể thêm bớt thiết bị cần giám sát.
2 Biến toàn cục lưu trạng thái thiết bị
-
:globalnghĩa là biến này tồn tại toàn hệ thống, không chỉ trong lần chạy hiện tại. -
Dùng để lưu trạng thái trước đó (online/offline) của từng IP.
-
Nhờ vậy, script so sánh được trạng thái mới và cũ → tránh spam log.
3 Khởi tạo biến nếu chưa tồn tại
-
:typeof $devicestatus→ kiểm tra kiểu dữ liệu của biếndevicestatus. -
Nếu chưa tồn tại hoặc không phải dạng “array” → tạo mới rỗng bằng
:toarray "". -
Mục đích: đảm bảo script không báo lỗi khi chạy lần đầu tiên.
4 Đường dẫn file log lưu trạng thái
-
Đặt tên và đường dẫn file log sẽ lưu ra USB (
disk1). -
Nếu router không có USB, bạn có thể đổi thành:
(hoặc để trống → lưu trong bộ nhớ trong của thiết bị)
5 Lấy ngày và giờ hiện tại
-
Lấy thời gian thực từ đồng hồ hệ thống MikroTik.
-
Dùng để ghi dấu thời gian mỗi lần có thay đổi trạng thái.
Kết quả ví dụ:
6 Lặp qua từng IP để kiểm tra
-
:foreachgiúp duyệt qua từng phần tử trong danh sáchiplist. -
Ở mỗi vòng lặp, biến
ip= một địa chỉ trong danh sách.
7 Lấy trạng thái cũ của IP (nếu có)
-
Nếu
$devicestatus->$iptồn tại, lấy giá trị (online/offline) của IP đó. -
Nếu chưa có (lần đầu chạy) thì để “unknown”.
8 Ping kiểm tra kết nối
-
Ping IP 1 lần, chờ 500ms.
-
Nếu có phản hồi →
resultkhác 0 →newstatus = online. -
Nếu mất kết nối (ping fail) →
result = 0→ đổi thành"mat ket noi".
9 So sánh trạng thái cũ và mới
-
Chỉ khi trạng thái thay đổi (online → offline hoặc ngược lại), script mới thực hiện:
-
Ghi log.
-
Ghi vào file.
-
Cập nhật trạng thái mới.
-
➡️ Nhờ vậy, script không spam log mỗi lần chạy.
10 Ghi log ra Terminal
-
Nếu thiết bị mất kết nối → ghi cảnh báo (màu vàng trong log).
-
Nếu online trở lại → ghi thông tin (màu xanh).
📘 Ví dụ log:
11 Cập nhật trạng thái mới
-
Lưu trạng thái mới vào biến toàn cục
$devicestatus. -
Lần sau script chạy, giá trị này sẽ được so sánh lại.
12 Ghi vào file log (append)
🔹 Giải thích:
-
:local line ...→ tạo dòng log mới có format:(nhưng bạn có lỗi nhỏ ở
$newstatusn, đáng lẽ là$newstatusnđể xuống dòng) -
Kiểm tra file log:
-
Nếu tồn tại → đọc nội dung cũ, rồi nối thêm dòng mới (
append). -
Nếu chưa có → tạo mới.
-
Kết quả trong file disk1/lan_status.txt:
13 Kết thúc vòng lặp
→ Đóng khối foreach, script quay lại kiểm tra IP tiếp theo.
Tổng quan cách hoạt động
- Mỗi lần chạy script:
- Lặp qua danh sách IP LAN.
- Ping từng IP.
- So sánh trạng thái cũ và mới.
- Nếu thay đổi → ghi log + lưu vào file.
- Nếu không thay đổi → không ghi gì (tránh spam).
- File log trên
disk1giúp bạn tra lịch sử kết nối.
Đặt lịch chạy tự động Script giám sát thiết bị LAN dành cho cả 2 Script
Câu lệnh bạn đưa ra là một lệnh cấu hình Scheduler (bộ lập lịch) trên Router MikroTik.
Nó giúp tự động chạy một script theo chu kỳ nhất định. Dưới đây là giải thích chi tiết từng phần:
Câu lệnh đầy đủ
Giải thích từng thành phần
1. /system scheduler add
- Đây là lệnh tạo mới một tác vụ lập lịch (scheduler) trong RouterOS.
- Scheduler dùng để chạy tự động script hoặc lệnh theo thời gian định sẵn hoặc lặp lại định kỳ.
2. interval=1s
- Nghĩa là khoảng thời gian lặp lại của tác vụ này là 1 giây.
- Cứ mỗi 1 giây, router sẽ thực hiện hành động được chỉ định trong
on-event.
⚠️ Lưu ý:
Khoảng 1 giây là rất ngắn, có thể khiến CPU tăng cao nếu script nặng.
Trong thực tế, nên dùng 5s, 10s, 30s hoặc 1m tùy nhu cầu giám sát.
3. name=schedule1
- Đây là tên của scheduler, giúp bạn dễ dàng quản lý hoặc chỉnh sửa sau này.
- Có thể xem hoặc xóa bằng lệnh:
4. on-event="/system script run script1"
- Hành động được thực hiện khi scheduler kích hoạt.
- Ở đây là chạy script có tên
script1(phải tồn tại trong/system script). - Tức là mỗi khi scheduler chạy, nó sẽ gọi script
script1.
5. policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
- Các quyền mà scheduler được phép sử dụng khi chạy script.
- Giống như “quyền hạn” để script có thể thao tác với các phần khác nhau của hệ thống.
- Nếu script cần thao tác nhiều chức năng (ví dụ đọc ghi file, log, ping, reboot…), nên cấp đầy đủ như trên để tránh lỗi permission denied.
6. start-date=2025-1-1
- Ngày bắt đầu kích hoạt scheduler.
- Tức là scheduler chỉ bắt đầu chạy từ ngày 1 tháng 1 năm 2025.
7. start-time=23:00:00
- Giờ bắt đầu chạy lần đầu tiên.
- Ở đây là 23:00:00 (11 giờ đêm) ngày 1/1/2025.
- Sau lần đầu đó, nó sẽ lặp lại mỗi 1 giây (theo interval).
Tóm tắt hoạt động
Vào lúc 23:00:00 ngày 01/01/2025, Router MikroTik sẽ bắt đầu chạy script1
và cứ mỗi 1 giây sau đó, script này sẽ tự động được gọi lại.
Scheduler có đầy đủ quyền hệ thống để chạy mọi thao tác mà script1 cần.
Scheduler này thường dùng để:
- Tự động chạy script giám sát thiết bị LAN (như bạn đang làm).
- Ghi log định kỳ hoặc lưu dữ liệu ra file.
- Tự động reboot router, backup cấu hình, đồng bộ thời gian…
Code Scheduler Auto Run Script
Cấu hình lưu Log cảnh báo (warning) ra file trên USB, ổ cứng trong MikroTik
Cấu hình phần Logging trong MikroTik — tạo Log Action lưu log ra USB và Log Rule gán action đó cho log warning.
Câu lệnh CLI tương ứng (chạy trong Terminal MikroTik) như sau:
Giải thích:
name=1: đặt tên cho action là “1” (tùy bạn đổi).: ghi log ra file (lưu trên ổ đĩa hoặc USB).target=diskdisk-file-name="usb1-part1/check-lan.txt": đường dẫn file log trên USB tùy tên usb hiện thị trên mikrotik để nhập tương ứng.: số dòng tối đa trong mỗi file log.disk-lines-per-file=65535: số file tối đa được giữ lại.disk-file-count=65535topics=warning: chỉ ghi các log có mức độ “warning”.action=1: dùng action “1” ở trên để lưu log ra file.
👉 Sau khi nhập lệnh này, mọi log “warning” sẽ tự động được ghi vào file usb1-part1/check-LAN.txt.
⚠️ CẢNH BÁO BẢN QUYỀN NỘI DUNG
- Toàn bộ nội dung, bao gồm nhưng không giới hạn ở văn bản, hình ảnh, video, tài liệu, biểu đồ và dữ liệu kỹ thuật được đăng tải trên website này đều thuộc quyền sở hữu của [Tên thương hiệu hoặc tác giả] và được bảo hộ theo quy định của Luật Sở hữu trí tuệ Việt Nam cùng các điều ước quốc tế có liên quan.
- Mọi hành vi sao chép, trích dẫn, chỉnh sửa, đăng tải lại hoặc sử dụng nội dung dưới bất kỳ hình thức nào mà không có sự chấp thuận bằng văn bản của chủ sở hữu bản quyền đều bị coi là xâm phạm quyền sở hữu trí tuệ. Hành vi này có thể dẫn đến biện pháp xử lý hành chính, dân sự hoặc hình sự theo quy định của pháp luật hiện hành.
- Chúng tôi luôn hoan nghênh việc chia sẻ thông tin vì mục đích tham khảo hoặc học tập, tuy nhiên, khi trích dẫn nội dung từ website này, vui lòng ghi rõ nguồn: [Tên website hoặc đường dẫn cụ thể] để thể hiện sự tôn trọng tác giả và quyền sở hữu trí tuệ.
- Mọi vi phạm về bản quyền sẽ được chúng tôi ghi nhận, lưu trữ và báo cáo đến cơ quan chức năng nếu cần thiết để bảo vệ quyền lợi hợp pháp của chúng tôi.

