tcpdump 在终端路由器调试中的实用技巧——报文转发问题排查必备

张开发
2026/4/21 2:29:23 15 分钟阅读

分享文章

tcpdump 在终端路由器调试中的实用技巧——报文转发问题排查必备
tcpdump 是终端路由器开发中最常用的调试工具——报文转发不通、NAT 异常、VLAN 问题第一步都是抓包看。但在嵌入式设备上用 tcpdump 和在 PC 上不太一样特别是有硬件加速的情况下拓包本身就有坑。本文整理了实际开发中最常用的 tcpdump 技巧和注意事项。1. 在终端路由器上怎么拓包终端路由器不像 PC 那样有图形界面抓包通常是这样操作的1. 通过telnet或串口登录设备2. 在命令行里运行tcpdump3. 指定要抓包的接口和过滤条件# 最基本的用法在 br0 接口上抓所有包 tcpdump -i br02. 最常用的 tcpdump 参数参数作用示例-i指定抓包接口tcpdump -i wan0-nn不解析域名和端口号显示数字速度更快tcpdump -i br0 -nn-e显示 MAC 地址和以太网头信息tcpdump -i br0 -e看 MAC 地址、VLAN tag-w把抓包结果写入文件后续用 Wireshark 分析tcpdump -i wan0 -w /tmp/cap.pcap-c抓指定数量的包后停止tcpdump -i br0 -c 100-v / -vv显示更详细的报文信息tcpdump -i br0 -vv-in / -out只抓入方向或出方向的报文部分平台支持tcpdump -i wan0 -in常用组合# 抓包不解析域名显示 MAC # 这是最常用的组合 tcpdump -i br0 -nn -e # 抓包并保存到文件后续拿到 PC 上用 Wireshark 打开 tcpdump -i wan0 -nn -w /tmp/cap.pcap # 只抓 100 个包 tcpdump -i br0 -nn -e -c 1003. 常用过滤条件在终端路由器上流量很多不加过滤条件会刷屏。常用的过滤按 IP 地址过滤# 只看某个内网设备的报文 tcpdump -i br0 -nn host 192.168.1.100 # 只看某个目的 IP tcpdump -i wan0 -nn dst 8.8.8.8 # 只看某个源 IP tcpdump -i br0 -nn src 192.168.1.100按端口过滤# 只看 HTTP 流量 tcpdump -i br0 -nn port 80 # 只看 DNS 流量 tcpdump -i br0 -nn port 53 # 只看 HTTPS 流量 tcpdump -i wan0 -nn port 443按协议过滤# 只看 ARP 报文 tcpdump -i br0 -nn arp # 只看 ICMPping tcpdump -i br0 -nn icmp # 只看 TCP tcpdump -i br0 -nn tcp # 只看 UDP tcpdump -i br0 -nn udp按 MAC 地址过滤# 只看某个 STA 的报文配合 -e 看 MAC tcpdump -i br0 -nn -e ether src AA:BB:CC:DD:EE:01组合过滤# 某个 IP 的 TCP 80 端口流量 tcpdump -i br0 -nn host 192.168.1.100 and port 80 # 某个 IP 的所有流量排除 SSH避免抓到自己的登录连接 tcpdump -i br0 -nn host 192.168.1.100 and not port 224. 报文转发问题排查方法沿路径抓包这是 tcpdump 在终端路由器开发中最核心的用法当报文转发不通时沿着报文的转发路径逐个接口抓包确认报文到底丢在了哪一段。上行场景STA → 外网STA 发出的报文到不了外网怎么查STA → LAN 口 → br0 → 内核转发 → wan0 (wan0.100) → 外网在每个节点拓包# 第1步在 LAN 侧桥接口抓看报文有没有进来 tcpdump -i br0 -nn host 192.168.1.100 # 如果抓到 → 说明 LAN 侧没问题报文已进入设备 # 如果抓不到 → 报文压根没进来查 LAN 口物理连接 # 第2步在 WAN 口抓看报文有没有发出去 tcpdump -i wan0 -nn src 192.168.1.100 # 如果抓到 → 报文已发出但注意看源 IP # - 如果源 IP 还是 192.168.1.100 → NAT 没生效 # - 如果源 IP 变成了 WAN IP → NAT 正常 # 如果抓不到 → 报文在内核转发过程中被丢了下行场景外网 → STA# 第1步在 WAN 口抓看外网回程报文有没有到达 tcpdump -i wan0 -nn dst 10.0.0.1 # WAN 口 IP # 第2步在 LAN 侧抓看报文有没有转给 STA tcpdump -i br0 -nn dst 192.168.1.100这就是“沿路径抓包”的核心思路1. 报文进来了吗→ 在入口抓2. 报文出去了吗→ 在出口抓3. 如果入口有、出口没有 → 报文在中间被丢了缩小范围继续查5. 关键坑加速开着时抓不到包这是终端路由器抓包中最大的坑⚠️硬件加速开着的时候大部分报文不经过内核tcpdump 抓不到tcpdump 工作在 Linux 内核的网络协议栈上只能抓到经过内核的报文。当芯片硬件加速生效后报文直接在芯片里转发不经过内核所以 tcpdump 看不到。解决方法先关加速再抓包# 关闭硬件加速具体命令因芯片平台而异这里是示意 echo 0 /proc/xxx/hw_accel_enable # 具体路径看芯片 SDK 文档 # 然后再抓包 tcpdump -i br0 -nn -e # 调试完毕后记得打开加速 echo 1 /proc/xxx/hw_accel_enable为什么要这样回顾一下前几篇文章讲的加速机制[加速开着] 报文 → 芯片查加速表 → 命中 → 芯片直接转发 ← tcpdump 看不到 → 未命中 → 走内核 ← tcpdump 能看到 [加速关了] 报文 → 全部走内核 ← tcpdump 全都能看到所以加速开着的时候你只能抓到• 新连接的前几个包还在学习阶段• 没达到 pps 阈值的低速流量• ARP、DHCP 等特殊协议报文6. 用 tcpdump 看关键信息看 NAT 是否生效# 在 WAN 口抓包看源 IP 是不是 WAN 口 IP tcpdump -i wan0 -nn src 192.168.1.100 # 如果能抓到 src192.168.1.100 的包 → NAT 没生效私网 IP 直接发出去了 tcpdump -i wan0 -nn src 10.0.0.1 # 如果能抓到 src10.0.0.1 的包 → NAT 正常源 IP 已换成 WAN IP看 VLAN tag# 用 -e 参数显示以太网头可以看到 VLAN 信息 tcpdump -i wan0 -nn -e # 输出类似 # AA:BB:CC:DD:EE:01 FF:FF:FF:FF:FF:FF, ethertype 802.1Q (0x8100), vlan 100, ... # ^^^^^^^^ # 这里显示 VLAN ID看 MAC 地址# 用 -e 看源 MAC 和目的 MAC tcpdump -i br0 -nn -e # 输出类似 # AA:BB:CC:DD:EE:01 11:22:33:44:55:66, ethertype IPv4 (0x0800), ... # ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ # 源 MAC 目的 MAC看 TCP 连接状态# 看 TCP 三次握手和四次挥手 tcpdump -i br0 -nn tcp and host 192.168.1.100 # 看到 SYN → SYN-ACK → ACK 就是正常建连 # 看到 FIN → ACK 就是正常断开 # 只看到 SYN 没有回复 → 对端没响应可能是路由或 NAT 问题7. 保存抓包文件 Wireshark 分析设备上的 tcpdump 显示信息有限复杂问题建议把抓包保存成文件拿到 PC 上用 Wireshark 打开分析# 在设备上抓包并保存 tcpdump -i wan0 -nn -c 500 -w /tmp/capture.pcap # 把文件拷出来通过 tftp、scp 或其他方式 tftp -pl /tmp/capture.pcap 192.168.1.2 # 示例 # 在 PC 上用 Wireshark 打开 capture.pcap 进行详细分析用 Wireshark 可以• 看完整的报文内容每一层的头部字段• 追踪 TCP 流• 统计流量• 用更复杂的过滤条件8. 抓包排查实战流程当转发出现问题时按以下流程排查第1步关闭硬件加速 │ 确保所有报文都走内核tcpdump 能抓到 ▼ 第2步在入口接口抓包 │ 确认报文进来了没有 ▼ 第3步在出口接口抓包 │ 确认报文发出去了没有 ▼ 第4步对比入口和出口的报文 │ 看 NAT 是否正确、VLAN 是否正确、MAC 是否正确 ▼ 第5步如果内核侧正常打开加速再测试 │ 如果加速开了就不正常 → 问题在芯片加速侧 ▼ 定位到问题所在的层级和模块这个流程的精髓是1. 先关加速让所有报文走内核这样才能抓到2. 沿路径抓确定报文丢在哪一段3. 内核侧没问题再开加速确认是不是加速的问题这个方法能快速把问题缩小到“内核侧”或“芯片侧”。9. 开发实用建议1.抓包前先关加速——否则大部分报文被芯片加速了tcpdump 抓不到2.加-nn避免 DNS 解析延迟——嵌入式设备上 DNS 解析很慢不加-nn会导致输出很卡3.加-e看 MAC 和 VLAN——在终端路由器开发中MAC 地址和 VLAN tag 是经常需要检查的4.复杂问题用-w保存文件——拿到 PC 上用 Wireshark 分析比在命令行里眘眉效率高得多5.抓包时加过滤条件——设备上流量很多不加过滤会刷屏而且可能影响设备性能6.抓完记得开加速——别调试完忘了把加速打开否则设备性能会很差7.注意抓包位置与 VLAN 的关系——在wan0上抓可能看到带 VLAN 的报文在wan0.100VLAN 子接口上抓看到的是剥离后的总结要点说明最常用的组合tcpdump -i 接口 -nn -e不解析域名 显示 MAC核心排查思路关加速 → 沿路径抓包 → 确定丢包位置 → 开加速验证最大的坑加速开着时 tcpdump 抓不到包必须先关加速复杂问题用-w保存文件拿到 PC 用 Wireshark 分析看 NAT在 WAN 口抓看源 IP 是否已经变成 WAN IP看 VLAN加-e参数在 WAN 口抓可以看到 VLAN tag作者按tcpdump 是终端路由器开发中最常用的调试工具没有之一。掌握关加速 沿路径抓包的方法能快速定位绝大部分转发问题。

更多文章