Ontem fiz uma rápida reinstalação de um servidor (físico) no datacenter, e como estava com pouco tempo e sem acesso fácil ao nosso banco de dados, apenas atribuí um IP que sabia que estava disponível e que me permitiria acessar posteriormente para atribuir o endereço correto e continue o provisionamento 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 respondeu ao ping no novo endereço e loguei através dele:
$ 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, Enterminha sessão SSH congelou e não consegui mais me conectar. Tive que solicitar a um operador local para reiniciar o servidor para mim.
Onde foi que eu errei? Por que remover esse endereço mataria minha conexão?
No Linux, os endereços IP têm uma noção de endereços 'primários' e 'secundários'. O primário normalmente é o primeiro endereço que você adiciona ao sistema. A remoção do endereço primário tem a operação implícita de limpar também toda a lista de endereços secundários.
Você pode evitar esse comportamento definindo o sysctl
net.ipv4.conf.all.promote_secondaries
como 1 da seguinte forma:Isso altera o comportamento de forma que, quando um IP primário é removido, ele não libera os endereços restantes e, em vez disso, promove um novo endereço IP como primário.