routeros-mndp
使用 MNDP 协议发现 MikroTik 设备
实现 MikroTik 设备发现需要理解 MNDP 线路格式和 RouterOS 邻居 API。本技能提供协议规范、TLV 解析示例和 REST API 模式,帮助你在 Claude 或 Claude Code 工作流中构建可靠的邻居发现功能。
下载技能 ZIP
在 Claude 中上传
前往 设置 → 功能 → 技能 → 上传技能
开启并开始使用
测试它
正在使用“routeros-mndp”。 我需要找到网络上所有 MikroTik 路由器。如何发现它们?
预期结果:
要发现 MikroTik 设备,你可以:
1. **检查 RouterOS /ip/neighbor**:通过 CLI 或 REST API 查询路由器本身,查看来自所有已连接接口的缓存发现结果。
2. **发送 MNDP 刷新数据包**:向 255.255.255.255:5678 广播一个 9 字节的 UDP 数据报(type=0x0000, sequence=0x0000)。所有 RouterOS 设备将以 TLV 编码的公告进行响应。
3. **预期响应时间**:局域网 1-3 秒,高延迟网络最长 10-30 秒。为提高可靠性,可以以 5 秒间隔发送多次刷新数据包。
设备会从接收接口以自己的 IP 地址响应,包含其身份(主机名)、板型、软件版本和 MAC 地址。
正在使用“routeros-mndp”。 MNDP 会揭示路由器的哪些信息?
预期结果:
MNDP 响应包含以下 TLV 字段:
- **类型 1**:MAC 地址(6 字节,大端序)
- **类型 5**:身份/主机名(UTF-8 字符串)
- **类型 7**:软件版本(例如 '7.18 (stable)')
- **类型 8**:平台(通常为 'MikroTik')
- **类型 10/13**:板型(例如 'RB4011iGS+5HacQ2HnD')
- **类型 11**:自启动以来的运行时间(秒)
- **类型 16**:发送响应的接口名称
- **类型 17**:发送接口的 IPv4 地址
注意:RouterOS 设备会按每个接口发送单独的 MNDP 公告,因此同一台路由器可能会以不同的 MAC 和 IP 多次出现。
正在使用“routeros-mndp”。 一台路由器没有出现在我的邻居列表中。如何调试?
预期结果:
排查邻居列表中缺失路由器的调试步骤:
1. **验证路由器发送 MNDP**:在路由器上检查 `/ip/neighbor/discovery-settings/print`,确认 MNDP 已启用。
2. **检查网络连通性**:路由器必须位于同一广播域中。MNDP 不会跨越路由器。
3. **查看时间预期**:本地局域网响应时间为 1-3 秒,但高延迟或隧道网络可能需要 10-30 秒。
4. **检查接口配置**:某些接口可能通过接口列表被排除。运行 `/interface/list/print` 进行查看。
5. **验证防火墙未阻止**:UDP 端口 5678 必须在两端都允许通过。
6. **考虑多接口行为**:具有 N 个接口的路由器会发送 N 个单独的公告——按身份分组以避免重复。
安全审计
低风险Static analysis detected 44 external_commands and 5 network patterns. After evaluation, all external_commands are documentation of code examples showing proper protocol implementation patterns (dgram socket, setsockopt). The backtick patterns in SKILL.md are embedded code samples in markdown, not runtime execution. Network patterns include hardcoded IPs (255.255.255.255, 192.168.88.1) which are legitimate broadcast addresses and example values. No malicious intent found; skill is safe for publication.
低风险问题 (1)
风险因素
⚙️ 外部命令 (44)
🌐 网络访问 (5)
检测到的模式
质量评分
你能构建什么
构建网络资产清单脚本
创建一个脚本来发现你网段上的所有 MikroTik 设备,并输出其身份、板型和软件版本。适用于无需逐台访问路由器即可审计设备群组的场景。
排查邻居列表中缺失的路由器
当 RouterOS 设备未出现在 WinBox 或你的资产清单中时,利用 MNDP 时序和数据包格式的知识来验证发现功能是否正常工作。检查接口配置和时间预期。
将设备发现集成到 Claude Code 工作流中
将 MikroTik 设备发现添加到你的 Claude Code 自动化流水线中。通过 REST 查询 /ip/neighbor 以获取当前路由器邻居状态,作为网络健康检查的一部分。
试试这些提示
我有一个 MNDP 响应数据包的原始字节。解析 TLV 记录并提取身份、版本、板型、MAC 地址和 IP 地址。 数据包十六进制:[提供十六进制数据] 显示解析后的字段及其 TLV 类型编号。
连接到位于 [router-ip] 的 MikroTik 路由器,并通过 REST API 查询 /ip/neighbor 表。返回所有已发现的设备,包括其 interface、address、mac-address、identity、platform 和 version 字段。
MNDP 协议中的 TLV 类型 0x0011 是什么?解释值格式、字节序,并提供 TypeScript 代码示例说明如何解析它。
编写一个 Node.js TypeScript 函数,创建一个 UDP 套接字监听端口 5678,启用 SO_REUSEPORT 和 SO_BROADCAST。包含自回声过滤功能,并将传入的 MNDP 响应数据包解析为结构化字段。
最佳实践
- 在监听窗口内以 5 秒间隔发送多个 MNDP 刷新数据包,以应对数据包丢失、WiFi 省电延迟和隧道中继延迟
- 显示结果时按身份(主机名)对已发现的设备进行分组,因为多接口路由器会按每个接口发送单独的公告
- 当你需要缓存结果而非从头实现原始套接字发现时,直接通过 REST API 查询 RouterOS /ip/neighbor 表
避免
- 不要假设设备在短扫描窗口内未出现就是离线;在得出设备不可达的结论之前应先增加超时时间
- 不要在未检查 TLV 边界的情况下实现原始数据包解析;格式错误的数据包可能导致缓冲区溢出
- 不要将同一台路由器显示多次;按身份分组,当身份为出厂默认值('MikroTik')时使用 MAC 地址进行区分
常见问题
MNDP 和网络扫描之间有什么区别?
为什么同一台路由器在结果中出现多次?
我应该等待 MNDP 响应多长时间?
MNDP 能发现不同子网中的设备吗?
MNDP 会揭示我的路由器的哪些信息?
如何通过 REST API 从 RouterOS 访问 MNDP 结果?
开发者详情
文件结构
📄 SKILL.md