如何捕获单个docker容器的数据包

时间:2016-09-07 06:37:16

标签: networking docker

主机上有许多容器在运行。我想捕获这些容器的数据包。有没有办法做到这一点?

4 个答案:

答案 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

Wireshark interfaces

答案 1 :(得分:4)

您可以将一个容器的网络命名空间绑定到另一个容器:

docker run -it --rm --net container:<container_name> \
  nicolaka/netshoot tcpdump ...

要详细了解上面使用的netshoot图片,请参阅:https://github.com/nicolaka/netshoot

答案 2 :(得分:1)

容器可以通过几种不同的方式使用网络堆栈。这一切都取决于他们如何连接到网络。有两种选择:

  • docker bridge
  • 主持人(例如$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