主机上有许多容器在运行。我想捕获这些容器的数据包。有没有办法做到这一点?
答案 0 :(得分:8)
使用Wireshark的工作站:
docker exec -ti <container id> cat /sys/class/net/eth0/iflink
28
ip link | grep 28
28: veth11b0a6c@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
答案 1 :(得分:4)
您可以将一个容器的网络命名空间绑定到另一个容器:
docker run -it --rm --net container:<container_name> \
nicolaka/netshoot tcpdump ...
要详细了解上面使用的netshoot图片,请参阅:https://github.com/nicolaka/netshoot
答案 2 :(得分:1)
容器可以通过几种不同的方式使用网络堆栈。这一切都取决于他们如何连接到网络。有两种选择:
$docker run --rm -it --net=host ...
)$docker run --rm -it --net=container:id ...
)构建一个容器来运行像tcpdump或ngrep这样的旧东西不会产生太多有趣的信息,因为你在默认情况下直接链接到网桥或覆盖。
好消息是,你可以将你的tcpdump容器链接到主机网络,甚至可以更好地链接到容器网络堆栈(我理解你正在寻找它)。
在--net=host
情况下,您可以捕获主机和物理网络之间的所有流量。
在--net=container:id
中,可以捕获特定容器(或容器组)的所有流量。
希望这有帮助!
答案 3 :(得分:0)
使用nsenter -n -t pid
命令,进入同一个网络命名空间,然后执行tcpdump