Impostazione del nome host: FQDN o nome breve?


178

Ho notato che il metodo "preferito" per impostare il nome host del sistema è sostanzialmente diverso tra i sistemi Red Hat / CentOS e Debian / Ubuntu.

La documentazione di CentOS e la guida alla distribuzione di RHEL affermano che il nome host dovrebbe essere il nome FQDN :

HOSTNAME=<value>, dove <value>dovrebbe essere il nome di dominio completo (FQDN), ad esempio hostname.example.com, ma può essere qualsiasi nome host sia necessario.

La guida all'installazione di RHEL è leggermente più ambigua:

Il programma di installazione richiede di fornire un nome host per questo computer, come nome di dominio completo (FQDN) nel formato hostname.domainname o come nome host breve nel formato hostname .

Il riferimento Debian dice che il nome host non dovrebbe usare l'FQDN :

3.5.5. Il nome host

Il kernel mantiene il nome host del sistema . Lo script init nel runlevel S che è collegato a " /etc/init.d/hostname.sh " imposta il nome host di sistema all'avvio (usando il comando hostname ) sul nome memorizzato in " / etc / hostname ". Questo file deve contenere solo il nome host del sistema, non un nome di dominio completo.

Non ho visto consigli specifici da parte di IBM su quale utilizzare, ma alcuni software sembrano avere una preferenza.

Le mie domande:

  • In un ambiente eterogeneo, è meglio utilizzare la raccomandazione del fornitore o sceglierne una ed essere coerente tra tutti gli host?
  • Quale software hai riscontrato sensibile al fatto che il nome host sia impostato su FQDN o nome breve?

Risposte:


106

Sceglierei un approccio coerente in tutto l'ambiente. Entrambe le soluzioni funzionano bene e rimarranno compatibili con la maggior parte delle applicazioni. C'è una differenza nella gestibilità, però.

Vado con il nome breve come impostazione HOSTNAME e ho impostato il nome di dominio completo come prima colonna /etc/hostsper l'IP del server, seguito dal nome breve.

Non ho riscontrato molti pacchetti software che impongono o visualizzano una preferenza tra i due. Trovo che il nome breve sia più pulito per alcune applicazioni, in particolare la registrazione. Forse sono stato sfortunato nel vedere domini interni come server.northside.chicago.rizzomanufacturing.com. Chi vuole vederlo nei registri o nel prompt della shell ?

A volte sono coinvolto in acquisizioni o ristrutturazioni aziendali in cui i domini interni e / o i sottodomini cambiano. Mi piace usare il nome host breve in questi casi perché la registrazione, i kickstart, la stampa, il monitoraggio dei sistemi, ecc. Non necessitano di una completa riconfigurazione per tenere conto dei nuovi nomi di dominio.

Una tipica configurazione del server RHEL / CentOS per un server chiamato "rizzo" con dominio interno "ifp.com", sarebbe simile a:

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

7
Come te, preferisco il nome breve, tuttavia ho scoperto di recente che alcune applicazioni Oracle richiedono l'output di hostnameessere il nome di dominio completo. Basta averlo dentro /etc/hostsnon è abbastanza buono. Ciò ha incasinato la mia coerenza.
James O'Gorman,

3
La differenza di maiuscole e minuscole dei nomi host in questo esempio non è sicuramente una rif delle migliori pratiche: tools.ietf.org/search/rfc1178
teknopaul,

2
Non dovrebbe /etc/sysconfig/networkcontenere linee come: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes,

@JasmineLognnes Bene, l'ho corretto. Spero che l'ewwhite non si preoccupi.
kubanczyk,

1
Non si tratta solo di preferenze. Vedi hostname(1)su qualsiasi macchina Linux.

39

Praticamente tutto il software è sensibile all'impostazione corretta del nome host. Mentre stavo lavorando a Digg, una volta ho distrutto l'intero sito per 2 ore a causa di un cambiamento apparentemente innocuo /etc/hostsche ha influenzato la nozione di nome host del sistema. Vacci piano. Detto questo, potresti essere leggermente confuso qui. Non penso che l' HOSTNAME=impostazione sia direttamente equivalente a come usano le distribuzioni basate su Debian /etc/hostname.

Ciò che funziona per me in un ambiente eterogeneo è:

  1. Impostare il nome host nel modo consigliato dal fornitore, usando un condizionale nel software di gestione della configurazione.
  2. Utilizzare il hostnamecomando per impostare il nome host utilizzato dal kernel, ecc.
  3. In /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Questa configurazione non mi ha ancora fallito.


Questa è praticamente la configurazione che uso al lavoro. Il nome breve dovrebbe andare bene fintanto che il nome di dominio si trova nel percorso di ricerca del DNA (/etc/resolv.conf) per le macchine rilevanti nel proprio ambiente
gWaldo

mi consiglia in particolare un IP di rete locale anziché uno pubblico?
code_monk,

34

Non avrai sicuramente problemi a trovare riferimenti online che ti diranno di farlo in un modo o nell'altro. Mi sembra tuttavia che avere un nome breve come nome host e avere il nome completo in / etc / hosts sia sicuramente molto più diffuso. Sembra il modo più sensato, in quanto i servizi che richiedono un nome completo possono essere adattati per chiamare hostname --fqdn.

Di recente mi sono imbattuto in un solo software che richiede rigidamente la restituzione di un fqdn hostname, che era ganeti. Lo documentano qui . hostname --fqdnTuttavia, non vedo alcun motivo per cui non possano adattarsi .


"Non vedo alcun motivo per cui non riescano ad adattarsi hostname --fqdn" viene data risposta nel primo paragrafo in "Perché un nome host completo" - richiede congetture e richiede un risolutore funzionante. Chiedere al kernel è l'opzione più sicura e affidabile.
Womble

3
@womble - Fintanto che il file / etc / hosts ha una voce per la macchina ( 10.0.0.1 hostname.example.com hostname) e /etc/nsswitch.conf specifica la risoluzione locale prima di DNS ( hosts: files dns), quindi avere un risolutore funzionante è soddisfatto dal file hosts locale. Pertanto tale argomento per l'utilizzo di un nome di dominio completo anziché di un nome host raramente contiene acqua. Inoltre, un altro esempio di software che richiede rigidamente la hostnamerestituzione di un nome di dominio completo è il pacchetto del server di posta Zimbra.
crashmaxed

@crashmaxed: sono diversi i requisiti extra, ognuno dei quali potrebbe non essere possibile in un determinato ambiente o rovinato per errore. Avere l'FQDN nelle strutture di dati del kernel è molto più semplice.
womble

11

In qualche modo tangenzialmente, durante la ricerca di questa domanda, sono diventato abbastanza pazzo da controllare il codice sorgente di "hostname" e scrivere uno script per stampare risultati investigativi (Fedora 19). Ciò che manca è uno sguardo a "/ etc / hosts", che a mio modesto parere dovrebbe essere tenuto al diavolo da tutto ciò, in primo luogo.

#!/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"

L'output su una VM Amazon EC2 che esegue Fedora 19 , dopo aver impostato manualmente i valori del kernel e il riempimento /etc/hostname, ma senza modifiche a /etc/hostspotrebbe quindi essere così:

== 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

Il modo resiliente per ottenere il nome host completo in perl sarebbe quindi:

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}"
      }
   }
}

e in bash sarebbe:

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
}

Appunti

Nota 1: HOSTNAME è una variabile di shell che fornisce bash ("Impostato automaticamente sul nome dell'host corrente.") Ma non vi sono indicazioni su bash che arriva a quel valore.

Nota 2: non dimenticare mai / etc / hostname in /boot/initrams-FOO.img ...


4
Scusate se questo dovrebbe essere ovvio, ma cosa c'entra questo con l'impostazione del nome host?
Chris S,

Fondamentalmente note che ho fatto durante la ricerca impostando il nome host sulle mie istanze di Fedora 19 EC2. Per quanto riguarda il risultato: 1) Impostare FQHN in / etc / hostname 2) Non toccare / etc / hosts 3) È possibile impostare il 'nome host del kernel' su FQHN o sul nome host non qualificato, se non impostato il valore è preso da / etc / hostname 4) È possibile impostare "kernel domainname" sul domainname, che è più bello del semplice "(none)".
David Tonhofer,

-4

Le opzioni / etc / hosts funzionano bene.

Ma vuoi assicurarti che tutti i file corretti vengano aggiornati esegui lo strumento di installazione


La mia distribuzione non ha uno strumento "setup"; quale distribuzione stai usando che ne ha una?
Nickgrim,

qualsiasi SO basato su Redhat ha lo strumento di configurazione rhel / centos / fedora whar OS che stai usando?
Riaan,

3
Poiché la domanda parla delle differenze tra le distribuzioni basate su RHEL e quelle basate su Debian, dobbiamo supporre che il richiedente usi entrambi. Non esiste uno strumento di 'installazione' su distribuzioni basate su Debian.
Martijn Heemels,

-4

Hm ... Negli host Linux, se vuoi cambiare HOSTNAME e FQDN, dovresti risolvere 3 passaggi (ad esempio, il nuovo host è rizzo.ifp.com ):

Passaggio n. 1 Modificare il valore HOST nella configurazione delle proprietà NETWORK:

sudo vi /etc/sysconfig/network

Modifica o aggiungi stringa:

HOSTNAME=rizzo.ifp.com

Step # 2 Modifica la configurazione dei tuoi host

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

Step # 3 Riavvia l'host Ben fatto, basta controllare la nuova configurazione

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

-4

L'ordine non è giusto. Deve essere:

1.2.3.4 full.example.com full

Quindi l'esempio potrebbe essere così:

[External IP] rizzo.example.com rizzo 

4
Questa domanda ha già risposte di qualità davvero. Questo non aggiunge nulla di nuovo.
Esa Jokinen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.