VirtualBox - Разные подсети в одном интерфейсе
У меня есть несколько виртуалок, работающих в VirtualBox. На хосте Ubuntu Server 18.04. Все они используют «Host-Only Adapter». Также Интернет работает через него.
По ряду причин я задал виртуальным машинам не локальные, а публичные 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
Некоторый прогресс уже начался, но он пока не принес желаемого результата. После этого при попытке traceroute от одной виртуальной машины к другой он доходит до своего шлюза и на нём зависает
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:~#
Что мне нужно сделать в моем случае, чтобы хосты, находящиеся в разных подсетях, но в одной сети, могли общаться друг с другом?