![同一网络中两台主机上的两个容器:一个可以访问网络上的其他主机,另一个不能,为什么?](https://linux22.com/image/791679/%E5%90%8C%E4%B8%80%E7%BD%91%E7%BB%9C%E4%B8%AD%E4%B8%A4%E5%8F%B0%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%AE%B9%E5%99%A8%EF%BC%9A%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE%E7%BD%91%E7%BB%9C%E4%B8%8A%E7%9A%84%E5%85%B6%E4%BB%96%E4%B8%BB%E6%9C%BA%EF%BC%8C%E5%8F%A6%E4%B8%80%E4%B8%AA%E4%B8%8D%E8%83%BD%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我最近遇到了一个网络问题,我们的网络中有两个容器(位于两个不同的主机上):
一个主机上的容器可以 ping/访问特定网络上的物理主机,而第二个主机上的另一个容器则不能,即使(据我所知)配置相同。
该网络的详细信息如下:
- 有两台物理主机(host01 和 host02)
- 每个主机上都通过 LXC 运行一个容器(container01 在 host01 上,container02 在 host02 上)
- 两个容器都连接到虚拟 LXC LAN 上的各自主机,范围为 10.0.10.0/24,主机的 IP 为 10.0.10.1,容器的 IP 为 10.0.10.2
- 两个物理主机各有 4 个物理网络连接(跨 2 个 NIC)
- NIC1 上的两个连接进入交换机,用于内部的网络,并通过称为“内部”的绑定接口绑定在一起;内部的网络的 IP 范围为 10.0.80.0/24,其中 host01 的 IP 为 10.0.80.100,而 host02 的 IP 为 10.0.80.200
- NIC2 上的两个连接进入交换机非军事区网络,并通过称为“外部”的绑定接口绑定在一起;非军事区网络的 IP 范围为 10.0.90.0/24,其中 host01 的 IP 为 10.0.90.100,而 host02 的 IP 为 10.0.90.200
- 两个物理主机都运行着 IPTABLES,并且在 POSTROUTING 链中都有两条规则,用于伪装从 0.0.0.0/0 到 0.0.0.0/0 的所有流量:一条在“内部”,一条在“外部”bond-interface 上
(8. 在 DMZ 网络上,有几台服务器(邮件、LDAP 等)位于 10.0.90.0/24 范围内的其他 IP 上)
(9. 在内部网络上,有一个 DNS 服务器 10.0.80.250,它也知道 DMZ 中的主机)
现在,按照我的理解,这些 MASQUERADE 规则将确保容器生成的所有发送到内部网络或外部网络的流量都不会显示容器的 IP(10.0.10.2),而是主人的该相应网络的 IP 并针对进入容器的任何流量进行相应的转换,对吗?
因此,如果 container01 将流量发送到内部网络,例如发送到 10.0.80.17 的主机,则该主机将把 host01 的内部 IP(10.0.80.100)视为流量的来源地址,并将响应发送到该地址,对吗?对于发送到 DMZ 网络的流量,情况也一样,只需将此处的“.80.”替换为“.90.”即可。
现在,由于某种原因,两个容器都可以 ping/访问内部网络上的任意主机,但只有 container01 可以 ping/访问 DMZ 网络上的任意主机,而 container02 则不能。host01 和 host02 都可以 ping/访问两个网络中的任意主机,但出于某种原因,container02 无法访问 DMZ...
当我从 container02 向 DMZ 中的任何主机发送 ping 时,它显示“无法访问”。当我从 container01 或两个物理主机中的任何一个发送 ping 时,它工作正常。
当我尝试访问 DMZ 中的邮件服务器(IP:10.0.90.2,主机名:mail.domain.com)时,它在 container01 中有效,但在 container02 中无效。在访问邮件服务器(通过 mail.domain.com)时,在容器中运行 Wireshark 显示,container01 联系内部网络中的 DNS 服务器,获得响应,然后加载邮件服务器的相应 Web 界面(@10.0.90.2/mail.domain.com)。container02 上的 Wireshark 显示,它也联系 DNS 服务器,获得响应(即“mail.domain.com 的 IP 为 10.0.90.2”),然后作为下一个数据包,发送 ARP 请求,内容为“谁有 10.0.90.2?告诉 10.0.10.2”,即容器的虚拟 IP!这难道不应该是“告诉 10.0.90.200”,即 host02 的 DMZ-IP 吗?为什么这不是伪装?container01 上的 Wireshark 从未显示它发送任何 ARP 请求,只是在 DNS 响应后直接进入邮件服务器的 Web 界面。
在 container02 上使用邮件服务器的主机名运行dig
或nslookup
返回正确的 IP,因此 DNS 可以正常工作,并且联系内部 DNS 也可以正常工作,但它就是无法访问 DMZ,即使它可以访问?
我甚至去检查了 DMZ 路由器的电缆是否仍然连接且闪烁,但两者都是这种情况(这是有道理的,因为 host02 仍然可以完美访问 DMZ)...为什么要排除 container02?对我来说,这听起来像是伪装的问题,而且 container02 没有显示 host02 的 DMZ IP??
任何建议都会有帮助!提前致谢!