Frage Einstellen des Hostnamens: FQDN oder Kurzname?


Ich habe bemerkt, dass die "bevorzugte" Methode, den System-Hostnamen zu setzen, zwischen Red Hat / CentOS- und Debian / Ubuntu-Systemen grundlegend verschieden ist.

CentOS-Dokumentation und das RHEL-Bereitstellungshandbuch Sag den Hostnamen sollte der FQDN sein:

HOSTNAME=<value>, woher <value> sollte die voll qualifizierte Domain sein   Name (FQDN), wie z hostname.example.com, aber kann was auch immer sein   Hostname ist notwendig.

Das RHEL Installationsanleitung ist etwas zwiespältiger:

Setup fordert Sie auf, einen Hostnamen für diesen Computer anzugeben, entweder als    vollqualifizierter Domänenname (FQDN) im Format Hostname.Domänenname   oder als kurzer Hostname im Format Hostname.

Die Debian-Referenz sagt der Hostname sollte den FQDN nicht verwenden:

3.5.5. Der Hostname

Der Kernel verwaltet das System Hostname. Das Init-Skript im Runlevel   S, das mit "/etc/init.d/hostname.sh"setzt das System   Hostname beim Booten (mit dem Hostname Befehl) auf den gespeicherten Namen   im "/ etc / Hostname". Diese Datei sollte enthalten nur der System-Hostname,   kein vollqualifizierter Domänenname

Ich habe keine spezifischen Empfehlungen von IBM für die Verwendung erhalten, aber etwas Software scheint eine Präferenz zu haben.

Meine Fragen:

  • Ist es in einer heterogenen Umgebung besser, die Empfehlung des Anbieters zu verwenden oder eine zu wählen und konsistent über alle Hosts hinweg zu sein?
  • Welche Software ist Ihnen begegnet, die empfindlich darauf reagiert, ob der Hostname auf den FQDN oder den Kurznamen eingestellt ist?

164
2017-11-17 13:07


Ursprung




Antworten:


Ich würde einen konsistenten Ansatz für die gesamte Umgebung wählen. Beide Lösungen funktionieren gut und bleiben 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 in /etc/hosts für die IP des Servers, gefolgt von dem Kurznamen.

Ich habe nicht viele Software-Pakete gefunden, die eine Bevorzugung zwischen den beiden erzwingen oder anzeigen. Ich finde den Kurznamen für einige Anwendungen sauberer, speziell für die Protokollierung. Vielleicht habe ich Pech gehabt interne Domänen wie zu sehen server.northside.chicago.rizzomanufacturing.com. Wer das in den Protokollen sehen will oder a Shell-Eingabeaufforderung?

Manchmal bin ich an Unternehmensakquisitionen oder Umstrukturierungen beteiligt, bei denen sich interne Domänen und / oder Subdomänen ändern. Ich mag den kurzen Hostnamen in diesen Fällen, da Protokollierung, Kickstarts, Drucken, Systemüberwachung usw. keine vollständige Neukonfiguration erfordern, um die neuen Domänennamen zu berücksichtigen.

Ein typisches RHEL / CentOS-Server-Setup für einen Server namens "rizzo" mit der internen Domäne "ifp.com" würde folgendermaßen aussehen:

/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'

96
2017-11-17 13:20



Wie Sie, bevorzuge ich den Kurznamen, aber ich habe kürzlich entdeckt, dass einige Oracle-Anwendungen die Ausgabe von benötigen hostname der FQDN sein. Einfach drin haben /etc/hosts ist nicht gut genug. Das hat meine Konsistenz gestört. - James O'Gorman
Der Unterschied in der Großschreibung der Hostnamen in diesem Beispiel ist sicherlich kein Best Practice Ref: tools.ietf.org/search/rfc1178 - teknopaul
Sollte nicht /etc/sysconfig/network Zeilen enthalten wie: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example ? - Jasmine Lognnes
@ JasmineLognnes Richtig, ich habe es korrigiert. Ich hoffe Ewighite macht mir nichts aus. - kubanczyk
Es geht nicht nur um Vorlieben. Sehen hostname(1) auf jedem Linux-Rechner.


So gut wie alle Software ist empfindlich für die korrekte Einstellung des Hostnamens. Während ich bei Digg gearbeitet habe, habe ich die gesamte Seite für 2 Stunden heruntergebracht, weil ich scheinbar unschuldige Änderungen vorgenommen habe /etc/hostsDas hat sich auf den Hostnamen des Systems ausgewirkt. Trete leicht. Das heißt, Sie können hier etwas verwirrt sein. Ich denke nicht HOSTNAME= Die Einstellung entspricht direkt der Verwendung von Debian-basierten Distributionen /etc/hostname.

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

  1. Legen Sie den Hostnamen auf die vom Verkäufer empfohlene Weise fest, indem Sie in Ihrer Konfigurationsverwaltungssoftware eine Bedingung verwenden.
  2. Benutze die hostname Befehl zum Setzen des vom Kernel verwendeten Hostnamens usw.
  3. Im /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Diese Konfiguration hat mich noch nicht im Stich gelassen.


36
2017-11-21 18:48



Das ist ziemlich das Setup, das ich bei der Arbeit verwende. Der Kurzname sollte in Ordnung sein, solange sich der Domänenname im DNA-Suchpfad (/etc/resolv.conf) für die relevanten Computer in Ihrer Umgebung befindet - gWaldo
Empfiehlst du speziell eine lokale Netzwerk-IP im Gegensatz zu einer öffentlichen? - code_monk


Sie werden sicherlich kein Problem haben, Referenzen online zu finden, die Ihnen sagen, dass Sie es auf die eine oder andere Weise tun sollten. Es scheint mir jedoch, dass ein kurzer Name als Hostname und der voll qualifizierte Name in / etc / hosts sicherlich viel häufiger vorkommt. Es scheint der sinnvollere Weg zu sein, denn dann können Dienste, die einen vollständig qualifizierten Namen benötigen, zum Anrufen angepasst werden hostname --fqdn stattdessen.

Ich bin erst kürzlich auf eine Software gestoßen, die eine fqdn erfordert, um zurückgegeben zu werden hostnameDas war Ganeti. Sie dokumentieren dies Hier. Ich sehe keinen Grund, warum sie sich nicht anpassen können hostname --fqdn, jedoch.


29
2017-12-15 14:45



Bonus für ein Beispiel! Vielen Dank. - Cakemox
"Ich sehe keinen Grund, warum sie sich nicht anpassen können hostname --fqdn"wird im ersten Absatz unter" Warum ein voll qualifizierter Host-Name "beantwortet - es erfordert Rätselraten und erfordert einen Arbeits-Resolver.Fragen Sie den Kernel ist die sicherste und zuverlässigste Option. - womble♦
@womble - Solange die Datei / etc / hosts einen Eintrag für die Maschine hat (10.0.0.1 hostname.example.com hostname) und /etc/nsswitch.conf spezifiziert lokale Auflösung vor DNS (hosts: files dns) dann wird ein funktionierender Resolver von der lokalen hosts-Datei erfüllt. Daher ist das Argument für die Verwendung eines FQDN anstelle eines Hostnamens selten ausreichend. Auch ein anderes Beispiel für Software, die streng benötigt hostname Einen FQDN zurückzugeben ist das Zimbra-Mail-Server-Paket. - crashmaxed
@crashmaxed: Das sind einige zusätzliche Anforderungen, von denen einige in einer gegebenen Umgebung möglicherweise nicht möglich oder aus Versehen vermasselt sind. Der FQDN in den Kernel-Datenstrukturen ist viel einfacher. - womble♦


Etwas tangential, während ich diese Frage erforschte, bin ich verrückt genug, um den Quellcode von "Hostname" zu überprüfen und ein Skript zu schreiben, um Untersuchungsergebnisse zu drucken (Fedora 19). Was fehlt, ist ein Blick auf "/ etc / hosts", der meines Erachtens von allem zunächst verschwiegen 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 mit Fedora 19, nachdem Sie die Kernelwerte manuell festgelegt und gefüllt haben /etc/hostname, aber ohne Änderungen an /etc/hosts könnte dann so sein:

== 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 beständige Weg, den vollständig qualifizierten 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 bash bereitstellt ("Automatisch auf den Namen des aktuellen Hosts einstellen"), aber es gibt keine Hinweise darauf, dass Bash bei diesem Wert eintrifft.

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


10
2017-10-03 11:39



Tut mir leid, wenn das offensichtlich ist, aber was hat das mit dem Einstellen des Hostnamens zu tun? - Chris S
Im Grunde genommen habe ich Anmerkungen gemacht, als ich den Hostnamen auf meinen Fedora 19 EC2-Instanzen festgelegt habe. Wie für das Ergebnis: 1) Setzen Sie FQHN in / etc / hostname 2) Berühren Sie nicht / etc / hosts 3) Sie können den 'Kernel-Hostnamen' entweder auf den FQHN oder den nicht qualifizierten Hostnamen setzen, wenn der Wert nicht gesetzt ist / etc / hostname 4) Sie können den 'kernel domainname' auf den Domainnamen setzen, was schöner ist als nur '(none)'. - David Tonhofer


Die Optionen von / etc / hosts funktionieren gut.

Aber Sie möchten sicherstellen, dass alle richtigen Dateien aktualisiert werden, führen Sie die Konfiguration Werkzeug


-4
2017-11-25 11:56



Meine Distribution hat kein Setup-Tool. Welche Distribution benutzt du, die eine hat? - nickgrim
Jedes Red Hat OS hat das Setup-Tool Rhel / Centos / Fedora Whar OS verwenden Sie? - Riaan
Da die Frage Unterschiede zwischen RHEL-basierten und Debian-basierten Distributionen betrifft, müssen wir davon ausgehen, dass der Fragesteller beides verwendet. Es gibt kein Setup-Tool auf Debian-basierten Distributionen. - Martijn Heemels


Hm ... Wenn Sie in den Linux-Hosts HOSTNAME und FQDN ändern möchten, sollten Sie 3 Schritte lösen (z. B. neuer Host ist) rizzo.ifp.com):

Schritt 1 Ändern Sie den HOST-Wert in der NETWORK-Eigenschaft config:

sudo vi /etc/sysconfig/network

Ändern oder fügen Sie eine Zeichenfolge hinzu:

HOSTNAME=rizzo.ifp.com

Schritt 2 Bearbeiten Sie Ihre Gastgeberkonfiguration

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üfe einfach die neue Konfiguration

[rizzo@rizzo]# hostname -f
rizzo.ifp.com

-4
2017-12-22 10:56





Die Reihenfolge ist nicht richtig. Es muss sein:

1.2.3.4 full.example.com full

So könnte das Beispiel so aussehen:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



Diese Frage hat schon wirklich gute Antworten. Dies fügt nichts Neues hinzu. - Esa Jokinen