我有两台虚拟机,一台是 Ubuntu Server,另一台是 Windows Server 2016。两台机器上都有一个带 NAT 的虚拟交换机(Windows 上的 Hyper-V vSwitch),Docker 容器连接到它们。在 Linux 上,我的 vswitch 是192.168.0.1/24
,在 Windows 上,我的 vswitch 是192.168.1.1/24
。我希望能够使用静态路由和 IP 转发的组合来跨机器访问容器。虚拟机连接到的外部网络是10.0.0.0/23
。
192.168.0.1/24
当我从 Windows VM ping Linux 容器(在网络上)时,它已经正常工作了。我通过在 Windows VM 上添加到 Linux VM(位于10.0.0.10
外部网络上)的静态路由来实现这一点:
New-NetRoute -DestinationPrefix "192.168.0.0/24" -InterfaceAlias "Ethernet" -NextHop 10.0.0.10
然后在 Linux 机器上,我启用了 IP 转发并做了一些 iptables 魔术:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o cbr0 -j MASQUERADE # cbr0 is the vswitch NAT interface which the containers are connected to
iptables -A FORWARD -i cbr0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o cbr0 -j ACCEPT
iptables -A FORWARD -i cbr0 -o cbr0 -j ACCEPT
虽然这一切都正常,但我正在努力在相反的方向 (Linux -> Windows) 实现同样的目标。我向 Linux 机器添加了一条静态路由,如下所示,将网络指向192.168.1.1/24
Windows 机器 (at 10.0.0.11
):
ip route add 192.168.1.0/24 via 10.0.0.11
然后我在 Windows 上启用 IP 转发:
Get-NetAdapter | Set-NetIPInterface -Forwarding Enabled
这样我就可以从 Linux 机器 ping Windows 机器上的 vSwitch 的默认网关,即192.168.1.1
。但是,尝试 ping 该接口上的任何其他东西都不起作用(例如192.168.1.100
)。我想我需要在 Windows 上执行与 iptables 等效的操作,但我找不到替代方案。有人有什么想法吗?
干杯