Skip to main content
Glama
MIKROTIK_CONFIG_MANAGER.md12.8 kB
# MikroTik Configuration Manager Công cụ quản lý tập trung cấu hình thiết bị MikroTik RouterOS thông qua SSH. Hỗ trợ backup, restore, diff, và áp dụng cấu hình với các lệnh chuẩn từ tài liệu chính thức của MikroTik. ## Tính Năng Chính - ✅ Kết nối SSH an toàn đến thiết bị MikroTik - ✅ Backup và restore cấu hình - ✅ Export cấu hình dạng text (RSC) để so sánh phiên bản - ✅ So sánh cấu hình (diff) giữa hai snapshot - ✅ Áp dụng nhóm lệnh với kiểm tra lỗi và rollback tự động - ✅ Lệnh chuẩn hóa dựa trên tài liệu MikroTik chính thức - ✅ Thiết lập DHCP, IP, Route, Firewall, DNS, NTP, SNMP - ✅ Cấu hình Bridge/VLAN, set access/trunk, enable/disable interface, MTU, bonding - ✅ Kiểm tra lệnh nguy hiểm trước khi thực thi - ✅ Hỗ trợ chạy lệnh tuần tự và song song ## Cài Đặt ```bash npm install ssh2 ``` ## Sử Dụng Cơ Bản ### 1. Kết nối và lấy thông tin hệ thống ```typescript import { MikrotikManager } from '@/services/mikrotik'; const manager = new MikrotikManager('MT-BR-01'); // Kết nối await manager.connect('192.168.1.1', 'admin', 'password123'); // Lấy thông tin const info = await manager.getSystemInfo(); console.log(info); // Ngắt kết nối await manager.disconnect(); ``` ### 2. Tạo Backup ```typescript // Backup cơ bản const result = await manager.createBackup({ name: 'config-backup-2025-12-10', compressed: true, }); // Liệt kê các backup const backups = await manager.listBackups(); console.log(backups.stdout); ``` ### 3. Restore Backup ```typescript // Lưu ý: Đây là hoạt động phá hủy, sẽ thay thế toàn bộ cấu hình const restoreResult = await manager.restoreBackup('config-backup-2025-12-10'); ``` ### 4. Export Cấu Hình (để Diff/Version Control) ```typescript const config = await manager.exportConfig('my-config.rsc'); // Hoặc lưu vào file const configSnap = await manager.getConfigSnapshot(); console.log(configSnap.hash); // SHA-like hash để so sánh ``` ### 5. So Sánh Hai Cấu Hình (Diff) ```typescript const before = await manager.getConfigSnapshot(); // ... thực hiện thay đổi ... const after = await manager.getConfigSnapshot(); const diff = manager.computeDiff(before, after); console.log('Added lines:', diff.added); console.log('Removed lines:', diff.removed); ``` ### 6. Thiết Lập DHCP Server ```typescript // Tham số: interface, pool name, address space, range start, range end, gateway, DNS const dhcpResult = await manager.setupDHCP( 'ether2', // Interface 'dhcp-pool-lan', // Pool name '192.168.100.0/24', // Address space '192.168.100.10', // Range start '192.168.100.200', // Range end '192.168.100.1', // Gateway ['8.8.8.8', '8.8.4.4'] // DNS servers ); console.log(`Applied: ${dhcpResult.appliedCommands}, Failed: ${dhcpResult.failedCommands}`); ``` ### 7. Áp Dụng Cấu Hình (Batch Commands) ```typescript const commands = [ '/ip dns set servers=8.8.8.8,8.8.4.4', '/system ntp client set enabled=yes servers=0.us.pool.ntp.org', '/ip firewall nat add chain=srcnat action=masquerade out-interface=ether1', ]; const result = await manager.applyCommands(commands, { rollbackOnError: true, // Tự động rollback nếu có lỗi dryRun: false, // Set true để chỉ kiểm tra }); console.log(result); // { // success: true, // appliedCommands: 3, // failedCommands: 0, // errors: [] // } ``` ### 8. Thực Thi Lệnh Tuần Tự ```typescript const results = await manager.ssh.execMulti([ '/ip address print detail', '/ip route print detail', '/interface print detail', ], { perCommandTimeoutMs: 30000, stopOnError: true, // Dừng ở lệnh đầu tiên lỗi }); for (const [cmd, result] of Object.entries(results)) { console.log(`${cmd}: exit code ${result.exitCode}`); } ``` ### 9. Bridge / Interface (VLAN, Access/Trunk, MTU) ```typescript // Tạo bridge và bật vlan-filtering await manager.createBridge('br-lan', { vlanFiltering: true }); // Thêm port vào bridge với PVID (access) await manager.addBridgePort('br-lan', 'ether2', { pvid: 10 }); // Cấu hình VLAN: VLAN 10 untagged trên ether2, VLAN 20 tagged trên ether3 await manager.configureBridgeVlan('br-lan', 10, [], ['ether2'], { enableFiltering: true }); await manager.configureBridgeVlan('br-lan', 20, ['ether3']); // Đặt port access await manager.setAccessPort('br-lan', 'ether4', 30); // Đặt port trunk với nhiều VLAN tagged await manager.setTrunkPort('br-lan', 'ether5', [20, 30, 40]); // Bật/tắt interface await manager.setInterfaceState('ether6', true); // enable await manager.setInterfaceState('ether6', false); // disable // Chỉnh MTU await manager.setInterfaceMtu('ether7', 9000); // Bonding LACP await manager.createBonding('bond1', ['ether8', 'ether9'], '802.3ad'); ``` ## Lệnh Chuẩn Hóa (MIKROTIK_COMMANDS) Thư viện cung cấp các lệnh chuẩn từ tài liệu MikroTik để giảm sai sót: ### System & Info ```typescript MIKROTIK_COMMANDS.SYSTEM_IDENTITY // /system identity print MIKROTIK_COMMANDS.SYSTEM_RESOURCES // /system resource print MIKROTIK_COMMANDS.SYSTEM_PACKAGE_PRINT // /system package print MIKROTIK_COMMANDS.SYSTEM_LICENSE_PRINT // /system license print ``` ### Backup & Restore ```typescript MIKROTIK_COMMANDS.BACKUP_CREATE(name) // Tạo backup MIKROTIK_COMMANDS.BACKUP_RESTORE(name) // Restore backup MIKROTIK_COMMANDS.BACKUP_EXPORT(name) // Export RSC MIKROTIK_COMMANDS.BACKUP_LIST // Liệt kê backup ``` ### IP Configuration ```typescript MIKROTIK_COMMANDS.IP_ADDRESS_LIST // Liệt kê IP MIKROTIK_COMMANDS.IP_ADDRESS_ADD(iface, addr, netmask) // Thêm IP MIKROTIK_COMMANDS.IP_ADDRESS_REMOVE(id) // Xóa IP MIKROTIK_COMMANDS.IP_ROUTE_LIST // Liệt kê route MIKROTIK_COMMANDS.IP_ROUTE_ADD(dstAddr, gateway, distance) // Thêm route ``` ### Interface Management ```typescript MIKROTIK_COMMANDS.INTERFACE_LIST // Liệt kê interface MIKROTIK_COMMANDS.INTERFACE_VLAN_ADD(iface, vlanId, name) // Tạo VLAN MIKROTIK_COMMANDS.INTERFACE_BRIDGE_ADD(name) // Tạo Bridge MIKROTIK_COMMANDS.INTERFACE_BRIDGE_PORT_ADD(bridge, iface) // Thêm port vào Bridge ``` ### DHCP Server ```typescript MIKROTIK_COMMANDS.DHCP_SERVER_ADD(iface, pool, space) // Tạo DHCP server MIKROTIK_COMMANDS.DHCP_POOL_ADD(name, rangeStart, rangeEnd) // Tạo pool MIKROTIK_COMMANDS.DHCP_NETWORK_ADD(addr, gateway, dns) // Cấu hình mạng DHCP ``` ### DNS, Firewall, NTP, SNMP ```typescript MIKROTIK_COMMANDS.DNS_SERVER_ADD(address) MIKROTIK_COMMANDS.FIREWALL_NAT_LIST MIKROTIK_COMMANDS.NTP_CLIENT_ENABLE MIKROTIK_COMMANDS.SNMP_COMMUNITY_ADD(name, addresses) // ... và nhiều lệnh khác ``` ## Kiểm Tra Lệnh Nguy Hiểm Manager tự động kiểm tra các lệnh nguy hiểm trước khi thực thi: ```typescript const validation = manager.validateCommand('/system reboot'); if (!validation.valid) { console.log(validation.error); // Output: Dangerous command: /system reboot. Requires explicit confirmation. } ``` Các lệnh bị kiểm tra: - `/system reboot` - Khởi động lại - `/system shutdown` - Tắt máy - `/user remove` - Xóa người dùng - `/ip firewall nat reset` - Reset NAT ## Kiến Trúc ``` src/services/mikrotik/ ├── client.ts # Promise-based SSH wrapper (MikrotikSSH class) ├── manager.ts # Config manager (MikrotikManager class + MIKROTIK_COMMANDS) └── index.ts # Public exports ``` ### MikrotikSSH (client.ts) - `connect(opts)` - Kết nối SSH - `disconnect()` - Ngắt kết nối - `exec(cmd, timeoutMs)` - Thực thi một lệnh - `execMulti(cmds, opts)` - Thực thi nhiều lệnh tuần tự - `execParallel(cmds, timeoutMs)` - Thực thi lệnh song song - `isConnected()` - Kiểm tra trạng thái kết nối ### MikrotikManager (manager.ts) - `connect()` / `disconnect()` - Quản lý kết nối - `getSystemInfo()` - Thông tin hệ thống - `createBackup()` - Tạo backup - `listBackups()` - Liệt kê backup - `restoreBackup()` - Restore backup - `exportConfig()` - Export cấu hình RSC - `getConfigSnapshot()` - Snapshot cấu hình + hash - `computeDiff()` - So sánh hai snapshot - `applyCommands()` - Áp dụng nhóm lệnh - `setupDHCP()` - Thiết lập DHCP server - `getIPAddresses()`, `getRoutes()`, `getInterfaces()` - Lấy cấu hình - `validateCommand()` - Kiểm tra lệnh - `getLogs()` - Xem log ## Ví Dụ Nâng Cao ### Tự động Backup Hàng Ngày ```typescript async function dailyBackup() { const manager = new MikrotikManager('MT-01'); try { await manager.connect('192.168.1.1', 'admin', 'pwd'); const timestamp = new Date().toISOString().split('T')[0]; const backupName = `auto-backup-${timestamp}`; await manager.createBackup({ name: backupName }); console.log(`✓ Backup created: ${backupName}`); } finally { await manager.disconnect(); } } ``` ### So Sánh Cấu Hình Trước/Sau Thay Đổi ```typescript async function auditChanges() { const manager = new MikrotikManager('MT-01'); await manager.connect('192.168.1.1', 'admin', 'pwd'); // Snapshot trước const before = await manager.getConfigSnapshot(); // Thực hiện thay đổi await manager.applyCommands([ '/ip dns set servers=1.1.1.1', ]); // Snapshot sau const after = await manager.getConfigSnapshot(); // So sánh const diff = manager.computeDiff(before, after); console.log('Changed lines:', [...diff.added, ...diff.removed]); await manager.disconnect(); } ``` ### Triển Khai Cấu Hình với Rollback ```typescript async function deployConfig() { const manager = new MikrotikManager('MT-PROD'); await manager.connect('10.0.0.1', 'admin', 'pwd'); // Backup trước tiên await manager.createBackup({ name: `pre-deploy-${Date.now()}`, }); // Áp dụng cấu hình const result = await manager.applyCommands( [ '/ip address add interface=ether2 address=10.0.1.0/24', '/ip route add dst-address=192.168.0.0/16 gateway=10.0.0.254', '/ip dns set servers=8.8.8.8', ], { rollbackOnError: true } ); if (result.success) { console.log('✓ Deployment successful'); } else { console.error('✗ Deployment failed, automatic rollback triggered'); } await manager.disconnect(); } ``` ## Tham Khảo Tài Liệu - [MikroTik Official Documentation](https://help.mikrotik.com/docs/) - [MikroTik API Reference](https://wiki.mikrotik.com/wiki/Manual:API) - [RouterOS Command Reference](https://wiki.mikrotik.com/wiki/Manual:Command_Line_Interface) ## Dashboard (admin-dashboard) - Trang mới: `/mikrotik` trong admin-dashboard (React) để sinh lệnh nhanh cho bridge/VLAN, access/trunk, enable/disable interface, MTU, bonding. - Các lệnh được hiển thị dưới dạng block, có nút Copy để dán vào RouterOS terminal. - Mục tiêu: giảm sai sót nhập lệnh thủ công, cung cấp preset cho VLAN filtering và trunk/access. ## Lưu Ý Bảo Mật 1. **Xác thực**: Luôn dùng SSH key hoặc mật khẩu mạnh 2. **Lệnh Nguy Hiểm**: Manager sẽ từ chối một số lệnh phá hủy (`reboot`, `shutdown`, `reset`) 3. **Backup Thường Xuyên**: Luôn backup trước khi thực hiện thay đổi lớn 4. **Audit Logging**: Bật logging trên thiết bị để theo dõi tất cả thay đổi 5. **Rollback Strategy**: Sử dụng tùy chọn `rollbackOnError` khi triển khai ## Lỗi Thường Gặp | Lỗi | Nguyên Nhân | Giải Pháp | |-----|-----------|----------| | `Not connected to MikroTik device` | Chưa gọi `connect()` | Gọi `await manager.connect()` trước | | `Command timeout after 30000ms` | Lệnh chạy quá lâu | Tăng `perCommandTimeoutMs` | | `Dangerous command: /system reboot` | Lệnh bị block | Kiểm tra trong `validateCommand()` | | `SSH: No matching key exchange found` | SSH version không tương thích | Cập nhật ssh2 hoặc thiết bị | ## Phát Triển Tiếp Theo - [ ] Hỗ trợ mã hóa backup (encryption) - [ ] Diff trực quan với color highlight - [ ] Template cấu hình (Jinja2-like) - [ ] Triển khai cấu hình song song trên nhiều thiết bị - [ ] Tích hợp với chat handler để triển khai qua dialog - [ ] Web dashboard để quản lý backup - [ ] Webhook khi có thay đổi cấu hình ## License MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/babasida246/ai-mcp-gateway'

If you have feedback or need assistance with the MCP directory API, please join our Discord server