关于 routeros-sniffer
面向 RouterOS 网络排障人员与 Agent 的抓包技能,介绍内置 sniffer、文件捕获和 TZSP 实时流。还涵盖防火墙 mangle 定向镜像、QEMU CHR 测试及常见限制。
主要功能
- 01按接口、协议和地址过滤抓包
- 02保存 PCAPNG 文件或使用内存缓冲
- 03通过 TZSP 实时传输数据包
- 04用 mangle 规则镜像指定流量
- 05说明抓包限制与清理步骤
适用场景
- 01排查 RouterOS 上的网络协议问题
- 02将实时流量发送到 Wireshark 分析
- 03保存数据包文件以供后续分析
- 04在 QEMU CHR 中测试抓包配置
MCP 相关
README 提及 rosetta MCP 服务,可用于查询 RouterOS 文档。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tikoci/ routeros-skills --skill routeros-sniffer安装后在 Claude Code 中输入/routeros-sniffer确认已加载。
附带文件references/tzsp-receivers.md
详细介绍
RouterOS 数据包捕获与 TZSP 流式传输
RouterOS 内置数据包嗅探器(/tool/sniffer)和防火墙 mangle 操作可镜像流量——既可以将流量保存到路由器上的文件,也可以通过 TZSP(TaZmen Sniffer Protocol)实时流式传输到远程主机。由于 RouterOS 上不存在 tcpdump 等标准工具,这是在 RouterOS 上捕获数据包的主要方式(参见 routeros-fundamentals 技能)。
这对 Agent 有何重要意义
在 RouterOS 上排查任何网络协议问题时,Agent 应知道可以:
- 将实时数据包从路由器流式传输到主机,使用 CHR VM 时无需硬件
- 在路由器闪存中保存 pcap/pcapng 文件,并下载进行分析
- 使用防火墙 mangle 规则进行精确的逐流数据包镜像,无需修改嗅探器配置
结合 QEMU CHR 实例(参见 routeros-qemu-chr 技能),Agent 无需任何实体硬件即可完成数据包级调试工作流。
方法 1:/tool/sniffer(完整捕获工具)
内置嗅探器可在指定接口上捕获数据包,并提供丰富的过滤功能。它支持三种可独立使用的输出模式,也可以组合使用:
| 输出 | 设置 | 说明 |
|---|---|---|
| 内存缓冲区 | (始终开启) | 可通过 quick、packet、protocol、host、connection 子菜单查看。数据包保留 10 分钟 |
| 闪存中的文件 | file-name=capture.pcap | 从 RouterOS 7.20 开始使用 PCAPNG 格式 |
| TZSP 流 | streaming-enabled=yes | 通过 UDP 将数据包发送到 streaming-server 上的 streaming-port(默认值为 37008) |
实时 TZSP 流式传输
# Configure sniffer to stream via TZSP to a remote host
/tool/sniffer
set streaming-enabled=yes streaming-server=<RECEIVER-IP>:37008
# Optional: filter to a specific interface or protocol
set filter-interface=ether1
set filter-ip-protocol=icmp
# Start capture (runs until stopped or router reboots)
/tool/sniffer/start
# Stop when done
/tool/sniffer/stop
接收端主机运行 Wireshark、tshark 或其他支持 TZSP 的工具(参见 TZSP 接收端参考)。
基于文件的捕获
# Capture to file on router flash
/tool/sniffer
set file-name=capture.pcap filter-interface=ether1
/tool/sniffer/start
# ... let it capture ...
/tool/sniffer/stop
# Or save the memory buffer to a file manually
/tool/sniffer/save file-name=/flash/debug.pcap
# Download via SCP or fetch
# From the host:
# scp admin@<ROUTER-IP>:/flash/debug.pcap .
文件保存和流式传输可以同时运行:
/tool/sniffer
set file-name=capture.pcap streaming-enabled=yes streaming-server=<RECEIVER-IP>:37008
/tool/sniffer/start
快速模式(交互式 CLI)
如需直接在路由器控制台上快速进行一次性检查:
# Quick-capture ICMP traffic on ether1
/tool/sniffer/quick ip-protocol=icmp interface=ether1
这会在控制台上显示实时滚动表格,其中包含源/目标 MAC、IP、协议和大小。
嗅探器过滤属性
/tool/sniffer/set 的关键过滤选项:
| 属性 | 说明 |
|---|---|
filter-interface | 接口名称或 all(默认值:all) |
filter-ip-address | 最多 16 个 IP/掩码条目 |
filter-dst-ip-address | 最多 16 个目标 IP/掩码条目 |
filter-src-ip-address | 最多 16 个源 IP/掩码条目 |
filter-port | 最多 16 个端口(支持 ! 取反) |
filter-ip-protocol | 最多 16 个协议(tcp、udp、icmp 等) |
filter-mac-protocol | 最多 16 个 MAC 协议(ip、arp、ipv6、vlan 等) |
filter-direction | any、rx 或 tx |
filter-stream | yes/no——过滤掉嗅探器自身的 TZSP 数据包(默认值:yes) |
filter-vlan | 最多 16 个 VLAN ID |
memory-limit | 内存缓冲区大小(默认值:100 KiB) |
file-limit | 最大文件大小(默认值:1000 KiB) |
only-headers | 仅保存数据包头,不保存完整载荷 |
重要:filter-stream=yes(默认值)会将嗅探器自身的 TZSP 流数据包排除在捕获范围之外——请保持此选项开启,以避免反馈循环。
方法 2:防火墙 Mangle(定向镜像)
防火墙 mangle 规则使用完整的防火墙匹配器,支持细粒度的逐流镜像。有两种与嗅探相关的操作:
action=sniff-tzsp(流式传输到远程 TZSP 接收端)
将符合条件的数据包镜像为 TZSP 并发送到远程主机。使用防火墙完整的匹配引擎(源/目标地址、协议、端口、连接状态、接口等):
# Mirror all forwarded ICMP to a TZSP receiver
/ip/firewall/mangle
add action=sniff-tzsp chain=forward protocol=icmp \
sniff-target=<RECEIVER-IP> sniff-target-port=37008 \
comment="TZSP mirror ICMP to Wireshark"
# Mirror traffic from a specific host
/ip/firewall/mangle
add action=sniff-tzsp chain=forward src-address=192.168.88.100 \
sniff-target=<RECEIVER-IP> sniff-target-port=37008
# Mirror DNS queries
/ip/firewall/mangle
add action=sniff-tzsp chain=forward protocol=udp dst-port=53 \
sniff-target=<RECEIVER-IP> sniff-target-port=37008
sniff-tzsp 的属性:
sniff-target(IP)——TZSP UDP 数据包的目标 IPsniff-target-port(端口,默认值为 37008)——目标 UDP 端口sniff-id——可选的标识标签
关键行为:sniff-tzsp 的行为类似于 passthrough——匹配后,数据包会继续传递到下一条 mangle 规则。原始数据包不会被修改或丢弃;只有副本会作为 TZSP 发送。
Mangle 与 /tool/sniffer:何时使用哪种方式
| 场景 | 使用 |
|---|---|
| 捕获接口上的所有流量 | /tool/sniffer |
| 镜像特定流量(按 IP、端口、协议) | Mangle sniff-tzsp |
| 将 pcap 文件保存到路由器闪存 | 使用 /tool/sniffer 和 file-name |
| 实时传输到 Wireshark/tshark | 两者均可:使用 /tool/sniffer 和 streaming-enabled,或使用 Mangle sniff-tzsp |
| 将多个独立镜像发送到不同接收端 | Mangle 规则(每个目标一条) |
| 快速查看交互式 CLI 视图 | /tool/sniffer/quick |
TZSP 协议概览
TZSP 是一种简单的 UDP 封装协议:路由器将原始以太网帧封装在 TZSP 标头中,并将其作为 UDP 数据报发送:
UDP (port 37008) → TZSP header (4 bytes) → tags (variable) → TAG_END → original Ethernet frame
- **默认端口:**37008(
0x9090)——未在 IANA 注册,但属于 RouterOS/Wireshark 标准 - **封装:**通常为以太网(类型 1);无线抓包使用 802.11
- **标签:**可选元数据(WLAN 信号强度、信道等);以太网抓包通常不带标签
- **保活包:**定期发送类型 4(Null)数据包——不含内部帧,处理时请过滤掉这些数据包
CHR 测试模式
QEMU CHR 实例可提供完整的抓包实验环境,无需任何硬件。免费的 CHR 许可证有 1 Mbps 速度限制,但足以用于协议调试和嗅探器测试。
# 1. Boot a CHR instance with port forwarding for REST API and SSH
qemu-system-x86_64 -M q35 -m 256 \
-drive file=chr.img,format=raw,if=virtio \
-netdev user,id=net0,hostfwd=tcp::9180-:80,hostfwd=tcp::9122-:22 \
-device virtio-net-pci,netdev=net0 \
-display none -serial stdio
# 2. Configure sniffer via REST API once booted
curl -u admin: -X POST http://<router-ip>/rest/tool/sniffer/set \
-H 'Content-Type: application/json' \
-d '{"streaming-enabled":"yes","streaming-server":"10.0.2.2:37008"}'
# 3. Start capture
curl -u admin: -X POST http://<router-ip>/rest/tool/sniffer/start
# 4. Listen for TZSP on the host
tshark -i any -f "udp port 37008" -O tzsp
# 5. Generate test traffic (e.g., ping from the CHR)
curl -u admin: -X POST http://<router-ip>/rest/ping \
-H 'Content-Type: application/json' \
-d '{"address":"8.8.8.8","count":"3"}'
**QEMU 用户模式网络说明:**CHR 的默认网关(10.0.2.2)是主机。使用 QEMU -netdev user 时,将此 IP 用作 streaming-server。主机必须在所有接口上(或专门在 10.0.2.2 上)监听,才能接收 TZSP 数据包。
如需了解完整的 QEMU 设置详情,请参阅 routeros-qemu-chr 技能。如需了解 CHR 许可证详情(免费层级、60 天试用、速度限制),请参阅 CHR 许可证。
注意事项
- 硬件卸载的网桥流量不会被嗅探器捕获——可能出现的只有泛洪数据包(未知单播、广播、多播)
- 启用转发时,无线客户端之间的单播流量不会被捕获
- 内存中的嗅探数据包会在 10 分钟后过期——如需持久捕获,请保存到文件或使用流式传输
- PCAPNG 格式(RouterOS 7.20+)是保存文件的默认格式——较旧的工具可能需要 PCAP
filter-stream=yes(默认值)很重要——否则嗅探器会捕获自身的 TZSP 流数据包,造成反馈循环- CHR 的 1 Mbps 速度限制可能导致捕获“较慢”——这是免费许可证的限制,并非嗅探器问题。请参阅 CHR 许可证
file-limit不应超过可用内存——否则路由器可能崩溃或出现异常行为
清理
调试后务必清理嗅探器配置和 Mangle 规则:
# Stop sniffer
/tool/sniffer/stop
# Reset sniffer config to defaults
/tool/sniffer
set streaming-enabled=no streaming-server=0.0.0.0 file-name=""
# Remove mangle rules (find by comment)
/ip/firewall/mangle/remove [find comment~"TZSP"]
其他资源
参考文件:
- 如需了解 TZSP 接收端设置(Wireshark、tshark、tcpdump),请参阅 TZSP 接收端参考
相关技能:
- 如需了解 QEMU CHR 设置和启动模式,请参阅
routeros-qemu-chr技能 - 如需了解 CHR 许可证(免费层级、60 天试用、速度限制),请参阅
routeros-qemu-chr技能 - 如需了解 RouterOS CLI/REST 基础知识,请参阅
routeros-fundamentals技能 - 如需了解
/console/inspect命令树,请参阅routeros-command-tree技能
MCP 工具:
- 如需查询 RouterOS 文档,请使用
rosettaMCP 服务工具(routeros_search、routeros_get_page)