直接在容器内运行tcpdump是最可靠、最隔离的方式,天然只捕获该容器网络命名空间内流量;需安装tcpdump、授予CAP_NET_RAW能力、指定eth0接口并加-s 0等关键参数。

直接在容器内运行 tcpdump,是最可靠、最隔离的方式。它天然只看到该容器网络命名空间内的流量,既不干扰宿主机,也不影响其他容器。
进入容器并安装 tcpdump
大多数基础镜像(如 alpine、busybox)默认不带 tcpdump,需临时安装:
- Alpine:运行
apk add -q tcpdump - Debian/Ubuntu:运行
apt-get update && apt-get install -y tcpdump - CentOS/RHEL:运行
yum install -y tcpdump或dnf install -y tcpdump
若容器已退出或无法交互,可在启动时挂载 tcpdump 二进制或使用带工具的调试镜像(如 nicolaka/netshoot)。
必须添加 NET_RAW 能力
tcpdump 需要原始套接字权限,容器默认被禁用。不能加 --privileged,应最小化授权:
- Docker 启动时:加
--cap-add=NET_RAW - Kubernetes Pod 中:在
securityContext.capabilities.add下写["NET_RAW"]
缺少该能力会报错:tcpdump: eth0: You don't have permission to capture on that device。
指定 eth0 接口 + 精准过滤
容器内唯一有效的网络接口是 eth0(对应宿主机上的 veth 对端),不要用 lo 或 any:
- 抓访问某数据库的流量:
tcpdump -i eth0 -nn -s 0 'host 10.96.200.5 and port 5432' - 只看出向请求:
tcpdump -i eth0 -nn 'tcp and src port 8080' - 排除健康检查:
tcpdump -i eth0 -nn 'not port 8080 and not icmp'
务必加 -s 0,否则默认截断 96 字节,HTTP body、JSON、TLS 握手扩展等关键内容会丢失。
验证是否真在容器命名空间里抓包
容器内执行 ip link show,输出中应只有 lo 和 eth0(可能还有 net1 等多网卡),绝不会出现 docker0、cni0 或宿主机物理网卡名。如果看到这些,说明你实际在宿主机上操作,不是容器内部。


















