Docker网桥无法转发tcpreplay的IPv6/UDP流量问题排查
排查方向
校验链路层MAC地址正确性
用tcpdump -nn -e在Docker网桥上同时捕获nc发送的正常UDP包和tcpreplay发出的包,对比两者的链路层字段:- 确认tcpreplay包的源MAC是容器A的网卡MAC,目的MAC是网桥的网关MAC(或容器B的MAC,取决于ND邻居表)
- 如果tcpreplay沿用了pcap中原有的旧MAC,网桥无法正确转发,需用
tcpreplay-edit添加--enet-dmac <网桥/容器B的MAC>参数修改目的MAC
修复UDP校验和
修改IPv6地址后,UDP校验和会失效,容器B的网络栈会直接丢弃校验和错误的包。执行tcpreplay-edit时添加--fixcsum参数自动修复校验和:tcpreplay-edit --fixcsum --srcip6 <容器A IPv6> --dstip6 <容器B IPv6> -i eth0 input.pcap检查容器B的IPv6过滤规则与系统参数
- 在容器B内执行
ip6tables -L -v,确认FORWARD/INPUT链没有DROP目标端口UDP包的规则 - 检查反向路径过滤参数:
sysctl -a | grep ipv6.*rp_filter,若为严格模式(值为1),可能丢弃源IP不符合路由的raw包,可临时设置为宽松模式测试:sysctl -w net.ipv6.conf.all.rp_filter=2
- 在容器B内执行
验证IPv6邻居表与网桥转发
- 在主机上执行
ip -6 neigh show,确认容器B的IPv6地址对应的MAC与容器B网卡MAC一致,若存在 stale/FAILED 状态,执行ip -6 neigh flush all刷新邻居表 - 检查主机IPv6转发是否开启:
sysctl net.ipv6.conf.all.forwarding,确保值为1,若不是则执行sysctl -w net.ipv6.conf.all.forwarding=1
- 在主机上执行
对比数据包全字段差异
- 分别捕获nc和tcpreplay的数据包:
# 捕获nc的正常包 tcpdump -w nc_normal.pcap -i eth0 udp port <目标端口> # 捕获tcpreplay的包 tcpdump -w tcpreplay_test.pcap -i eth0 udp port <目标端口> - 用
tcpdump -nnvtttt或Wireshark对比两个包的IPv6头部(跳数限制、流标签、流量类别)、UDP头部(校验和、端口),重点排查tcpreplay包是否存在不符合容器网络环境的字段(比如跳数限制为0)
- 分别捕获nc和tcpreplay的数据包:
检查tcpreplay的接口与发送参数
- 确认tcpreplay指定的发送接口是容器A的正确网卡(通常为eth0),可通过
ip addr在容器A内确认 - 避免使用可能导致包异常的参数,比如
--loop或过高的发送速率,先以单包、低速发送测试:tcpreplay --rate=1pps -i eth0 edited.pcap
- 确认tcpreplay指定的发送接口是容器A的正确网卡(通常为eth0),可通过
内容的提问来源于stack exchange,提问作者Александр Никишов
相关产品推荐
相关产品推荐

