Warum werden durch das Entfernen einer nicht verwendeten IP-Adresse von einer Schnittstelle Verbindungen getrennt, die nicht mit dieser Adresse zusammenhängen?

35

Gestern habe ich eine schnelle Neuinstallation eines (physischen) Servers im Rechenzentrum durchgeführt. Da ich wenig Zeit hatte und keinen einfachen Zugriff auf unsere Datenbank hatte, habe ich ihm nur eine IP zugewiesen, von der ich wusste, dass sie verfügbar ist und die mir später den Zugriff ermöglichen würde Stellen Sie die richtige Adresse ein und setzen Sie die Bereitstellung von einem wärmeren Ort aus fort.

Heute habe ich mich am Server angemeldet (am 172.16.130.10/22) und folgendes getan:

ip addr add 172.16.128.67/22 dev eth0

Von einem Terminal auf meiner lokalen Workstation aus habe ich überprüft, ob es auf das Anpingen der neuen Adresse geantwortet hat, und mich über dieses Terminal angemeldet:

$ 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

Soweit so gut, war ich über die neue IP-Adresse verbunden und die alte war nicht mehr nötig. Ich ging voran und entfernte es:

ip addr del 172.16.130.10/22 dev eth0

Aber sobald ich auf Entermeine SSH-Sitzung traf, fror ich ein und konnte keine Verbindung mehr herstellen. Ich musste einen Vor-Ort-Operator bitten, den Server für mich neu zu starten.

Was habe ich falsch gemacht? Warum würde das Entfernen dieser Adresse meine Verbindung beenden?

GnP
quelle
2
Zusätzlich zu Mathews hervorragender Antwort: In vielen Unix-Systemen (und Unix-ähnlichen Systemen) werden alle offenen Sitzungen für kurze Zeit von dieser Schnittstelle getrennt (auch diejenigen, die eine andere Adresse verwenden). Das würde Sie also aus Ihrer SSH-Sitzung werfen, aber in diesem Fall können Sie die Verbindung sofort wiederherstellen.
Tonny
Ich glaube, dass dieses Problem nur mit IPv4 besteht. Ich glaube nicht, dass es passiert wäre, wenn Sie IPv6 verwendet hätten.
Kasperd

Antworten:

53

Unter Linux werden IP-Adressen als "primäre" und "sekundäre" Adressen bezeichnet. Die primäre Adresse ist normalerweise die erste Adresse, die Sie dem System hinzufügen. Das Entfernen der Primäradresse hat implizit den Vorgang, die gesamte Liste der Sekundäradressen ebenfalls zu leeren.

Sie können dieses Verhalten vermeiden, indem Sie sysctl net.ipv4.conf.all.promote_secondarieswie folgt auf 1 setzen:

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

Dadurch wird das Verhalten dahingehend geändert, dass beim Entfernen einer primären IP-Adresse die verbleibenden Adressen nicht gelöscht werden und stattdessen eine neue IP-Adresse als primäre IP-Adresse heraufgestuft wird.

Matthew Ife
quelle
6
Vielen Dank! Ich kam gerade accross dies auch: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