Einrichten des Hostnamens: FQDN oder Kurzname?

178

Mir ist aufgefallen, dass sich die "bevorzugte" Methode zum Festlegen des Systemhostnamens zwischen Red Hat / CentOS- und Debian / Ubuntu-Systemen grundlegend unterscheidet.

In der CentOS-Dokumentation und im RHEL-Bereitstellungshandbuch heißt es, dass der Hostname der vollqualifizierte Domänenname sein sollte :

HOSTNAME=<value>, wo <value>sollte der Fully Qualified Domain Name (FQDN) sein, wie hostname.example.com, kann aber sein, welcher Hostname erforderlich ist.

Die RHEL-Installationsanleitung ist etwas mehrdeutiger:

Setup fordert Sie auf, einen Hostnamen für diesen Computer anzugeben, entweder als vollqualifizierten Domänennamen (FQDN) im Format hostname.domainname oder als kurzen Hostnamen im Format hostname .

Die Debian-Referenz besagt, dass der Hostname den vollqualifizierten Domänennamen nicht verwenden sollte :

3.5.5. Der Hostname

Der Kernel behält den Hostnamen des Systems bei . Das Init-Skript in Runlevel S, das mit " /etc/init.d/hostname.sh " verknüpft ist, setzt den System-Hostnamen beim Booten (mithilfe des Befehls hostname ) auf den in " / etc / hostname " gespeicherten Namen . Diese Datei sollte nur den Systemhostnamen enthalten, keinen vollständig qualifizierten Domänennamen.

Ich habe keine konkreten Empfehlungen von IBM für die Verwendung gesehen, aber manche Software scheint eine Vorliebe zu haben.

Meine Fragen:

  • Ist es in einer heterogenen Umgebung besser, die Herstellerempfehlung zu verwenden oder eine auszuwählen und über alle Hosts hinweg konsistent zu sein?
  • Auf welche Software ist Sie gestoßen, bei der es darauf ankommt, ob der Hostname auf den vollqualifizierten Domänennamen oder den Kurznamen festgelegt ist?
Cakemox
quelle

Antworten:

106

Ich würde einen einheitlichen Ansatz für die gesamte Umgebung wählen. Beide Lösungen funktionieren einwandfrei und sind mit den meisten Anwendungen kompatibel. Es gibt jedoch einen Unterschied in der Verwaltbarkeit.

Ich gehe mit dem Kurznamen als HOSTNAME-Einstellung und setze den FQDN als erste Spalte /etc/hostsfür die IP des Servers, gefolgt vom Kurznamen.

Ich habe nicht viele Softwarepakete gefunden, die eine Präferenz zwischen den beiden erzwingen oder anzeigen. Ich finde, dass der Kurzname für einige Anwendungen, insbesondere die Protokollierung, sauberer ist. Vielleicht hatte ich Pech, interne Domänen wie server.northside.chicago.rizzomanufacturing.com. Wer möchte das in den Protokollen oder einer Shell-Eingabeaufforderung sehen ?

Manchmal bin ich an Unternehmenskäufen oder Umstrukturierungen beteiligt, bei denen sich interne Domänen und / oder Unterdomänen ändern. In diesen Fällen verwende ich gerne den kurzen Hostnamen, da Protokollierung, Kickstarts, Drucken, Systemüberwachung usw. keine vollständige Neukonfiguration erfordern, um die neuen Domainnamen zu berücksichtigen.

Ein typisches RHEL / CentOS-Server-Setup für einen Server mit dem Namen "rizzo" und der internen Domäne "ifp.com" sieht folgendermaßen aus:

/etc/sysconfig/network:
HOSTNAME=rizzo
...

-

/etc/hosts:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.100.13   rizzo.ifp.com rizzo

-

[root@rizzo ~]# hostname 
rizzo

-

/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to               
 chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot                
to directory '/app/upload/ftp/SRRID'
ewwhite
quelle
7
Wie Sie bevorzuge ich den Kurznamen, habe jedoch kürzlich festgestellt, dass für einige Oracle-Anwendungen die Ausgabe von hostnameFQDN erforderlich ist . Nur drin zu haben, /etc/hostsist nicht gut genug. Das hat meine Konstanz durcheinandergebracht.
James O'Gorman
3
Der Unterschied in der Aktivierung des Host - Namen in diesem Beispiel ist sicherlich nicht eine bewährte Methode ref: tools.ietf.org/search/rfc1178
teknopaul
2
Sollte nicht /etc/sysconfig/networkenthalten Zeilen wie: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes
@ JasmineLognnes Richtig, ich habe es korrigiert. Ich hoffe es macht ewwhite nichts aus.
Kubanczyk
1
Es geht nicht nur um Vorlieben. Siehe hostname(1)auf jedem Linux-Computer.
39

Fast jede Software reagiert empfindlich auf die korrekte Einstellung des Hostnamens. Während ich bei Digg gearbeitet habe, habe ich einmal die gesamte Site für 2 Stunden heruntergefahren, da sich eine scheinbar harmlose Änderung auf /etc/hostsdie Vorstellung des Hostnamens des Systems ausgewirkt hat. Leicht treten. Das heißt, Sie können hier ein wenig verwirrt sein. Ich glaube nicht, dass die HOSTNAME=Einstellung direkt der Verwendung von Debian-basierten Distributionen entspricht /etc/hostname.

Was für mich in einem heterogenen Umfeld funktioniert, ist:

  1. Stellen Sie den Hostnamen gemäß den Empfehlungen des Herstellers unter Verwendung einer Bedingung in Ihrer Konfigurationsverwaltungssoftware ein.
  2. Verwenden Sie den hostnameBefehl, um den vom Kernel usw. verwendeten Hostnamen festzulegen.
  3. In /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Diese Konfiguration hat mich noch nicht enttäuscht.

Paul Lathrop
quelle
Dies ist so ziemlich das Setup, das ich bei der Arbeit verwende. Der Kurzname sollte in Ordnung sein, solange sich der Domainname im DNA-Suchpfad (/etc/resolv.conf) für die relevanten Computer in Ihrer Umgebung befindet
gWaldo
empfehlen Sie speziell eine lokale Netzwerk-IP im Gegensatz zu einer öffentlichen?
Code_monk
34

Sie werden sicherlich kein Problem damit haben, Referenzen online zu finden, die Ihnen sagen, dass Sie es auf die eine oder andere Weise tun müssen. Es scheint mir jedoch, dass ein kurzer Name als Hostname und ein vollständig qualifizierter Name in / etc / hosts mit Sicherheit viel häufiger vorkommen. Sinnvoller erscheint dies, da dann Dienste, die einen voll qualifizierten Namen benötigen, für den Anruf angepasst hostname --fqdnwerden können.

Ich bin in letzter Zeit nur auf eine Software gestoßen, für hostnamedie unbedingt eine fqdn zurückgegeben werden muss , nämlich ganeti. Sie dokumentieren dies hier . Ich sehe jedoch keinen Grund, an den sie sich nicht anpassen hostname --fqdnkönnen.

Eintopf
quelle
"Ich sehe keinen Grund, an den sie sich nicht anpassen können hostname --fqdn" wird im ersten Absatz unter "Warum ein vollqualifizierter Hostname" beantwortet - es sind Rätselraten und ein funktionierender Resolver erforderlich. Den Kernel zu fragen ist die sicherste und zuverlässigste Option.
womble
3
@womble - Solange die Datei / etc / hosts einen Eintrag für machine ( 10.0.0.1 hostname.example.com hostname) enthält und /etc/nsswitch.conf die lokale Auflösung vor DNS ( hosts: files dns) angibt , wird ein funktionierender Resolver von der lokalen Hosts-Datei ausgeführt. Daher ist dieses Argument für die Verwendung eines FQDN anstelle eines Hostnamens nur selten zutreffend. Ein weiteres Beispiel für Software, die hostnamezur Rückgabe eines vollqualifizierten Domänennamens unbedingt erforderlich ist , ist das Zimbra-Mailserverpaket.
Crashmaxed
@crashmaxed: Das sind einige zusätzliche Anforderungen, die in einer bestimmten Umgebung möglicherweise nicht möglich oder versehentlich falsch sind. Es ist viel einfacher, den FQDN in den Kerneldatenstrukturen zu haben.
womble
11

Etwas tangential, während ich diese Frage recherchierte, war ich verrückt genug, den Quellcode von "hostname" zu überprüfen und ein Skript zu schreiben, um Untersuchungsergebnisse auszudrucken (Fedora 19). Was fehlt, ist ein Blick auf "/ etc / hosts", was meiner bescheidenen Meinung nach von vornherein verdammt noch mal ausgeschlossen werden sollte.

#!/bin/bash

function pad {
   if [[ $1 == '?' ]]; then
      printf "%-23s" "?"
   else
      printf "%-23s" "'$1'"
   fi
}

# ----- Kernel -----

# Two ways to configure the kernel values: 
# 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
# 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)

echo "== Kernel values =="
echo

H=`/sbin/sysctl -n kernel.hostname`
D=`/sbin/sysctl -n kernel.domainname`

echo "Kernel hostname: '$H'"
echo "Kernel domainname: '$D'"

# ----- What does bash say -----

echo
echo "== According to bash =="
echo

echo "HOSTNAME = '$HOSTNAME'"

# ----- Hostname config file ------

echo
echo "== Hostname config file =="
echo

ETCH="/etc/hostname"

if [[ -f $ETCH ]]; then
   CONTENTS=`cat $ETCH`
   echo "File '$ETCH' contains: '$CONTENTS'"
else
   echo "File '$ETCH' does not exist"
fi

# ----- Network config file ------

echo
echo "== Network config file =="
echo

SYSN="/etc/sysconfig/network"

if [[ -f $SYSN ]]; then
   LINE=`grep -e "^HOSTNAME=" $SYSN`
   if [[ -n $LINE ]]; then
      echo "File '$SYSN' contains: '$LINE'"
   else 
      echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
   fi
else
   echo "File '$SYSN' does not exist"
fi

# ----- Nodename -------

echo
echo "== Nodename =="
echo

UNAME=`uname --nodename` # On Linux, this is the hostname

echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"

# ----- The 'hostname' mess ------

THE_HOSTNAME=`hostname`
SHORT_NAME=`hostname --short`
NIS_DNAME=`domainname`     
YP_DNAME=`hostname --yp`    # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"

if [[ $? != 0 ]]; then
   YP_DNAME="?"
fi

echo
echo "== 'hostname' directly obtained values =="
echo
echo "The result of gethostname();"
echo "...obtained by running 'hostname'"
echo "Hostname: $(pad $THE_HOSTNAME)"
echo
echo "The part before the first '.' of the value returned by gethostname();"
echo "...obtained by running 'hostname --short'"
echo "Short name: $(pad $SHORT_NAME)"
echo
echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
echo "...on Linux, this is the kernel-configured domainname;"
echo "...obtained by running 'domainname'"
echo "NIS domain name: $(pad $NIS_DNAME)"
echo
echo "The result of yp_get_default_domain(), which may fail;"
echo "...obtained by running 'ĥostname --yp'"
echo "YP default domain: $(pad $YP_DNAME)"

DNS_DNAME=`hostname --domain`  # Same as `dnsdomainname`'
FQDN_NAME=`hostname --fqdn`
ALIAS_NAME=`hostname --alias`

echo
echo "== 'hostname' values obtained via DNS =="
echo
echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --domain'"
echo "DNS domain name: $(pad $DNS_DNAME)"
echo
echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --fqdn'"
echo "Fully qualified hostname: $(pad $FQDN_NAME)"
echo
echo "Alias obtained by gethostbyname(gethostname());"
echo "...obtained by running 'hostname --alias'"
echo "Hostname alias: $(pad $ALIAS_NAME)"

BY_IP_ADDR=`hostname --ip-address`
ALL_IP_ADDR=`hostname --all-ip-addresses`
ALL_FQDN_NAMES=`hostname --all-fqdn`

echo
echo "== 'hostname' values obtained by collecting configured network addresses =="
echo
echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
echo "...obtained by running 'hostname --ip-address'"
echo "By IP address: $BY_IP_ADDR"
echo
echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
echo "...obtained by running 'hostname --all-ip-addresses'"
echo "All IP addresses: $ALL_IP_ADDR"
echo
echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
echo "...obtained by running 'hostname --all-fqdn'"
echo "All fully qualified hostnames: $ALL_FQDN_NAMES"

Die Ausgabe auf einer Amazon EC2-VM, auf der Fedora 19 ausgeführt wird , nach dem manuellen Festlegen der Kernel-Werte und dem Füllen /etc/hostname, aber ohne Änderungen an, /etc/hostskönnte dann folgendermaßen aussehen:

== Kernel values ==

Kernel hostname: 'kyubee'
Kernel domainname: 'homelinux.org'

== According to bash ==

HOSTNAME = 'ip-172-31-24-249.localdomain'

== Hostname config file ==

File '/etc/hostname' contains: 'kyubee.homelinux.org'

== Network config file ==

File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'

== Nodename ==

The 'nodename' given by 'uname --nodename' is: 'kyubee'

== 'hostname' directly obtained values ==

The result of gethostname();
...obtained by running 'hostname'
Hostname: 'kyubee'

The part before the first '.' of the value returned by gethostname();
...obtained by running 'hostname --short'
Short name: 'kyubee'

The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
...on Linux, this is the kernel-configured domainname;
...obtained by running 'domainname'
NIS domain name: 'homelinux.org'

The result of yp_get_default_domain(), which may fail;
...obtained by running 'ĥostname --yp'
YP default domain: 'homelinux.org'

== 'hostname' values obtained via DNS ==

The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --domain'
DNS domain name: ''

The 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --fqdn'
Fully qualified hostname: 'kyubee'

Alias obtained by gethostbyname(gethostname());
...obtained by running 'hostname --alias'
Hostname alias: ''

== 'hostname' values obtained by collecting configured network addresses ==

Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
...obtained by running 'hostname --ip-address'
By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249

Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
...obtained by running 'hostname --all-ip-addresses'
All IP addresses: 172.31.24.249

Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
...obtained by running 'hostname --all-fqdn'
All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal

Der ausfallsichere Weg, den vollqualifizierten Hostnamen in Perl zu erhalten, wäre dann:

sub getHostname {

   my $hostname_short = `/bin/hostname --short`;
   if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
   chomp $hostname_short;

   my $hostname_long  = `/bin/hostname`;
   if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
   chomp $hostname_long;

   if ($hostname_long =~ /^${hostname_short}\..+$/) {
      # "hostname_long" is a qualified version of "hostname_short"
      return $hostname_long
   }
   else {
      # both hostnames are "short" (and are equal)
      die unless ($hostname_long eq $hostname_short);

      my $domainname = `/bin/domainname`;
      if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
      chomp $domainname;

      if ($domainname eq "(none)") {
         # Change according to taste
         return "${hostname_short}.localdomain"
      }
      else {
         return "${hostname_short}.${domainname}"
      }
   }
}

und in bash wäre es:

function getHostname {

   local hostname_short=`/bin/hostname --short`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
   fi

   local hostname_long=`/bin/hostname`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname' -- exiting" >&2; exit 1
   fi

   if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
      # "hostname_long" is a qualified version of "hostname_short"
      echo $hostname_long
   else
      # both hostnames are "short" (and are equal)
      if [[ $hostname_long != $hostname_short ]]; then
         echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
      fi

      local domainname=`/bin/domainname`

      if [ $? -ne 0 ]; then
         echo "Could not execute 'domainname' -- exiting" >&2; exit 1
      fi

      if [[ domainname == '(none)' ]]; then
         # Change according to taste
         echo "${hostname_short}.localdomain"
      else
         echo "${hostname_short}.${domainname}"
      fi
   fi
}

Anmerkungen

Hinweis 1: HOSTNAME ist eine Shell-Variable, die von bash bereitgestellt wird ("Automatisch auf den Namen des aktuellen Hosts gesetzt."), Aber es gibt keinen Hinweis darauf, dass bash bei diesem Wert eintrifft.

Hinweis 2: Vergessen Sie niemals / etc / hostname in /boot/initrams-FOO.img ...

David Tonhofer
quelle
4
Es tut uns leid, wenn dies offensichtlich sein sollte, aber was hat dies mit dem Festlegen des Hostnamens zu tun?
Chris S
Grundsätzlich habe ich während der Recherche die Einstellung des Hostnamens auf meinen Fedora 19 EC2-Instanzen vorgenommen. Was das Ergebnis betrifft: 1) Setzen Sie die FQHN in / etc / hostname 2) Berühren Sie nicht / etc / hosts 3) Sie können den 'Kernel-Hostnamen' entweder auf die FQHN oder den nicht qualifizierten Hostnamen setzen, wenn der Wert nicht gesetzt ist / etc / hostname 4) Sie können den 'Kernel Domainnamen' auf den Domainnamen setzen, der besser ist als nur '(none)'.
David Tonhofer
-4

Die Optionen / etc / hosts funktionieren gut.

Sie möchten jedoch sicherstellen, dass alle richtigen Dateien aktualisiert werden, indem Sie das Setup- Tool ausführen

Riaan
quelle
Meine Distribution hat kein "Setup" -Tool. Welche Distribution benutzt du, die eine hat?
Nickgrim
Jedes RedHat-basierte Betriebssystem hat das Setup-Tool rhel / centos / fedora, unter welchem ​​Betriebssystem arbeiten Sie?
Riaan
3
Da es sich bei der Frage um Unterschiede zwischen RHEL-basierten und Debian-basierten Distributionen handelt, müssen wir davon ausgehen, dass der Fragesteller beide verwendet. Es gibt kein 'Setup'-Tool für Debian-basierte Distributionen.
Martijn Heemels
-4

Hm ... Wenn Sie auf den Linux-Hosts HOSTNAME und FQDN ändern möchten, müssen Sie drei Schritte ausführen (neuer Host ist beispielsweise rizzo.ifp.com ):

Schritt 1: Ändern Sie den HOST-Wert in der Konfiguration der NETWORK-Eigenschaften:

sudo vi /etc/sysconfig/network

Zeichenfolge ändern oder hinzufügen:

HOSTNAME=rizzo.ifp.com

Schritt 2 Bearbeiten Sie Ihre Hosts-Konfiguration

sudo vim /etc/hosts
#IPv4
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP]   rizzo rizzo.ifp.com

Schritt 3 Starten Sie Ihren Host neu. Gut gemacht, überprüfen Sie einfach die neue Konfiguration

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
sub
quelle
-4

Die Reihenfolge stimmt nicht. Es muss sein:

1.2.3.4 full.example.com full

Das Beispiel könnte also so aussehen:

[External IP] rizzo.example.com rizzo 
Christian Azuero
quelle
4
Diese Frage hat schon wirklich gute Antworten. Dies fügt nichts Neues hinzu.
Esa Jokinen