Como rotear todo o tráfego de um vm através de outro vm no OS X

0

Challenge : para obter uma máquina virtual Debian (Virtualbox) para rotear todo o seu tráfego através de outra máquina virtual Debian (Paralles), ambas hospedadas no OS X 10.11.5. Eu tentei por dias, espero que você possa ajudar aqui.

Esquema:

vm1 (Virtualbox) ---> ( OS X ) --> vm2 (Parallels) --> internet

Isso é o que eu tenho:

VM1 (o “cliente”):

  • Interface de configuração eth1 com rede somente host no Virtualbox, obtém o endereço IP 192.168.56.103 com a máscara de rede 255.255.255.0

VM2 (o "roteador"):

  • Cartão Wifi conectado diretamente à VM, interface wlan0 com ip 10.251.26.168, conectado à internet. wlan0 será minha interface de saída.

  • Interface da configuração eth0 como somente host no Parallels, obtém o endereço IP 10.37.129.6 com a máscara de rede 255.255.255.0.

No host:

  • A VM1 está conectada à interface vboxnet0 com ip 192.168.56.1 A VM2 está conectada à interface vnic1 com ip 10.37.129.2

Com esta configuração pingando o host de cada VM e vice-versa funciona perfeitamente bem (em suas respectivas redes).

O que eu fiz até agora:

Nos sistemas host OS X, habilito o encaminhamento de ip e interligo as duas interfaces virtuais:

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

No VM1 ("cliente") eu adiciono o gateway padrão:

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

No VM2 ("roteador") eu habilito o encaminhamento de ip e a configuração do 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

Agora, depois de tudo isso, posso fazer ping da VM1 para 192.168.56.1 e 10.37.129.2 (IPs do lado do host para os adaptadores de rede virtual vboxnet0 e vnic1, respectivamente), mas não consigo executar o ping em 10.37.129.6. Eu também falhei até agora para acessar a Internet da VM1 até a VM2 (do ping da VM1 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

Portanto, não consigo fazer com que a VM1 direcione todo o seu tráfego através da VM2 ... o que está faltando?

No caso de ajudar na solução de problemas, eu lancei o wireshark on vm2 ("o roteador") ouvindo todas as interfaces. Quando eu faço ping de 10.37.129.6 da vm1, vejo as solicitações ARP "who was 10.37.129.6 Tell 10.37.129.2", a resposta ARP correspondente e o ICMP subsequente originado do ip da vm1 (192.168.56.101), portanto a ponte OS X deve ser trabalhando. Mas eu não pareço receber a resposta de ping de volta para vm1 nem vejo isso em wireshark. E quando eu faço o ping 8.8.8.8 da vm1 eu não vejo nada na sessão wireshark da vm2.

Muito obrigado pela sua ajuda.

    
por Keyser Soze 13.07.2016 / 19:16

1 resposta

0

Eu finalmente consegui trabalhar: -)

Minha solução de trabalho envolve:

  1. Parallels VM (o "roteador"): rede "somente host", com o intervalo de IP definido por padrão pelo Parallels (eu poderia mudar isso no Parallels - Preferências - Rede - Somente host). Configure nat com iptables com wlan0 (wifi) como interface de saída.

  2. Virtualbox VM (o "cliente"): rede "bridge", usando o adaptador virtual Parallel vnic1 criado para sua rede "somente host". Eu tive que desabilitar o dhcpserver do Virtualbox para que o convidado não obtivesse um ip indesejado. Eu dei um ip na mesma faixa que a vm do Parallel. Configure a rota padrão para o "roteador".

Observação: eu poderia fazer com que o Virtualbox usasse o vnic1 do Parallel no modo bridge. No entanto, todos os meus testes falharam ao tentar fazer com que o Parallels usasse a interface vboxnet0 do Virtualbox ou mesmo bridge0 do OS X quando tentei fazer isso. Parece que o Parallels só conecta adaptadores físicos, não virtuais.

E é sobre isso. Agora, os detalhes:

VM paralela - "o roteador" Usando o dhcpserver padrão do Parallel (nenhuma configuração necessária, a menos que você queira alterar as informações de ip / netmask padrão). Precisamos ativar o encaminhamento de pacotes e configurar o nat com o iptables.

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 ("o cliente"): Adaptador 1 como ponte com vnic1 (nota: talvez seja necessário executar primeiro a vm do Parallel para que vnic1 seja criado). Eu preciso adicionar o ip do roteador ( 10.37.129.7 ) como o gateway padrão:

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

E é isso. Isso funcionou para mim. Agora eu posso acessar a internet do cliente (Virtualbox) através de uma placa wireless conectada diretamente ao roteador (Parallels) sem a intervenção do host (OS X).

    
por 18.07.2016 / 20:02