SuperAPI AI 工具集

routeros-sniffer

部署与运维

查看项目

更新于 10-16 02:43

技能介绍

用途

本技能用于在 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)。