tcpdump是容器网络不通时定位数据包丢弃、篡改或未到达问题的最可靠手段,关键在于选对抓包位置(容器内、docker0、物理网卡或nsenter)、精准过滤(如host IP and port 80)、并结合Wireshark三步分析:查SYN是否发出、桥接网卡是否收到、目标端是否响应。

容器网络不通时,光看日志和 ping 往往不够——真正的问题常藏在数据包是否发出、是否到达、是否被丢弃或篡改里。tcpdump 是直接“看见”流量的最可靠手段,关键在于抓对位置、过滤准目标、解读清行为。
先确认能抓到哪儿的包
容器网络链路长,抓包点选错等于白忙: • 容器内部:看到的是应用发出去的原始报文(含 DNS、HTTP 等),但看不到宿主机转发、NAT 或隧道封装后的样子; • 宿主机 veth 对端(如 docker0、cni0 桥接网卡):能看到容器进出桥接网络的流量,适合查跨容器通信是否卡在本地; • 宿主机物理网卡或 vxlan 接口(如 flannel.1):能看到封装后的真实出向流量,排查跨节点通信、防火墙拦截、隧道异常必须在这里抓; • 使用 nsenter -t $PID -n tcpdump 可进入容器网络命名空间,效果等同于在容器内执行,但无需容器自带 shell 或 tcpdump。
快速抓包并保存文件
推荐两种低侵入方式:
• 直接进容器(若已安装 tcpdump):
docker exec -it
docker inspect
nsenter -t $PID -n tcpdump -i eth0 -w /tmp/capture.pcap port 5432
常用过滤表达式,直击问题场景
别抓全量,用过滤缩小范围: • 查某服务连不通: host 10.244.2.12 and port 3306 • 排除干扰只看业务流量: port 80 or port 443 and not port 53 • 看 TCP 建连是否成功: tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn(只抓 SYN 包) • 抓 vxlan 封装流量(flannel/calico overlay 场景): udp port 8472
抓完怎么看:三步定位故障层
把 pcap 文件拖进 Wireshark 或用 tcpdump -r 读取后,关注: • 若容器内有 SYN 发出,宿主机桥接网卡没收到 → 容器网络栈或 veth 配置异常; • 桥接网卡收到 SYN,但物理网卡/隧道接口没发出 → NAT、路由、防火墙或 CNI 插件拦截; • 目标端能收到 SYN 但不回 SYN-ACK → 目标服务未监听、端口被占、或目标节点防火墙丢包; • 能收包但应用无响应 → 问题大概率在应用层(如连接池耗尽、逻辑阻塞),非网络层。











