我的回答更像是对这个重要主题的改进,因为它没有帮助“找出哪个网络接口属于 docker 容器”,但是,正如作者注意到的那样,他“想要收听 docker 容器内的 tcp 流量” - 在您对网络进行故障排除期间,我会尽力帮助解决这个问题。
考虑到veth 网络设备是关于网络命名空间的,知道我们可以通过nsenter 工具在另一个命名空间中执行程序是很有用的(记住 - 你需要一个特权权限(sudo/root)来做那个):
获取您有兴趣捕获流量的任何容器的 ID,例如它将是 78334270b8f8
然后我们需要获取该容器化应用程序的PID(我假设您在容器内仅运行 1 个与网络相关的进程并希望捕获其流量。否则,该方法很难适用):
sudo docker inspect 78334270b8f8 | grep -i pid
例如,pid 的输出将是 111380 - 这是您的容器化应用程序的 ID,您也可以通过 ps 命令检查它:ps aux | grep 111380 只是出于好奇。
下一步是检查容器内有哪些网络接口:
sudo nsenter -t 111380 -n ifconfig
此命令将返回容器化应用的网络命名空间中的网络设备列表(您的容器上不应有 ifconfig 工具,只能在您的节点/机器上)
例如,您需要在接口eth2 上捕获流量并使用以下命令将其过滤到 tcp 目标端口 80(当然可能会有所不同):
sudo nsenter -t 111380 -n tcpdump -nni eth2 -w nginx_tcpdump_test.pcap 'tcp dst port 80'
请记住,在这种情况下,您不需要在容器中安装 tcpdump 工具。
然后,在捕获数据包后,.pcap 文件将在您的机器/节点上可用,并使用您喜欢的任何工具读取它tcpdump -r nginx_tcpdump_test.pcap
方法的优点:
- 容器内无需网络工具,仅在 docker 节点上
- 容器内网络设备与节点之间无需搜索映射
缺点:
- 您需要在节点/机器上拥有特权用户才能运行
nsenter 工具