VMs “esquecendo” o endereço MAC do gateway no host do Ubuntu 14.04 configurado como um gateway usando 1 NIC com 2 endereços IP em sub-redes diferentes

3

Eu tenho um servidor Ubuntu 14.04 com um NIC. O endereço MAC nessa NIC é atribuído (pelo gateway do centro de dados) a um IP (XXX100) em uma sub-rede (XXX0 / 24), com o gateway estando na mesma sub-rede (XXX1) e um intervalo de IPs adicional de uma sub-rede completamente diferente (YYY0 / 28).

Eu configurei o servidor com X.X.X.100 e Y.Y.Y.1 na mesma interface (eth0), e o servidor pode entrar em contato e ser contatado pelo restante da Internet - em ambos os endereços IP.

Eu tenho algumas máquinas virtuais que usam os endereços IP da segunda sub-rede. Suponho que eles devem usar o segundo endereço IP do host Y.Y.Y.1 como seu endereço de gateway (já que eles não conseguirão acessar o endereço do gateway do data center devido a estarem em uma sub-rede diferente - até onde eu entendi). Todos os endereços IP que possuo, X.X.X.100 e Y.Y.Y.0 / 28, são roteados estaticamente no gateway do centro de dados, portanto, qualquer solicitação destinada a eles chegará à NIC do meu servidor. Ele também aceitará somente solicitações do endereço MAC nessa NIC, não dos endereços MAC das VMs.

Como configuro o host para que todas as solicitações de ou para a sub-rede Y.Y.Y.0 / 28 sejam roteadas pelo gateway do centro de dados X.X.X.1?

Tanto quanto sei, não posso simplesmente expandir a máscara de rede, pois isso pode levar a não conseguir entrar em contato com outros servidores na rede.

Aqui está o /etc/network/interfaces

do servidor
auto lo
iface lo inet loopback

auto  eth0

iface eth0 inet static
  address   X.X.X.100
  netmask   255.255.255.0
  gateway   X.X.X.1
  dns-nameservers 8.8.8.8 8.8.4.4

iface eth0 inet static
  address   Y.Y.Y.1
  netmask   255.255.255.240

Em /etc/sysctl.conf , ativei esta linha:

net.ipv4.ip_forward=1

As VMs usam Y.Y.Y.n (onde n > 1) como endereço IP e Y.Y.Y.1 como gateway.

Com a configuração acima, as VMs podem contatar o host em seus dois endereços IP, mas nada mais. Eu acho que as VMs têm dificuldade em encontrar o endereço MAC do gateway do provedor de serviços de Internet X.X.X.1:

$ arp -an
? (X.X.X.1) at c8:60:00:5e:bd:e0 [ether] on eth0
? (Y.Y.Y.1) at <incomplete> on eth0

Por estranho que pareça, às vezes eles podem ...

$ arp -an
? (X.X.X.1) at c8:60:00:5e:bd:e0 [ether] on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] on eth0

Estes dois exemplos foram tirados com apenas alguns minutos de intervalo. Tenho a sensação de que o ping da VM, especialmente o ping da VM, acelera o processo de obtenção do endereço MAC, embora isso possa ser puramente incidental.

Quando "tem" o endereço MAC og X.X.X.1, tudo realmente funciona! Posso acessar a Internet a partir das VMs e acessá-las pela Internet usando o endereço Y.Y.Y.n. Mas isso não funciona o tempo todo - ocasionalmente, "esquece" o endereço MAC de Y.Y.Y.1 novamente e se torna inacessível.

Estou realmente surpreso em listar Y.Y.Y.1 na lista ARP - achei que era apenas para dispositivos na mesma sub-rede. Meu objetivo era fazer com que eles apenas usassem o host como endereço de gateway (Y.Y.Y.1) e evitassem o problema deixando o host em toda a comunicação em X.X.X.0 / 24.

A minha configuração é sensata?

Alguém mais está usando essa configuração?

Quais possíveis razões poderiam existir para o esquecimento "esquecimento"?

ATUALIZAÇÃO:

Eu tentei forçar as VMs a usarem o endereço MAC do gateway do centro de dados diretamente, em vez do endereço IP do host que eles usam como gateway - Y.Y.Y.1 - mas o problema persiste:

$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at c8:60:00:5e:bd:e0 [ether] PERM on eth0
raw@test-server:~$ sudo arp -s Y.Y.Y.1 cc:e1:7f:07:e0:af
raw@test-server:~$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
raw@test-server:~$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From Y.Y.Y.3 icmp_seq=1 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=2 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=3 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=4 Destination Host Unreachable

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3001ms
pipe 3

Somente quando há uma entrada ARP para XXX1 ela funciona corretamente, mas não posso adicioná-la manualmente com arp -s (mensagem de erro: SIOCSARP: Network is unreachable ) e não sei o que a faz aparecer aleatoriamente ou desaparecer:

$ arp -an
? (X.X.X.1) at cc:e1:7f:07:e0:af [ether] on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
raw@test-server:~$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=5.92 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=6.13 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=6.13 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=54 time=6.13 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3008ms
rtt min/avg/max/mdev = 5.929/6.083/6.138/0.118 ms

Um par de minutos depois disso, ele foi embora de novo:

$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
    
por Ronny Ager-Wick 21.10.2015 / 23:30

1 resposta

1

Como os operadores de data center não entendem muito bem como o roteamento funciona (você precisa de um gateway dentro da sua sub-rede para que as coisas funcionem normalmente), é necessário adicionar uma entrada estática arp com o endereço MAC do gateway e um endereço IP que é dentro da sua sub-rede (e não usado!).

Use um dos endereços Y.Y.Y.0 / 28 que não estejam em uso e finja que é o gateway (talvez deva ser Y.Y.Y.1 de qualquer forma). Use esse endereço IP como o gateway na tabela de roteamento. Agora, atribua uma entrada arp estática a esse endereço usando arp -s Y.Y.Y.x c8:60:00:5e:bd:e0 para que sua VM não se incomode com solicitações arp (o endereço de hardware já está na tabela ARP) e a envia para o gateway.

Explicação:

Normalmente, quando um sistema deseja entrar em contato com outro host em sua sub-rede, esse sistema usará o ARP para descobrir qual é o endereço MAC que possui o endereço IP solicitado. O host então responderá à solicitação ARP; se isso não acontecer, você finalmente receberá erros de "host inacessível".

Agora você tem um host (roteador de gateway) que não está na sua sub-rede por algum motivo. Como tudo que você precisa fazer é enviar pacotes IP para destinos fora de sua sub-rede através desse roteador, você pode usar um endereço IP falso e criar uma entrada de tabela ARP estática para aquele roteador com esse endereço IP falso. Agora todo o tráfego que precisa ir para (ou através de) esse roteador será endereçado ao endereço MAC correto sem que seu sistema tenha que tentar descobrir esse endereço MAC por meio de broadcasts ARP.

Eu consegui configurar uma caixa de gateway de impressora dessa maneira: digite seu endereço MAC com um endereço IP local livre como uma entrada ARP estática, depois telnet para esse endereço e configure-o corretamente.

    
por 05.11.2015 / 13:53