VirtualBox에서 여러 개의 가상 머신을 실행하고 있습니다. Ubuntu Server 18.04가 호스트 시스템에 설치되어 있습니다. 그들은 모두 "호스트 전용 게스트"를 사용합니다. 인터넷은 "호스트 전용 어댑터"를 통해서도 작동합니다.
여러 가지 이유로 로컬 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
일부 진전이 시작되었지만 아직 예상한 결과를 얻지 못했습니다. 이후에 한 VM에서 다른 VM으로 경로 추적을 시도하면 해당 게이트웨이에 도달하여 정지됩니다.
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:~#
제 경우에는 서브넷은 다르지만 동일한 네트워크에 있는 호스트들이 서로 통신하려면 어떻게 해야 하나요?