Назад | Перейти на главную страницу

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

Вчера я сделал быструю переустановку (физического) сервера в центре обработки данных, и, поскольку у меня было мало времени и у меня не было легкого доступа к нашей базе данных, я просто назначил ему 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

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

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

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

Вы можете избежать такого поведения, установив sysctl net.ipv4.conf.all.promote_secondaries до 1 вот так:

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

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