docker 如何将 docker0 接口 ip 地址转换为主机 ip 地址

docker 如何将 docker0 接口 ip 地址转换为主机 ip 地址

我正在尝试创建一个实验室环境来试验 MiTM 攻击。我也想学习 docker,所以我决定用 docker 来做这件事。我创建了 2 个图像(攻击者、受害者):

受害者 - 基于 Alpine,安装了 curl
攻击者 - 基于 Ubuntu,安装了 iputils-ping iproute2 curl iptables vim ettercap-text-only dsniff 和 tshark。

它们都处于桥接网络中,因此这里的路由器将是 docker0 接口(默认值:172.17.0.1)
我正在使用 --privileged 标志运行攻击者容器,以启用 ettercap。

因此,当两个图像都在运行时,我正在从攻击者容器执行 ettercap(也尝试过 arpspoof 工具,效果相同):
ettercap -T -i eth0 -M arp:remote //victim_ip/ //172.17.0.1/

受害者的流量正在通过攻击者,但有一个问题,当受害者尝试 ping google.com 时没有响应。 MiTM 攻击正在起作用,因为我可以在受害者容器上看到此流量,但有东西阻止了它。

我找到了问题所在。我在主机上打开了 2 个 wireshark,一个在 docker0 接口上,一个在我的默认 wifi 接口上。在攻击之前,当我从全局网络 ping 某个东西时,docker 会将其 docker ip 地址转换为我的主机 ip 地址,并且工作正常,但在 arpspoofing 之后,它无法正常工作 - 主机正在发送带有 docker 受害者容器 (172.17.0.3) 的 ip 源的数据包。此外,奇怪的是,另一个容器(攻击者)正在毫无问题地 ping 外部网络(docker0 正确地将 docker ip 转换为主机 ip)。以下是来自两个 wireshark 的图片。

图片来自两个 wireshark

检查了 iptables,这条规则(下图中选择)正在将我的 docker ip 地址转换为主机 ip 地址,但在攻击之后,这条规则不起作用(在 arp 欺骗攻击之后,pkts 没有增加)。我尝试添加一些额外的 iptables 规则,但没有效果。我不是 iptables 大师,所以如果有人有其他想法,还应该检查什么,请给我提示。

在此处输入图片描述

也许有人可以向我解释或给我一些额外的资源,关于docker如何在桥接网络上将其ip地址转换为主机ip地址,以及在arp欺骗攻击后我可以做些什么来恢复正确的转换。每一条建议都将不胜感激。

答案1

  • Docker安装时docker0会创建一个名为的网络接口来连接各个容器。
  • Docker 在创建容器时,默认会赋予其一个以 开头的名字的虚拟网络接口veth,然后 Docker 通过 iptables 规则将主机网络接口的流量转发到该虚拟网络接口上。
  • 如果使用命令创建容器docker run --network=host ...,容器将使用主机的网络接口。此时,容器的 IP 地址与主机相同。

相关内容