linux - 如何让我的 Docker 容器通过第二个接口(interface)与另一个节点通信?

标签 linux networking docker iptables

我正在努力执行一个可悲的测试,该测试涉及 sandbox01 网络中的服务器与在我的“Docker 主机”服务器中运行的 Docker 容器之间的通信(这台机器与 sandbox01 网络中的其他节点位于同一子网中) sandbox01 网络。即,它在 10.* 地址/范围上有一个名为 ens34 的接口(interface)。它在 9.* 网络上还有一个 eth0 接口(interface),允许它访问外部世界:下载包、docker 图像、等等等等)。

无论如何,这里有一张小图来说明我所拥有的: Diagram illustrating communication between networks and the Docker container

问题: 无法在 sandbox01 子网(10.* 网络)中的节点与容器之间进行通信。 例如,someserver.sandbox01 → mydocker2 : ens34::docker0::vethXXX → container 通信只有在我停止 iptables 时才有效,这让事情变得非常神秘!!!只是想知道您是否遇到任何类似的问题..任何想法将不胜感激。

谜底: 经过多次测试,确认容器无法与 10.* 网络中的任何其他节点通信——它的行为不符合预期:它应该通过其网关 docker0 (172.17.0.1) 产生响应,并通过docker主机中的路由表找到与“someserver.sandbox01”(10.1.21.59)通信的方式。 只有当我们让它在 iptables 中处理 MASQUARADE 时它才会起作用。但是,Docker 会自动添加此规则:-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j 化装舞会

**注意那里的“!-o docker0”,所以 Docker 不希望我们屏蔽发送请求的 IP 地址???这不知何故搞乱了沟通......

容器对通过 IP 9.* (eth0) 进行的任何通信都响应良好——也就是说,我可以从我的笔记本电脑发送请求——但永远不会通过 10.* (ens34)。如果我在容器内运行一个终端,容器可以利用所有映射路由 ping 所有 IP 地址,除了,除了!!! 10.* 范围内的 IP 地址。为什么?????

[root@mydocker2 my-nc-server]#  docker run -it -p 8080:8080 --name nc-server nc-server /bin/sh
sh-4.2# ping 9.83.90.55
PING 9.83.92.20 (9.83.90.55) 56(84) bytes of data.
64 bytes from 9.83.90.55: icmp_seq=1 ttl=117 time=124 ms
64 bytes from 9.83.90.55: icmp_seq=2 ttl=117 time=170 ms
^C
--- 9.83.90.55 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 124.422/147.465/170.509/23.046 ms
sh-4.2# ping 9.32.145.98
PING 9.32.148.67 (9.32.145.98) 56(84) bytes of data.
64 bytes from 9.32.145.98: icmp_seq=1 ttl=63 time=1.37 ms
64 bytes from 9.32.145.98: icmp_seq=2 ttl=63 time=0.837 ms
^C
--- 9.32.145.98 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.837/1.104/1.372/0.269 ms
sh-4.2# ping 10.1.21.5
PING 10.1.21.5 (10.1.21.5) 56(84) bytes of data.
^C
--- 10.1.21.5 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms
sh-4.2# ping 10.1.21.60
PING 10.1.21.60 (10.1.21.60) 56(84) bytes of data.
^C
--- 10.1.21.60 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

出于某种原因,这里的这个接口(interface)不能很好地与 Docker 配合使用:

ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.21.18  netmask 255.255.255.0  broadcast 10.1.21.255

这是否与 eth0 是此 Docker 主机的主要 NIC 这一事实有关?

解决方法: 在 mydocker2 中我们需要停止 iptables 并在 ens34 下添加一个新的子接口(interface) →

service iptables stop
ifconfig ens34:0 10.171.171.171 netmask 255.255.255.0 

并且在 someserver.sandbox01 中我们需要添加一条新路由 →

route add -net 10.171.171.0 netmask 255.255.255.0 gw 10.1.21.18

然后 then 之间的通信工作。我知道..很奇怪,对吧?

如果你们有人想问,不,我不想使用“--net=host”选项将接口(interface)从 docker 主机复制到我的容器。

所以,想法?建议?想法?

最佳答案

已解决!!!

在/etc/sysconfig/network-scripts 中,有 2 个文件: route-ens34 和 rule-ens34-

如果您删除它们并重新启动网络,它应该会开始工作。

干杯!

关于linux - 如何让我的 Docker 容器通过第二个接口(interface)与另一个节点通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37777132/

相关文章:

linux - 如何通过 uname -a 命令判断内核是什么?

python - OpenCV 和 python/virtualenv?

c - 如何使用标准用户捕获 TCP/IP 数据包

docker - docker中的存储驱动程序和图形驱动程序有什么区别?

linux - Bash 静默错误处理

linux - 如何在 docker 中使用 alsa 声音和/或 snd_pcm_open?

ubuntu - 使用 nmcli 从静态切换到 DHCP

azure - 无法连接到 Azure 文件共享驱动器,使用映射驱动器无法连接,我也添加了端口 445

docker - kubernetes-负载均衡器外部端点始终是localhost

networking - 多主机环境下swarm模式下容器无法相互连接