我有几个在 VirtualBox 中运行的虚拟机。主机上安装了 Ubuntu Server 18.04。他们都使用“Host-Only Guest”。互联网也通过“仅主机适配器”工作。
由于多种原因,我为虚拟机设置的不是本地 IP 地址,而是公共 IP 地址。也就是说,例如,主机和访客没有通常情况下的 192.168.56.1 和 192.168.56.100,而是分别具有 11.22.33.1 和 11.22.33.44。更详细的解释。虚拟机的网关不是192.168.56.1,而是11.22.33.1。它甚至有效。主机和访客可以相互通信,虚拟机甚至可以访问互联网。
为了使虚拟机能够访问互联网并接受连接,我为每个虚拟机制作了以下脚本。例子:
localinterface=vboxnet0
# hosts's interface
publicinterface=ppp1
# public ip
localip=34.56.78.90
# local gateway
maingateway=10.0.3.1
# host's local ip
mainip=10.0.3.10
iptables -t nat -A POSTROUTING -s $localip/32 -o $publicinterface -j SNAT --to-source $mainip
iptables -t nat -A PREROUTING -i $publicinterface -p tcp --dport 1:65534 -j DNAT --to-destination $localip
iptables -t nat -A PREROUTING -i $publicinterface -p udp --dport 1:65534 -j DNAT --to-destination $localip
iptables -t nat -A PREROUTING -i $publicinterface -p gre -j DNAT --to-destination $localip
iptables -t nat -A PREROUTING -p icmp -d $mainip -j DNAT --to-destination $localip
iptables -t filter -A FORWARD -p icmp -d $localip -j ACCEPT
ip rule add from $localip table vm2
ip route add default dev $publicinterface via $maingateway table vm2
据我所知,通过这样做,主机和任何来宾都无法访问 IP 地址为 34.56.78.90 的真实计算机,但这不是我关心的。
问题是,尽管虚拟机位于同一网络 (vboxnet0),但它们无法相互通信。我确信这是因为主机有不同的子网。 Traceroute 和 ping 甚至没有给出任何结果。然后我尝试注册以下路由:
ip route add 99.88.77.0/24 via 11.22.33.1 dev vboxnet0 table vm0
ip route add 34.56.78.0/24 via 11.22.33.1 dev vboxnet0 table vm0
ip route add 11.22.33.0/24 via 99.88.77.1 dev vboxnet0 table vm1
ip route add 34.56.78.0/24 via 99.88.77.1 dev vboxnet0 table vm1
ip route add 11.22.33.0/24 via 34.56.78.1 dev vboxnet0 table vm2
ip route add 99.88.77.0/24 via 34.56.78.1 dev vboxnet0 table vm2
一些进展已经开始,但尚未带来预期的结果。之后,如果您尝试从一台虚拟机跟踪路由到另一台虚拟机,它会到达其网关并挂在那里
root@ubuntu-server-1804-fastpanel:~# traceroute -n 99.88.77.66
traceroute to 99.88.77.66 (99.88.77.66), 30 hops max, 60 byte packets
1 11.22.33.1 0.222 ms 0.400 ms 0.334 ms^C
root@ubuntu-server-1804-fastpanel:~#
ping 命令也开始显示网关正在重定向到另一台主机
root@ubuntu-server-1804-fastpanel:~# ping 99.88.77.66
PING 99.88.77.66 (99.88.77.66) 56(84) bytes of data.
From 11.22.33.1: icmp_seq=2 Redirect Host(New nexthop: 99.88.77.66)
From 11.22.33.1: icmp_seq=3 Redirect Host(New nexthop: 99.88.77.66)
From 11.22.33.1: icmp_seq=4 Redirect Host(New nexthop: 99.88.77.66)
From 11.22.33.1: icmp_seq=5 Redirect Host(New nexthop: 99.88.77.66)
From 11.22.33.1: icmp_seq=6 Redirect Host(New nexthop: 99.88.77.66)
^C
--- 99.88.77.66 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6066ms
root@ubuntu-server-1804-fastpanel:~#
现在我在主机上的路线看起来像这样
root@hypervisor:~# ip route
default via 10.0.1.1 dev eth0 proto static
default via 10.0.2.1 dev ppp0 proto static
default via 10.0.3.1 dev ppp1 proto static
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.10
10.0.2.1 dev ppp0 proto kernel scope link src 10.0.2.10
10.0.3.1 dev ppp1 proto kernel scope link src 10.0.3.10
10.27.137.0/24 dev vboxnet0 proto kernel scope link src 10.27.137.213
34.56.78.0/24 dev vboxnet0 proto kernel scope link src 34.56.78.1
11.22.33.0/24 dev vboxnet0 proto kernel scope link src 11.22.33.1
99.88.77.0/24 dev vboxnet0 proto kernel scope link src 99.88.77.1
root@hypervisor:~# ip route show table vm0 && ip rule show table vm0
default via 10.0.1.1 dev eth0
34.56.78.0/24 via 11.22.33.1 dev vboxnet0
99.88.77.0/24 via 11.22.33.1 dev vboxnet0
199: from 11.22.33.44 lookup vm0
root@hypervisor:~# ip route show table vm1 && ip rule show table vm1
default via 10.0.2.1 dev ppp0
34.56.78.0/24 via 99.88.77.1 dev vboxnet0
11.22.33.0/24 via 99.88.77.1 dev vboxnet0
97: from 99.88.77.66 lookup vm1
99: from 99.88.77.66 lookup vm1
root@hypervisor:~# ip route show table vm2 && ip rule show table vm2
default via 10.0.3.1 dev ppp1
11.22.33.0/24 via 34.56.78.1 dev vboxnet0
99.88.77.0/24 via 34.56.78.1 dev vboxnet0
96: from 34.56.78.90 lookup vm2
98: from 34.56.78.90 lookup vm2
root@hypervisor:~#
在我的情况下,我需要做什么才能使具有不同子网但位于同一网络上的主机可以相互通信?