mcpField
R
routeros-sniffer

routeros-sniffer

github.com/tikoci云与 DevOps8346 次安装5 天前更新
代码仓库

关于 routeros-sniffer

面向 RouterOS 网络排障人员与 Agent 的抓包技能,介绍内置 sniffer、文件捕获和 TZSP 实时流。还涵盖防火墙 mangle 定向镜像、QEMU CHR 测试及常见限制。

主要功能

  1. 01按接口、协议和地址过滤抓包
  2. 02保存 PCAPNG 文件或使用内存缓冲
  3. 03通过 TZSP 实时传输数据包
  4. 04用 mangle 规则镜像指定流量
  5. 05说明抓包限制与清理步骤

适用场景

  1. 01排查 RouterOS 上的网络协议问题
  2. 02将实时流量发送到 Wireshark 分析
  3. 03保存数据包文件以供后续分析
  4. 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 应知道可以:

  1. 将实时数据包从路由器流式传输到主机,使用 CHR VM 时无需硬件
  2. 在路由器闪存中保存 pcap/pcapng 文件,并下载进行分析
  3. 使用防火墙 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-directionany、rx 或 tx
filter-streamyes/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 数据包的目标 IP
  • sniff-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 文档,请使用 rosetta MCP 服务工具(routeros_search、routeros_get_page)

评论

支持 Markdown