Dlaczego usunięcie nieużywanego adresu IP z interfejsu zabija połączenia niezwiązane z tym adresem?

35

Wczoraj przeprowadziłem szybką ponowną instalację (fizycznego) serwera w centrum danych, a ponieważ miałem mało czasu i nie miałem łatwego dostępu do naszej bazy danych, właśnie przypisałem mu adres IP, o którym wiedziałem, że jest dostępny i pozwoliłby mi na późniejszy dostęp do przypisania prawidłowy adres i kontynuuj zaopatrzenie z cieplejszego miejsca.

Dzisiaj zalogowałem się na serwerze (172.16.130.10/22) i wykonałem następujące czynności:

ip addr add 172.16.128.67/22 dev eth0

Z terminala na mojej lokalnej stacji roboczej sprawdziłem, czy odpowiedział na ping na nowy adres i zalogowałem się za jego pośrednictwem:

$ 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

Jak dotąd tak dobrze, byłem połączony przez nowy adres IP i stary nie był już potrzebny. Poszedłem i usunąłem go:

ip addr del 172.16.130.10/22 dev eth0

Ale gdy tylko trafiłem, Entersesja SSH zamarła i nie mogłem już się połączyć. Musiałem poprosić operatora na miejscu o ponowne uruchomienie serwera.

Gdzie popełniłem błąd? Dlaczego usunięcie tego adresu miałoby zabić moje połączenie?

GnP
źródło
2
Oprócz doskonałej odpowiedzi Mathewsa: W wielu systemach uniksowych (i uniksopodobnych) każda zmiana powiązanego adresu (adresów IP) na krótko odłączy wszystkie otwarte sesje tego interfejsu (nawet te używające innego adresu). To by Cię wyrzuciło z sesji SSH, ale w takim przypadku możesz natychmiast połączyć się ponownie.
Tonny,
Uważam, że ten problem występuje tylko w przypadku IPv4. Nie sądzę, żeby tak się stało, gdybyś używał IPv6.
kasperd

Odpowiedzi:

53

W systemie Linux adresy IP mają pojęcia adresów „pierwotnych” i „wtórnych”. Podstawowym jest zazwyczaj pierwszy adres dodany do systemu. Usunięcie adresu podstawowego pociąga za sobą niejawną operację opróżnienia całej listy adresów dodatkowych.

Można tego uniknąć, ustawiając sysctl net.ipv4.conf.all.promote_secondariesna 1 w następujący sposób:

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

To zmienia zachowanie, tak że po usunięciu podstawowego adresu IP nie opróżnia on pozostałych adresów, a zamiast tego promuje nowy adres IP jako podstawowy.

Matthew Ife
źródło
6
Dzięki! Po prostu przyszedł po drugiej stronie to także: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