Почему удаление неиспользуемого IP-адреса из интерфейса уничтожает соединения, не связанные с этим адресом

35

Вчера я сделал быструю переустановку (физического) сервера в центре обработки данных, и, поскольку у меня было мало времени, и у меня не было легкого доступа к нашей базе данных, я просто назначил ему IP-адрес, который, как я знал, был доступен и позволил бы мне позже получить доступ к назначению. правильный адрес и продолжить предоставление с более теплого места.

Сегодня я вошел на сервер (172.16.130.10/22) и сделал следующее:

ip addr add 172.16.128.67/22 dev eth0

С терминала на моей локальной рабочей станции я проверил, что он ответил на запрос ping на новый адрес и вошел через него:

$ 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

Пока все хорошо, я был подключен через новый IP-адрес, и старый больше не нужен. Я пошел дальше и удалил это:

ip addr del 172.16.130.10/22 dev eth0

Но как только я нажал, Enterмоя сессия SSH замерла, и я больше не мог подключаться. Мне пришлось попросить оператора на месте перезагрузить сервер для меня.

Где я ошибся? Почему удаление этого адреса уничтожило бы мое соединение?

ВНП
источник
2
В дополнение к превосходному ответу Мэтьюса: во многих Unix (и Unix-подобных) системах любое изменение связанного IP-адреса (-ей) на короткое время отключает все открытые сеансы с этим интерфейсом (даже те, которые используют другой адрес). Так что это исключит вас из сеанса SSH, но в этом случае вы можете немедленно восстановить соединение.
Тонни
Я считаю, что эта проблема существует только с IPv4. Я не думаю, что это произошло бы, если бы вы использовали IPv6.
Касперд

Ответы:

53

В Linux IP-адреса имеют понятие «первичный» и «вторичный» адреса. Первичным обычно является первый адрес, который вы добавляете в систему. Удаление основного адреса также подразумевает очистку всего списка дополнительных адресов.

Вы можете избежать этого, установив sysctl net.ipv4.conf.all.promote_secondariesв 1 следующим образом:

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

Это меняет поведение таким образом, что при удалении основного IP-адреса он не сбрасывает оставшиеся адреса и вместо этого будет выдвигать новый IP-адрес в качестве основного.

Мэтью Ифе
источник
6
Благодарность! Я только что натолкнулся на это :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