¿Por qué eliminar una dirección IP no utilizada de una interfaz elimina conexiones no relacionadas con esa dirección?

35

Ayer realicé una reinstalación rápida de un servidor (físico) en el centro de datos, y como tenía poco tiempo y no tenía fácil acceso a nuestra base de datos, simplemente le asigné una IP que sabía que estaba disponible y que me permitiría acceder más tarde para asignar la dirección correcta y continúe aprovisionando desde un lugar más cálido.

Hoy inicié sesión en el servidor (172.16.130.10/22) e hice lo siguiente:

ip addr add 172.16.128.67/22 dev eth0

Desde una terminal en mi estación de trabajo local, verifiqué que respondía al ping en la nueva dirección e inicié sesión a través de ella:

$ 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

Hasta ahora todo bien, estaba conectado a través de la nueva dirección IP y la anterior ya no era necesaria. Seguí adelante y lo quité:

ip addr del 172.16.130.10/22 dev eth0

Pero tan pronto como llegué a Entermi sesión SSH se congeló y ya no pude conectarme. Tuve que solicitar un operador en el sitio para reiniciar el servidor por mí.

¿Qué hice mal? ¿Por qué eliminar esa dirección mataría mi conexión?

GnP
fuente
2
Además de la excelente respuesta de Mathews: en muchos sistemas Unix (y similares a Unix), cualquier cambio en las direcciones IP vinculadas desconectará brevemente todas las sesiones abiertas a esa interfaz (incluso las que usan otra dirección). Eso lo expulsaría de su sesión SSH, pero puede volver a conectarse de inmediato en ese caso.
Tonny
Creo que este problema solo existe con IPv4. No creo que hubiera sucedido si estuvieras usando IPv6.
kasperd

Respuestas:

53

En Linux, las direcciones IP tienen una noción de direcciones 'primarias' y 'secundarias'. La principal suele ser la primera dirección que agrega al sistema. Eliminar la dirección primaria tiene la operación implícita de vaciar también la lista completa de direcciones secundarias.

Puede evitar este comportamiento estableciendo el sysctl net.ipv4.conf.all.promote_secondariesen 1 de la siguiente manera:

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

Esto cambia el comportamiento de modo que cuando se elimina una IP primaria, no vaciará las direcciones restantes y en su lugar promoverá una nueva dirección IP como primaria.

Matthew Ife
fuente
66
¡Gracias! También me encontré con esto :An IP address becomes secondary if another address within the same prefix (network) already exists. The first address within the prefix is primary and is the tag address for the group of all the secondary addresses. When the primary address is deleted all of the secondaries are purged too.
GnP