Por que a remoção de um endereço IP não utilizado de uma interface elimina conexões não relacionadas a esse endereço?

34

Ontem eu fiz uma reinstalação rápida de um servidor (físico) no datacenter e, como eu estava com pouco tempo e sem acesso fácil ao nosso banco de dados, atribuí a ele um IP que sabia estar disponível e que me permitiria mais tarde acesso para atribuir o endereço correto e continuar provisionando a partir de um local mais quente.

Hoje entrei no servidor (em 172.16.130.10/22) e fiz o seguinte:

ip addr add 172.16.128.67/22 dev eth0

De um terminal na minha estação de trabalho local, verifiquei se ele respondia ao ping no novo endereço e fiz o login nele:

$ ping 172.16.128.67
PING 172.16.128.67 (172.16.128.67) 56(84) bytes of data.
64 bytes from 172.16.128.67: icmp_req=2 ttl=62 time=3.61 ms
64 bytes from 172.16.128.67: icmp_req=3 ttl=62 time=4.87 ms
^C
$ ssh 172.16.128.67

Até aí tudo bem, eu estava conectado através do novo endereço IP e o antigo não era mais necessário. Eu fui em frente e removi:

ip addr del 172.16.130.10/22 dev eth0

Mas assim que acertei Enter minha sessão SSH congelou e eu não consegui mais me conectar. Eu tive que solicitar um operador no local para reiniciar o servidor para mim.

Onde eu errei? Por que remover esse endereço mataria minha conexão?

    
por GnP 05.08.2015 / 18:32

1 resposta

51

No linux, os endereços IP têm uma noção de endereços 'primários' e 'secundários'. O principal é tipicamente o primeiro endereço que você adiciona ao sistema. Remover o endereço principal tem a operação implícita de liberar toda a lista de endereços secundários também.

Você pode evitar esse comportamento definindo o sysctl net.ipv4.conf.all.promote_secondaries como 1 assim:

sysctl -w net.ipv4.conf.all.promote_secondaries=1

Isso altera o comportamento de forma que, quando um IP primário é removido, ele não liberará os endereços restantes e, em vez disso, promoverá um novo endereço IP como principal.

    
por 05.08.2015 / 18:44