如何在OS X上将所有流量从一个虚拟机路由到其他虚拟机

如何在OS X上将所有流量从一个虚拟机路由到其他虚拟机

挑战:让一个 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

我终于让它工作了:-)

我的工作解决方案包括:

  1. Parallels VM(“路由器”):“仅主机”网络,IP 范围由 Parallels 默认定义(我可以在 Parallels - 首选项 - 网络 - 仅主机中更改)。使用 iptables 设置 nat,将wlan0(wifi) 作为出站接口。

  2. Virtualbox VM(“客户端”):“桥接”网络,使用 Parallelvnic1为其“仅主机”网络创建的虚拟适配器。我必须禁用 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) 的干预。

相关内容