Wenn man unter Linux einen Server mit mehren IP-Adressen hat, ist es wichtig, dass man für bestimmte Anwendungen, wie etwa den Mailserver die korrekte, primäre IP einstellt, um sicherzustellen, dass Mechanismen wie SPF korrekt funktionieren und der Server nicht aus Versehen als Spamschleuder gebrandmarkt wird.
Nun gibt es hierfür mehrere Möglichkeiten, die ich im Nachfolgenden kurz beschreiben möchte. Die erste Variante ist dabei die Eintragung in die /etc/network/interfaces, mit der die Änderungen auch nach einem Reboot wieder wirksam werden. Hierbei wird eth0 statisch (oder via DHCP, wenn man das will) konfiguriert und ein weiteres Interface für jede zusätzliche IP konfiguriert. Diese zusätzlichen Interfaces bekommen durch einen Doppelpunkt getrennt einen bei 0 beginnenden Index. Möchte man auch diese via DHCP konfigurieren, muss man spezielle ID-Strings angeben, da diese Alias-Interfaces rein virtuell sind und der DHCP-Server ansonsten zwei gleiche Anfragen von der selben MAC-Adresse sehen würde. Der einfachste Fall hier ist aber, dass beide Adressen statisch zugewiesen sind, was dann wie folgt in derKonfiguration ausschaut:
auto eth0
iface eth0 inet static
address 192.168.0.23
gateway 192.168.0.1
netmask 255.255.255.0
auto eth0:0
iface eth0:0 inet static
address 192.168.0.42
netmask 255.255.255.0
Die Angabe auto setzt hierbei, welche Interfaces beim Booten automatisch gestartet werden sollen. Zusätzlich ist zu beachten, dass für die zusätzlichen IPs i.d.R. keine zusätzliche Angabe zum Gateway notwendig ist, solange diese sich im gleichen Subnetz befindet. Unterscheiden sich die Netze zwischen primärer und sekundärer IP, muss auch für den Alias eine Angabe zum Gateway ergänzt werden.
Eine weitere Möglichkeit, eine sekundäre IP zu setzen, ist durch Verwendung des ifconfig-Befehls. Hierzu ruft man einfach
ifconfig eth0:0 192.168.0.42 netmask 255.255.255.0
auf und hat die zusätzliche IP gesetzt. Wenn dieses Interface bereits existiert, wird dessen IP-Adresse auf die übergebene IP geändert. Möchte man eine auf diese Art gesetzte IP wieder entfernen, geht dies am Einfachsten mit
ip addr del 192.168.0.42/24 dev eth0:0
Danach ist die zusätzliche IP entfernt. Die Angabe /24 ist in diesem Fall die CIDR-Notation der IP und sollte vollständig angegeben werden, da ansonsten das Utility ip meckert, da das Entfernen via Wildcard deprecated ist.
Nun aber zu dem Fall, den ich gerade habe und weshalb ich diesen Post schreibe: Angenommen, wir haben unsere beiden Adressen hinzugefügt, stellen aber fest, dass wir die falsche IP-Adresse als primäre Adresse gesetzt haben. In diesem Fall kann man mit etwas Glück sogar ohne neu via SSH verbinden zu müssen oder zu rebooten, die beiden IPs tauschen. Da es hierzu aber keinen direkten Befehl gibt, muss man etwas mogeln, eine der beiden IPs entfernen und dann nach erfolgter Neuzuweisung wieder hinzufügen. Dies geht natürlich nur dann ohne Neuverbinden, wenn dies schnell genug ausgeführt wird. Aber wozu kann man sich sowas scripten?
#!/bin/bash
PRIMARY="192.168.0.23"
SECUNDARY="192.168.0.42"
NETMASK="255.255.255.0"
INTF="eth0"
# Ausgabe vorher
ifconfig $INTF
ifconfig $INTF:0
# Prüfen, ob die Konfiguration bereits vorhanden ist
ifconfig $INTF | grep inet | grep $PRIMARY > /dev/null && echo "already set" && exit 0
ifconfig $INTF:0 | grep inet | grep $SECUNDARY > /dev/null && echo "already set" && exit 0
# Wenn die Primäre Adresse auf dem Sekundär-Interface gesetzt ist, muss sie kurz abgemeldet werden
ip addr del $PRIMARY/32 dev $INTF:0
# Primäre IP-Adresse wieder anmelden; dabei die Sekundäre freigeben, danach sekundäre setzen
ifconfig $INTF $PRIMARY netmask $NETMASK
ifconfig $INTF:0 $SECUNDARY netmask $NETMASK
# Ausgabe nachher
ifconfig $INTF
ifconfig $INTF:0
Nach Ausführung dieses Scripts ist die unter $PRIMARY eingetragene IP die, mit der sich das System nach außen meldet, während $SECUNDARY die sekundäre IP angibt, auf der das System auch auf Verbindungen lauscht. Selbstverständlich sollte man aus Sicherheitsgründen die neue Konfiguration aber schon in der /etc/network/interfaces eingetragen haben, sollte der Weg zum Server nicht binnen 5 Minuten zu bewältigen sein.
Zudem sei eine Erweiterung dessen auf das Akzeptieren der zu setzenden Konfiguration via Parameter an dieser Stelle dem Leser überlassen.
Aha.
Ich hätte jetzt einfach /etc/init.d/networking restart gemacht und den Rest der Zeit in lecker Mittagessen investiert …
Kommentar by Nik — 23.01.2011 @ 02:01:59
Ich hab mir mit
nicht erst einmal die Connection gekappt, weil er danach nicht sauber die neue Konfig übernommen hat, obwohl ein Reboot wunderbar funktioniert. Die Variante mit obigem Shellscript klappt i.d.R. sogar ohne, dass die SSH-Verbindung flöten geht. Das ist mir beim Restart des Networking-Subsystems bisher IMMER passiert und kann extrem nervig sein. Aber ja, kann man tun, wobei das auf aktuellen Systemen, insbesondere Ubuntu wohl eher
wäre.
Kommentar by BenBE — 23.01.2011 @ 02:25:53