15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
23.10.2024

Wie man einem Linux-Rechner einen statischen Hostnamen zuweist

Ein statischer Hostname ist ein dauerhaft konfiguriertes, für Menschen lesbares Label, das einem Linux-System zugewiesen wird, über Neustarts hinaus bestehen bleibt und nicht von Netzwerkdiensten wie DHCP überschrieben wird. Im Gegensatz zu einem transienten Hostname – der dynamisch vom Netzwerk-Daemon gesetzt und beim nächsten Start zurückgesetzt werden kann – wird ein statischer Hostname auf der Festplatte gespeichert und bleibt maßgeblich, unabhängig davon, wie die Maschine ihre IP-Adresse erhält.

Dieser Unterschied ist in Produktionsumgebungen von enormer Bedeutung. Wenn Sie einen VPS oder dedizierten Server betreiben, ist ein stabiler Hostname der Anker für SSH-Known-Hosts-Einträge, TLS-Zertifikat-Subject-Alternative-Names, Syslog-Identifikatoren, Prometheus-Ziel-Labels und Kerberos-Prinzipalnamen. Ein Hostname, der sich nach einer DHCP-Erneuerung stillschweigend ändert, kann all diese gleichzeitig beschädigen.

Was genau ist ein Linux-Hostname?

Linux verfolgt drei verschiedene Hostname-Klassen, die jeweils einem anderen Zweck dienen:

Hostname-TypSpeicherortGeltungsbereichÜberlebt Neustart
Statisch/etc/hostnamePersistente SystemidentitätJa
TransientNur Kernel-LaufzeitTemporär, gesetzt durch NTP/DHCPNein
Pretty/etc/machine-infoUTF-8-Anzeigename (Leerzeichen erlaubt)Ja

Der statische Hostname ist derjenige, den Sie absichtlich konfigurieren. Der transiente Hostname ist derjenige, den der Kernel aktuell verwendet – normalerweise identisch mit dem statischen, es sei denn, ein DHCP-Server oder systemd-timesyncd hat ihn überschrieben. Der Pretty-Hostname ist rein kosmetischer Natur (z. B. "Alex's Web Server") und wird niemals in DNS oder SSH verwendet.

Gültige statische Hostnamen folgen den RFC-1123-Regeln: nur Kleinbuchstaben, Ziffern und Bindestriche; keine Unterstriche; keine führenden oder abschließenden Bindestriche; maximal 63 Zeichen pro Label; maximal 253 Zeichen insgesamt für einen vollqualifizierten Domänennamen (FQDN).

Den aktuellen Hostname prüfen

Bevor Sie Änderungen vornehmen, überprüfen Sie den aktuellen Zustand aller drei Hostname-Typen:

hostnamectl

Beispielausgabe auf einem systemd-basierten System:

 Static hostname: old-server-name
 Pretty hostname: Old Server Name
Transient hostname: dhcp-assigned-name
       Icon name: computer-server
         Chassis: server
      Machine ID: a1b2c3d4e5f6...
         Boot ID: 9f8e7d6c5b4a...
Operating System: Ubuntu 22.04.3 LTS
          Kernel: Linux 5.15.0-91-generic
    Architecture: x86-64

Wenn der transiente Hostname vom statischen Hostname abweicht, überschreibt Ihr DHCP-Client den statischen Wert – ein Problem, das im Abschnitt zur Persistenz behandelt wird.

Für Systeme ohne hostnamectl verwenden Sie:

hostname
cat /etc/hostname
uname -n

Methode 1: Verwendung von hostnamectl (systemd-basierte Distributionen)

Diese Methode gilt für Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux und jede Distribution, die systemd als PID 1 ausführt.

Schritt 1: Den statischen Hostname setzen

sudo hostnamectl set-hostname new-static-hostname

hostnamectl schreibt den Wert in /etc/hostname, ruft den sethostname(2)-Syscall auf, um den laufenden Kernel sofort zu aktualisieren, und benachrichtigt systemd-hostnamed – alles atomar. Ein Neustart ist nicht erforderlich.

Um alle drei Hostname-Typen gleichzeitig zu setzen:

sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transient

Schritt 2: Die Änderung überprüfen

hostnamectl

Bestätigen Sie, dass das Feld Statischer Hostname Ihren neuen Wert anzeigt. Überprüfen Sie auch, ob der Kernel ihn übernommen hat:

hostname

Schritt 3: /etc/hosts aktualisieren

hostnamectl aktualisiert /etc/hosts nicht automatisch. Wenn diese Datei nicht aktualisiert wird, gibt sudo die Warnung unable to resolve host aus, Anwendungen, die gethostbyname() für den lokalen Hostname aufrufen, funktionieren nicht mehr, und Java-basierte Dienste (Elasticsearch, Kafka) können beim Start fehlschlagen.

sudo nano /etc/hosts

Die Datei sollte mindestens Folgendes enthalten:

127.0.0.1   localhost
127.0.1.1   new-static-hostname.yourdomain.com  new-static-hostname

Die zweite Zeile verwendet 127.0.1.1 (nicht 127.0.0.1) für den eigenen Hostname der Maschine auf Debian-basierten Systemen. Auf RHEL-basierten Systemen verwenden Sie stattdessen die tatsächliche primäre IP-Adresse:

192.168.1.50  new-static-hostname.yourdomain.com  new-static-hostname

Wenn Sie einen VPS mit cPanel verwalten, übernimmt das Hostname-Änderungswerkzeug von cPanel /etc/hosts automatisch, aber Sie sollten das Ergebnis dennoch manuell überprüfen.

Methode 2: Manuelles Bearbeiten von /etc/hostname (Nicht-systemd-Distributionen)

Diese Methode gilt für ältere Debian/Ubuntu-Versionen mit SysVinit oder Upstart, Alpine Linux, Gentoo mit OpenRC, Void Linux und eingebettete Systeme.

Schritt 1: /etc/hostname bearbeiten

sudo nano /etc/hostname

Die Datei sollte genau eine Zeile enthalten – den kurzen Hostname ohne abschließende Leerzeichen oder Zeilenumbrüche über den standardmäßigen Zeilenterminator hinaus:

new-static-hostname

Schritt 2: /etc/hosts aktualisieren

sudo nano /etc/hosts

Wenden Sie die gleiche Zuordnung an, die in Methode 1 beschrieben ist.

Schritt 3: Die Änderung ohne Neustart anwenden

Den laufenden Kernel sofort über den neuen Hostname informieren:

sudo hostname new-static-hostname

Auf Systemen, auf denen systemd-hostnamed auch ohne vollständige systemd-Einbindung verfügbar ist:

sudo systemctl restart systemd-hostnamed

Auf reinen SysVinit-Systemen ist der obige hostname-Befehl ausreichend. Die Änderung tritt für alle neuen Prozesse in Kraft; bestehende Shells zeigen weiterhin die alte Eingabeaufforderung, bis Sie eine neue Terminalsitzung öffnen oder Folgendes ausführen:

exec bash

Methode 3: Cloud-Init-Überschreibung (Kritisch für Cloud-VPS-Instanzen)

Dies ist das am häufigsten übersehene Szenario. Auf Cloud-Plattformen – einschließlich der meisten VPS-Anbieter – wird cloud-init bei jedem Start ausgeführt und setzt den Hostname auf den Wert zurück, den die Instanz-Metadaten-API zurückgibt. Ihre /etc/hostname-Änderung wird beim nächsten Neustart stillschweigend überschrieben.

Um einen statischen Hostname nach einem cloud-init-Durchlauf beizubehalten, bearbeiten Sie /etc/cloud/cloud.cfg:

sudo nano /etc/cloud/cloud.cfg

Suchen oder fügen Sie die folgende Direktive hinzu:

preserve_hostname: true

Alternativ erstellen Sie eine Drop-in-Override-Datei, um die Änderung der paketverwalteten Konfiguration zu vermeiden:

sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOF

Nach dieser Änderung wird cloud-init den Hostname bei nachfolgenden Starts nicht mehr ändern.

Verhindern, dass DHCP den statischen Hostname überschreibt

Auch ohne cloud-init kann ein DHCP-Client den transienten Hostname überschreiben. Die Lösung hängt davon ab, welchen DHCP-Client Ihre Distribution verwendet.

Für dhclient (Debian/Ubuntu Legacy)

Bearbeiten Sie /etc/dhcp/dhclient.conf:

sudo nano /etc/dhcp/dhclient.conf

Fügen Sie Folgendes hinzu oder ändern Sie es:

send host-name "new-static-hostname";
supersede host-name "new-static-hostname";

Die supersede-Direktive stellt sicher, dass der Client jeden vom DHCP-Server angebotenen Hostname ignoriert.

Für systemd-networkd mit systemd-resolved

Bearbeiten oder erstellen Sie eine .network-Datei in /etc/systemd/network/:

[DHCP]
SendHostname=yes
UseHostname=no

UseHostname=no verhindert, dass der vom DHCP angebotene Hostname den statischen überschreibt.

Für NetworkManager (die meisten Desktop- und modernen Server-Distributionen)

sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yes

Um zu verhindern, dass NetworkManager einen Hostname von DHCP akzeptiert, fügen Sie Folgendes zu /etc/NetworkManager/NetworkManager.conf hinzu:

[main]
hostname-mode=none

Hostname-Weitergabe: Was sonst noch informiert werden muss

Den Hostname im Betriebssystem zu setzen ist notwendig, aber in einer vernetzten Umgebung nicht ausreichend. Berücksichtigen Sie diese nachgelagerten Systeme:

  • DNS-Forward- und Reverse-Einträge: Aktualisieren Sie den A-Eintrag und den PTR-Eintrag Ihrer DNS-Zone. Ohne einen passenden PTR-Eintrag werden viele Mailserver ausgehende E-Mails ablehnen, und einige Sicherheitstools markieren den Host als verdächtig.
  • SSL/TLS-Zertifikate: Wenn Ihr Hostname Teil des CN oder SAN eines Zertifikats ist, benötigen Sie ein neues Zertifikat. SSL-Zertifikate, die an den alten Hostname gebunden sind, erzeugen Validierungsfehler.
  • Domain-Registrierung und DNS-Weitergabe: Wenn der Hostname einem öffentlichen FQDN zugeordnet ist, aktualisieren Sie den DNS-Eintrag bei Ihrem Domain-Registrar und rechnen Sie mit TTL-basierter Weitergabezeit.
  • Monitoring-Agenten: Prometheus Node Exporter, Datadog, Zabbix und ähnliche Agenten verwenden den Hostname als Label. Nach einer Hostname-Änderung können historische Metriken unter einer anderen Host-Identität erscheinen.
  • /etc/ssh/ssh_known_hosts: Clusterweite Known-Hosts-Dateien, die auf den alten Hostname verweisen, müssen aktualisiert werden.
  • Anwendungskonfigurationsdateien: Jeder fest kodierte Hostname in Anwendungskonfigurationen, JDBC-Verbindungszeichenfolgen oder beworbenen Listenern von Message-Brokern muss aktualisiert werden.

Vergleich: Hostname-Konfigurationsmethoden

MethodeDistributions-KompatibilitätErfordert NeustartBehandelt Cloud-InitAtomares Update
hostnamectl set-hostnamesystemd-DistributionenNeinNein (benötigt preserve_hostname)Ja
/etc/hostname manuell bearbeitenAlle DistributionenNein (mit hostname-Befehl)NeinNein
Cloud-init preserve_hostnameCloud-InstanzenNeinJaN/A
DHCP-Client-Konfiguration (supersede)Alle DistributionenNeinNeinNein
NetworkManager nmcliNM-verwaltete SystemeNeinNeinJa

Reale Grenzfälle und Fallstricke

Fallstrick 1: Die sudo-Warnungsschleife. Wenn Sie den Hostname setzen, aber vergessen, /etc/hosts zu aktualisieren, gibt jeder sudo-Aufruf sudo: unable to resolve host new-static-hostname aus. Dies ist nicht fatal, fügt aber jedem privilegierten Befehl Latenz hinzu und überflutet die Logs.

Fallstrick 2: Java-Dienste verweigern den Start. Javas InetAddress.getLocalHost() löst den Hostname über gethostbyname() auf. Wenn der Hostname nicht in /etc/hosts enthalten oder über DNS auflösbar ist, werfen Dienste wie Elasticsearch, Kafka und Cassandra beim Start UnknownHostException.

Fallstrick 3: Hostname mit Unterstrichen. Obwohl Unterstriche in Hostnamen informell weit verbreitet sind, verstoßen sie gegen RFC 952 und RFC 1123. Einige DNS-Resolver, TLS-Bibliotheken und Kubernetes-Komponenten werden sie ablehnen oder falsch behandeln. Verwenden Sie ausschließlich Bindestriche.

Fallstrick 4: FQDN vs. kurzer Hostname. hostnamectl speichert nur den kurzen Hostname (z. B. web01). Der FQDN (z. B. web01.example.com) wird durch die Kombination des kurzen Hostnamens mit der Domain-Suchliste in /etc/resolv.conf oder /etc/systemd/resolved.conf aufgelöst. Setzen Sie Domains=example.com in resolved.conf oder search example.com in resolv.conf, damit hostname --fqdn den korrekten Wert zurückgibt.

Fallstrick 5: Container- und Namespace-Isolation. Innerhalb eines Docker-Containers oder LXC-Namespaces kann hostnamectl mit Failed to connect to bus: No such file or directory fehlschlagen, weil systemd-hostnamed nicht ausgeführt wird. Verwenden Sie hostname new-name direkt, oder setzen Sie den Hostname zur Erstellungszeit des Containers über docker run --hostname oder den hostname:-Schlüssel in docker-compose.yml.

Praktische Entscheidungs-Checkliste

Verwenden Sie diese Checkliste vor und nach jeder Hostname-Änderung in einer Produktionsumgebung:

  • Bestätigen Sie, dass der neue Hostname RFC-1123-konform ist (Kleinbuchstaben, nur Bindestriche, max. 63 Zeichen pro Label)
  • Führen Sie hostnamectl vor der Änderung aus und speichern Sie die Ausgabe für Prüfzwecke
  • Setzen Sie den statischen Hostname mit hostnamectl set-hostname oder durch Bearbeiten von /etc/hostname
  • Aktualisieren Sie /etc/hosts mit dem kurzen Hostname und dem FQDN in derselben Zeile
  • Wenn das System eine Cloud-Instanz ist, setzen Sie preserve_hostname: true in der cloud-init-Konfiguration
  • Wenn DHCP aktiv ist, konfigurieren Sie den DHCP-Client so, dass er vom Server angebotene Hostnamen ignoriert
  • Aktualisieren Sie DNS-A- und PTR-Einträge
  • Erneuern oder stellen Sie alle TLS-Zertifikate neu aus, die auf den alten Hostname verweisen
  • Starten Sie hostname-abhängige Dienste neu (Syslog, Monitoring-Agenten, Java-Anwendungen)
  • Öffnen Sie eine neue Shell-Sitzung und überprüfen Sie, ob hostname, hostname --fqdn und hostnamectl alle konsistente Werte zurückgeben
  • Überprüfen Sie /var/log/syslog oder journalctl -b auf Fehler nach der Änderung, die auf den alten Hostname verweisen

FAQ

Erfordert hostnamectl set-hostname einen Neustart, um wirksam zu werden?

Nein. hostnamectl ruft den sethostname(2)-Systemaufruf sofort auf und aktualisiert den laufenden Kernel in Echtzeit. Die Änderung wird auch in /etc/hostname für die Persistenz geschrieben. Neue Prozesse und neue Shell-Sitzungen sehen den aktualisierten Hostname ohne Neustart.

Warum wird mein Hostname nach jedem Neustart auf einem Cloud-VPS zurückgesetzt?

Cloud-init überschreibt ihn mit ziemlicher Sicherheit. Fügen Sie preserve_hostname: true zu /etc/cloud/cloud.cfg hinzu oder erstellen Sie eine Drop-in-Datei unter /etc/cloud/cloud.cfg.d/99_hostname.cfg mit derselben Direktive. Dies ist die häufigste Ursache für Hostname-Rücksetzungen auf cloud-gehosteten Maschinen.

Was ist der Unterschied zwischen 127.0.0.1 und 127.0.1.1 in /etc/hosts?

127.0.0.1 ist die Standard-Loopback-Adresse, die localhost zugeordnet ist. Debian-basierte Distributionen verwenden 127.0.1.1 als sekundäre Loopback-Adresse speziell für den eigenen Hostname der Maschine, um Konflikte zu vermeiden, wenn die Maschine keine statische IP hat. Auf RHEL-basierten Systemen und Maschinen mit einer festen IP verwenden Sie stattdessen die tatsächliche primäre IP-Adresse für die Hostname-Zuordnung.

Kann ich einen Unterstrich in einem Linux-Hostname verwenden?

Technisch gesehen akzeptiert das Betriebssystem ihn, aber Sie sollten es nicht tun. Unterstriche verstoßen gegen RFC 952 und RFC 1123. Sie verursachen Fehler bei der DNS-Auflösung (BIND lehnt sie standardmäßig ab), der TLS-Zertifikatsvalidierung und der Kubernetes-Node-Benennung. Verwenden Sie ausschließlich Bindestriche.

Wie überprüfe ich, ob der Hostname über alle Systemschichten hinweg vollständig konsistent ist?

Führen Sie die folgende Sequenz aus und bestätigen Sie, dass alle Ausgaben übereinstimmen:

hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"

Wenn einer dieser Befehle unterschiedliche Werte zurückgibt, überschreibt noch eine der Schichten – cloud-init, DHCP-Client oder NetworkManager – die statische Einstellung.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen