Não é possível conectar-se ao IP estático da VM do Virtualbox, que está em uma sub-rede diferente do IP dos hosts, mas é roteado estaticamente para o host HW addr.

3

Eu tenho um servidor físico executando o Ubuntu Trusty (14.04) em um data center onde eles atribuíram um endereço IP, bem como um bloco / 28 (16 endereços IP, 14 utilizáveis) de uma sub-rede diferente. Eles disseram que a sub-rede adicional foi roteada estaticamente através do host físico, o que, suponho, significa que sua rede aceitará apenas solicitações do endereço de hardware da NIC do host.

Vou usar isso com o virtualbox, para que cada VM tenha seu próprio endereço IP e funcione como se fossem servidores físicos reais na rede (em outras palavras, sem NAT). Além disso, suponho que as VMs precisam rotear seu tráfego por meio do host para que suas solicitações usem o endereço HW do host.

Não sou especialista em configurar redes complexas além do IP ou NAT estático básico, por isso li páginas man, documentação on-line do Ubuntu, além de várias perguntas e respostas em diferentes sites do StackExchange. Pelo que eu entendo, eu preciso configurar uma ponte virtual entre o endereço IP do host e um endereço na sub-rede, o último atuando como o gateway para as máquinas virtuais. As VMs terão, portanto, uma configuração simples com o gateway em sua sub-rede.

Eu posso acessar a VM do host e vice-versa, mas as VMs não podem acessar a Internet além do host e não consigo acessar as VMs da Internet. Eu estou supondo que o problema é que eu não configurei a ponte corretamente para rotear os pedidos sobre ela. Qualquer sugestão para me mover na direção certa seria muito apreciada.

Host /etc/network/interfaces

auto lo
iface lo inet loopback

auto  br0
iface br0 inet static
  name      Bridge for VMs to connect via
  address   x.x.x.229
  netmask   255.255.255.192
  gateway   x.x.x.193
  # default route to access subnet - this was provided by the data centre:
  up route add -net x.x.x.192 netmask 255.255.255.192 gw x.x.x.193 eth0
  bridge_ports eth0
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_stp off

auto  br0:0
iface br0:0 inet static
  name      Gateway IP for VMs in subnet y.y.y.240/28
  address   y.y.y.241
  netmask   255.255.255.240
  broadcast y.y.y.255
  network   y.y.y.240

Informações do sistema host:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         x.x.x.193  0.0.0.0         UG    0      0        0 br0
x.x.x.192  0.0.0.0         255.255.255.192 U     0      0        0 br0
y.y.y.240  0.0.0.0         255.255.255.240 U     0      0        0 br0

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether c8:60:00:5e:bd:e0 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether c8:60:00:5e:bd:e0 brd ff:ff:ff:ff:ff:ff
    inet x.x.x.229/26 brd x.x.x.255 scope global br0
       valid_lft forever preferred_lft forever
    inet y.y.y.241/28 brd y.y.y.255 scope global br0:0
       valid_lft forever preferred_lft forever

$ ifconfig
br0       Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          inet addr:x.x.x.229  Bcast:x.x.x.255  Mask:255.255.255.192
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:743907 errors:0 dropped:0 overruns:0 frame:0
          TX packets:519787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:92549304 (92.5 MB)  TX bytes:172422977 (172.4 MB)

br0:0     Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          inet addr:y.y.y.241  Bcast:y.y.y.255  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  HWaddr c8:60:00:5e:bd:e0  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:743968 errors:0 dropped:0 overruns:0 frame:0
          TX packets:519787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:102968103 (102.9 MB)  TX bytes:172422977 (172.4 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:674890 errors:0 dropped:0 overruns:0 frame:0
          TX packets:674890 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:302219962 (302.2 MB)  TX bytes:302219962 (302.2 MB)

/etc/network/interfaces

da máquina virtual
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address y.y.y.243
  netmask 255.255.255.240
  gateway y.y.y.241

Informações do sistema da máquina virtual:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         y.y.y.241  0.0.0.0         UG    0      0        0 eth0
y.y.y.240  0.0.0.0         255.255.255.240 U     0      0        0 eth0

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:f7:36:74 brd ff:ff:ff:ff:ff:ff
    inet y.y.y.243/28 brd y.y.y.255 scope global eth0
       valid_lft forever preferred_lft forever

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:f7:36:74  
          inet addr:y.y.y.243  Bcast:y.y.y.255  Mask:255.255.255.240
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1123962 (1.1 MB)  TX bytes:54822 (54.8 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:35428 (35.4 KB)  TX bytes:35428 (35.4 KB)

$ ping -c 4 -W 5 x.x.x.229
PING x.x.x.229 (x.x.x.229) 56(84) bytes of data.
64 bytes from x.x.x.229: icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from x.x.x.229: icmp_seq=2 ttl=64 time=0.106 ms
64 bytes from x.x.x.229: icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from x.x.x.229: icmp_seq=4 ttl=64 time=0.103 ms

--- x.x.x.229 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.102/0.107/0.117/0.006 ms

$ ping -c 4 -W 5 x.x.x.193
PING x.x.x.193 (x.x.x.193) 56(84) bytes of data.

--- x.x.x.193 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3007ms

$ ping -c 4 -W 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3023ms

No Virtualbox, configurei a interface de rede virtual da VM como um adaptador em ponte conectado a br0. Eu também tentei conectá-lo à eth0, mas isso não fez diferença perceptível.

ATUALIZAÇÃO:

Seguindo os conselhos do comentário, habilitei o encaminhamento de IP:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Eu também habilitei o modo promíscuo nas configurações de rede da caixa virtual, embora eu não ache que isso tenha feito alguma diferença.

Eu notei algo interessante. Quando eu pingar algo na rede, como os servidores de nome do Google, recebo uma resposta no primeiro ping, mas não nos seguintes:

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From y.y.y.241: icmp_seq=1 Redirect Host(New nexthop: y.y.y.y.241)
64 bytes from y.y.y.241: icmp_seq=1 ttl=54 time=5.97 ms
From y.y.y.241 icmp_seq=2 Destination Host Unreachable
From y.y.y.241 icmp_seq=3 Destination Host Unreachable
From y.y.y.241 icmp_seq=4 Destination Host Unreachable
From y.y.y.241 icmp_seq=5 Destination Host Unreachable
From y.y.y.241 icmp_seq=6 Destination Host Unreachable
From y.y.y.241 icmp_seq=7 Destination Host Unreachable
^C
--- 8.8.8.8 ping statistics ---
9 packets transmitted, 1 received, +6 errors, 88% packet loss, time 8041ms
rtt min/avg/max/mdev = 5.972/5.972/5.972/0.000 ms, pipe 3

Quando o encaminhamento de IP está desativado, tudo que recebo é:

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10000ms

Isto é o que eu recebo se eu cheirar os pacotes IP no host quando pingando 8.8.4.4 na VM pela primeira vez desde a reinicialização da VM. Pings subsequentes para o mesmo endereço IP só dão as linhas repetidas na parte inferior (não as duas primeiras).

$ sudo tcpdump -q -c 10 -e -n host y.y.y.243
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:32:57.199202 c8:60:00:5e:bd:e0 > cc:e1:7f:07:e0:af, IPv4, length 98: y.y.y.243 > 8.8.4.4: ICMP echo request, id 1060, seq 1, length 64
12:32:57.204498 cc:e1:7f:07:e0:af > c8:60:00:5e:bd:e0, IPv4, length 98: 8.8.4.4 > y.y.y.243: ICMP echo reply, id 1060, seq 1, length 64
12:32:58.202555 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:32:59.201628 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:00.201652 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:01.201759 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:02.201502 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:03.201394 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:04.201706 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
12:33:05.201647 08:00:27:f7:36:74 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has x.x.x.193 tell y.y.y.243, length 46
10 packets captured
11 packets received by filter
0 packets dropped by kernel

O que poderia causar um resultado tão estranho? O que mais eu poderia testar para me aproximar de uma solução aqui?

UPDATE 2:

Eu estou oficialmente perplexo com este agora. Eu ssh'd endereço IP do host dentro da sub-rede adicional (y.y.y.241) da rede, apenas para se certificar de que o roteamento para essa sub-rede funciona, e ele fez. Eu então sshy y.y.y.243 e esperava não obter nada, mas para minha surpresa eu entrei! De repente, tudo funcionou como deveria ... Eu poderia pingar 8.8.8.8 e qualquer outra coisa e ssh para qualquer host da Internet. E isso é depois de não fazer nada para hospedar ou VM.

Então, é claro que fiz a coisa certa - quebrei em nome da ciência. Eu tive que descobrir o que deu certo! Então, no host:

sudo sysctl -w net.ipv4.ip_forward=0

Obviamente, eu o habilitei novamente:

sudo sysctl -w net.ipv4.ip_forward=1

E como esperado, volte para a situação acima. Não é possível contatar a VM além do host. Na VM, o ping para qualquer host da internet tem uma primeira resposta, então nada.

Agora, o mais intrigante é que eu deixei por algumas horas, e quando voltei - e enfatizo que não fiz nada para hospedar nem para VM - funcionou magicamente. Eu não gosto de magia. Eu sou um homem de ciência e gosto de coisas para trabalhar ou não para trabalhar, de preferência o primeiro. Alguém tem alguma idéia do que poderia causar um atraso tão estranho?

    
por Ronny Ager-Wick 10.10.2015 / 21:20

0 respostas