用途
本技能用于在 RouterOS 上进行数据包捕获与协议调试。由于 RouterOS 上不存在 tcpdump 等标准抓包工具,抓包依赖内置的 /tool/sniffer 以及防火墙 mangle 动作。这些机制既可以把流量保存到路由器本地文件,也可以将实时流量通过 TZSP(TaZmen Sniffer Protocol)流式传输到远端主机进行分析。
主要能力
方式一:/tool/sniffer 完整抓包工具
内置 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 流式配置示例:
/tool/sniffer
set streaming-enabled=yes streaming-server=<RECEIVER-IP>:37008
set filter-interface=ether1
set filter-ip-protocol=icmp
/tool/sniffer/start
/tool/sniffer/stop
基于文件的抓包示例:
/tool/sniffer
set file-name=capture.pcap filter-interface=ether1
/tool/sniffer/start
/tool/sniffer/stop
/tool/sniffer/save file-name=/flash/debug.pcap
文件与流式输出可同时启用。quick 模式用于在路由器控制台直接做一次性快速查看:
/tool/sniffer/quick ip-protocol=icmp interface=ether1
常用过滤属性包括:filter-interface、filter-ip-address、filter-dst-ip-address、filter-src-ip-address、filter-port(支持 ! 取反)、filter-ip-protocol、filter-mac-protocol、filter-direction(any/rx/tx)、filter-stream、filter-vlan、memory-limit、file-limit、only-headers。注意 filter-stream=yes(默认值)会排除 sniffer 自身产生的 TZSP 流数据包,用于避免反馈循环。
方式二:防火墙 mangle 定向镜像
mangle 规则利用防火墙完整匹配引擎,可按流粒度镜像流量,提供两个与抓包相关的动作:
action=sniff-tzsp:将匹配的数据包以 TZSP 镜像到远端主机。- 相关属性:
sniff-target(目标 IP)、sniff-target-port(默认 37008)、sniff-id(可选标识)。
示例:
/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"
选中并匹配后,sniff-tzsp 表现为 passthrough:原始数据包不会被修改或丢弃,只是复制一份以 TZSP 发送出去。
方式选择建议
- 抓取接口上全部流量:使用
/tool/sniffer。 - 镜像特定流(按 IP、端口、协议):使用 mangle
sniff-tzsp。 - 在路由器 flash 上保存 pcap 文件:使用
/tool/sniffer并设置file-name。 - 实时流到 Wireshark/tshark:两者皆可。
- 向多个不同接收端做独立镜像:使用 mangle 规则(每个目标一条)。
- 命令行快速交互查看:使用
/tool/sniffer/quick。
TZSP 协议概述
TZSP 是一种简单的 UDP 封装:路由器把原始以太网帧包裹在 TZSP 头中,以 UDP 数据报发送。结构为:UDP(端口 37008)→ TZSP 头(4 字节)→ 标签(可变)→ TAG_END → 原始以太网帧。默认端口 37008(0x9090),非 IANA 注册,但为 RouterOS/Wireshark 的通用标准。封装通常为以太网(type 1),无线抓包为 802.11。标签为可选元数据(WLAN 信号强度、信道等),以太网抓包通常无标签。周期性发送类型 4(Null)保活包,不含内部帧,处理时应过滤。
使用方式(CHR 测试流程)
QEMU CHR 实例可提供零硬件的完整抓包实验环境。免费 CHR 授权有 1 Mbps 速率限制,但足以进行协议调试和 sniffer 测试。
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
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"}'
curl -u admin: -X POST http://<router-ip>/rest/tool/sniffer/start
tshark -i any -f "udp port 37008" -O tzsp
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)即宿主机,可作为 streaming-server;宿主机需监听全部接口(或 10.0.2.2)以接收 TZSP 包。
适用场景
- 在 RouterOS 上调试各类网络协议问题。
- 无物理硬件时,配合 QEMU CHR 实例完成数据包级调试工作流。
- 需要按流精细镜像(按 IP、端口、协议)时。
- 需要将实时流量交由 Wireshark/tshark 分析时。
限制与注意事项
- 硬件卸载的桥接流量对 sniffer 不可见,仅可能看到泛洪的数据包(未知单播、广播、组播)。
- 启用转发的无线客户端到客户端单播不可见。
- 内存中的抓包 10 分钟后过期,需保存到文件或使用流式输出做持久捕获。
- RouterOS 7.20+ 保存文件默认 PCAPNG 格式,较旧工具可能需要 PCAP。
filter-stream=yes(默认)很重要,否则 sniffer 会抓取自身 TZSP 流数据包,形成反馈循环。- 1 Mbps 的 CHR 速率限制可能导致抓包显得偏慢,这是免费授权限制,并非 sniffer 问题。
file-limit不应超过可用内存,否则路由器可能崩溃或行为异常。
清理
调试结束后应清理 sniffer 配置和 mangle 规则:
/tool/sniffer/stop
/tool/sniffer
set streaming-enabled=no streaming-server=0.0.0.0 file-name=""
/ip/firewall/mangle/remove [find comment~"TZSP"]
相关参考包括 TZSP 接收端(Wireshark、tshark、tcpdump)设置、routeros-qemu-chr(QEMU CHR 与 CHR 授权)、routeros-fundamentals(CLI/REST 基础)、routeros-command-tree(/console/inspect 命令树),以及用于 RouterOS 文档查询的 rosetta MCP 工具(routeros_search、routeros_get_page)。