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
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?