Чому видалення невикористаної 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.
kasperd

Відповіді:


53

У Linux Linux-адреси мають поняття "первинна" та "вторинна" адреси. Основна, як правило, є першою адресою, яку ви додаєте до системи. Видалення первинної адреси також означає неявну операцію промивання всього списку вторинних адрес.

Ви можете уникнути такої поведінки, встановивши 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.