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?
Odpowiedzi:
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_secondaries
na 1 w następujący sposób: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.
źródło
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.