挑战:让一个 Debian VM(Virtualbox)将其所有流量路由到另一个 Debian VM(Paralles),两者都托管在 OS X 10.11.5 下。我已经尝试了好几天,希望你能在这里提供帮助。
架构:
vm1 (Virtualbox) ---> ( OS X ) --> vm2 (Parallels) --> internet
这就是我所拥有的:
VM1(“客户端”):
- 在 Virtualbox 下使用仅主机网络设置接口 eth1,获取 IP 地址 192.168.56.103 和网络掩码 255.255.255.0
VM2(“路由器”):
Wifi 卡直接连接到虚拟机,接口 wlan0 的 ip 为 10.251.26.168,连接到互联网。wlan0 将是我的传出接口。
在 Parallels 下,接口 eth0 设置为仅主机,获取 IP 地址 10.37.129.6 和网络掩码 255.255.255.0。
在主机上:
- VM1 连接到接口 vboxnet0,IP 为 192.168.56.1 VM2 连接到接口 vnic1,IP 为 10.37.129.2
通过此设置,从每个虚拟机对主机进行 ping 操作以及反之亦然,工作正常(在各自的网络上)。
我目前所做的:
在主机 OS X 系统下,我启用了 IP 转发并将两个虚拟接口桥接在一起:
bash-3.2# sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 1 -> 1
bash-3.2# ifconfig bridge0 create
bash-3.2# ifconfig vnic1 down
bash-3.2# ifconfig vboxnet0 down
bash-3.2# ifconfig bridge0 up addm vnic1 addm vboxnet0
bash-3.2# ifconfig vnic1 up
bash-3.2# ifconfig vboxnet0 up
bash-3.2# ifconfig bridge0
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=3<RXCSUM,TXCSUM>
ether ba:e8:56:14:5f:00
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: vnic1 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 14 priority 0 path cost 0
member: vboxnet0 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 12 priority 0 path cost 0
Address cache:
media: autoselect
status: active
bash-3.2# ifconfig vnic1
vnic1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:1c:42:00:00:09
inet 10.37.129.2 netmask 0xffffff00 broadcast 10.37.129.255
media: autoselect
status: active
bash-3.2# ifconfig vboxnet0
vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
在 VM1(“客户端”)上我添加了默认网关:
root@vm1:~# ip route del 0/0
root@vm1:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.56.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
root@vm1:~# route add default gw 192.168.56.1
root@vm1:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.56.1 0.0.0.0 UG 0 0 0 eth1
192.168.56.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
在 VM2(“路由器”)上,我启用 IP 转发并设置 nat:
root@vm2:~# sysctl -w net.ipv4.ip_forward = 1
root@vm2:~# iptables -t nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE
root@vm2:~# iptables -A FORWARD --in-interface eth0 -j ACCEPT
现在,完成所有这些操作后,我可以从 VM1 ping 到 192.168.56.1 和 10.37.129.2(分别为虚拟网络适配器 vboxnet0 和 vnic1 的主机端 IP),但无法 ping 10.37.129.6。到目前为止,我还无法从 VM1 通过 VM2 访问互联网(从 VM1 ping 8.8.8.8):
root@vm1:~# ping -c 1 192.168.56.1
PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.
64 bytes from 192.168.56.1: icmp_seq=1 ttl=64 time=1.54 ms
--- 192.168.56.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.543/1.543/1.543/0.000 ms
root@vm1:~# ping -c 1 10.37.129.2
PING 10.37.129.2 (10.37.129.2) 56(84) bytes of data.
64 bytes from 10.37.129.2: icmp_seq=1 ttl=64 time=0.208 ms
--- 10.37.129.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.208/0.208/0.208/0.000 ms
root@vm1:~# ping -c 1 10.37.129.6
PING 10.37.129.6 (10.37.129.6) 56(84) bytes of data.
--- 10.37.129.6 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
root@vm1:~# ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
所以我无法让 VM1 将其所有流量路由到 VM2...我遗漏了什么??
为了帮助排除故障,我在 vm2(“路由器”)上启动了 wireshark 来监听所有接口。当我从 vm1 ping 10.37.129.6 时,我看到 ARP 请求“谁是 10.37.129.6 告诉 10.37.129.2”,相应的 ARP 回复和随后的 ICMP 源自 vm1 的 ip(192.168.56.101),因此 OS X 桥接器一定在工作。但我似乎没有收到 vm1 的 ping 响应,也没有在 wireshark 上看到它。当我从 vm1 ping 8.8.8.8 时,我在 vm2 的 wireshark 会话中看不到任何东西。
非常感谢你的帮助。
答案1
我终于让它工作了:-)
我的工作解决方案包括:
Parallels VM(“路由器”):“仅主机”网络,IP 范围由 Parallels 默认定义(我可以在 Parallels - 首选项 - 网络 - 仅主机中更改)。使用 iptables 设置 nat,将
wlan0
(wifi) 作为出站接口。Virtualbox VM(“客户端”):“桥接”网络,使用 Parallel
vnic1
为其“仅主机”网络创建的虚拟适配器。我必须禁用 Virtualbox 的 dhcpserver,以便客户机不会获得不需要的 IP。我给它提供了一个与 Parallel 的 vm 在同一范围内的 IP。设置到“路由器”的默认路由。
笔记:我可以让 Virtualbox 在桥接模式下使用 Parallel vnic1
。但是,当我尝试让 Parallels 使用 Virtualbox 的vboxnet0
接口甚至 OS X 的bridge0
接口时,我的所有测试都失败了。看来 Parallels 只能桥接物理适配器,而不是虚拟适配器。
就是这样。现在来看看细节:
Parallel 的 VM——“路由器” 使用 Parallel 的默认 dhcpserver(除非您想更改默认 ip/netmask 信息,否则无需配置)。我们需要启用数据包转发并使用 iptables 设置 nat。
root@router:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.37.129.7 netmask 255.255.192.0 broadcast 10.37.129.255
ether 08:00:27:2a:20:8e txqueuelen 1000 (Ethernet)
RX packets 35 bytes 10016 (9.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 873 bytes 62313 (60.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@router:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.37.129.2 0.0.0.0 UG 100 0 0 eth0
10.37.129.0 0.0.0.0 255.255.192.0 U 100 0 0 eth0
root@router:~# sysctl -w net.ipv4.ip_forward = 1
root@router:~# iptables -t nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE
root@router:~# iptables -A FORWARD --in-interface eth0 -j ACCEPT
Virtualbox vm(“客户端”):
适配器 1 作为桥接器vnic1
(注意:您可能需要先运行 Parallel 的 vm 以便vnic1
创建它)。我需要添加路由器的 ip(10.37.129.7
)作为默认网关:
root@client:/home/user# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:a2:10:ba
inet addr:10.37.129.9 Bcast:10.37.129.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1292 (1.2 KiB) TX bytes:684 (684.0 B)
Interrupt:19 Base address:0xd000
root@host:/home/user# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.37.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
root@client:/home/user# route add default gw 10.37.129.7
root@client:/home/user# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.37.129.7 0.0.0.0 UG 0 0 0 eth0
10.37.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
就是这样。它让我的工作顺利进行。现在我可以通过直接连接到路由器 (Parallels) 的无线网卡从客户端 (Virtualbox) 访问互联网,而无需主机 (OS X) 的干预。