Définition du nom d’hôte: nom de domaine complet ou nom abrégé?

178

J'ai remarqué que la méthode "préférée" de définition du nom d'hôte système est fondamentalement différente entre les systèmes Red Hat / CentOS et Debian / Ubuntu.

La documentation CentOS et le guide de déploiement RHEL indiquent que le nom d'hôte doit être le nom de domaine complet :

HOSTNAME=<value>, où <value>devrait être le nom de domaine complet (FQDN), tel que hostname.example.com, mais peut être le nom d’hôte requis.

Le guide d'installation RHEL est légèrement plus ambigu:

Le programme d'installation vous invite à fournir un nom d'hôte pour cet ordinateur, sous la forme d'un nom de domaine complet (FQDN) au format nomhôte.nom de domaine ou sous la forme d'un nom d'hôte abrégé au format nomhôte .

La référence Debian indique que le nom d’hôte ne doit pas utiliser le nom de domaine complet :

3.5.5. Le nom d'hôte

Le noyau conserve le nom d'hôte du système . Le script init du niveau d'exécution S, lié symboliquement à " /etc/init.d/hostname.sh ", définit le nom d'hôte du système au moment du démarrage (à l'aide de la commande hostname ) sur le nom stocké dans " / etc / hostname ". Ce fichier ne doit contenir que le nom d'hôte du système, pas un nom de domaine complet.

Je n'ai pas vu de recommandations spécifiques d'IBM à utiliser, mais certains logiciels semblent avoir une préférence.

Mes questions:

  • Dans un environnement hétérogène, vaut-il mieux utiliser la recommandation du fournisseur ou en choisir une et rester cohérent sur tous les hôtes?
  • Quel logiciel avez-vous rencontré est-il sensible au fait que le nom d'hôte soit défini sur le nom de domaine complet ou sur le nom abrégé?
Cakemox
la source

Réponses:

106

Je choisirais une approche cohérente dans tout l'environnement. Les deux solutions fonctionnent bien et resteront compatibles avec la plupart des applications. Il y a une différence de gestion, cependant.

Je vais avec le nom abrégé comme paramètre HOSTNAME et définit le nom de domaine complet (FQDN) comme première colonne /etc/hostsde l'adresse IP du serveur, suivi du nom abrégé.

Je n'ai pas rencontré beaucoup de progiciels qui imposent ou affichent une préférence entre les deux. Je trouve le nom abrégé plus propre pour certaines applications, en particulier la journalisation. Peut-être n’ai-je pas eu la chance de voir des domaines internes comme server.northside.chicago.rizzomanufacturing.com. Qui veut voir cela dans les journaux ou une invite du shell ?

Parfois, je participe à des acquisitions ou à des restructurations d'entreprises dans lesquelles des domaines internes et / ou des sous-domaines changent. Dans ces cas, j'aime bien utiliser le nom d'hôte abrégé, car la journalisation, les kickstarts, l'impression, la surveillance des systèmes, etc. ne nécessitent pas de reconfiguration complète pour prendre en compte les nouveaux noms de domaine.

Une configuration de serveur RHEL / CentOS typique pour un serveur nommé "rizzo" avec un domaine interne "ifp.com" ressemblerait à ceci:

/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
la source
7
Comme vous, je préfère le nom abrégé, mais j’ai récemment découvert que certaines applications Oracle exigent la sortie du hostnamenom de domaine complet. Avoir juste dedans /etc/hostsne suffit pas. Cela a foiré avec ma cohérence.
James O'Gorman
3
La différence de capitalisation des noms d’hôte dans cet exemple n’est sûrement pas une bonne pratique. Ref: tools.ietf.org/search/rfc1178
teknopaul
2
Ne doit pas /etc/sysconfig/networkcontenir des lignes comme: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes
@JasmineLognnes D'accord, je l'ai corrigé. J'espère que ça ne me dérange pas.
Kubanczyk
1
Ce n'est pas seulement une question de préférence. Voir hostname(1)sur n'importe quelle machine Linux.
39

Pratiquement tous les logiciels sont sensibles à la définition correcte du nom d’hôte. Pendant que je travaillais chez Digg, j’ai une fois détruit l’ensemble du site pendant 2 heures en raison d’une modification apparemment innocente /etc/hostsqui affectait la notion de nom d’hôte du système. Marchez légèrement. Cela dit, vous pouvez être un peu confus ici. Je ne pense pas que le HOSTNAME=paramètre soit directement équivalent à la façon dont les distributions basées sur Debian utilisent /etc/hostname.

Ce qui fonctionne pour moi dans un environnement hétérogène est:

  1. Définissez le nom d'hôte de la manière recommandée par le fournisseur, en utilisant une condition dans votre logiciel de gestion de configuration.
  2. Utilisez la hostnamecommande pour définir le nom d'hôte utilisé par le noyau, etc.
  3. Dans /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Cette configuration ne m'a pas encore échoué.

Paul Lathrop
la source
C’est à peu près la configuration que j’utilise au travail. Le nom abrégé devrait être correct tant que le nom de domaine est dans le chemin de recherche de l'ADN (/etc/resolv.conf) pour les machines appropriées dans votre environnement
gWaldo
recommandez-vous spécifiquement une adresse IP de réseau local par opposition à une adresse publique?
code_monk
34

Vous n'aurez aucun problème à trouver des références en ligne qui vous indiqueront de le faire définitivement d'une manière ou d'une autre. Il me semble cependant que le fait d'avoir un nom abrégé comme nom d'hôte et le nom qualifié complet dans / etc / hosts est certainement beaucoup plus répandu. Cela semble être la méthode la plus judicieuse, car les services qui nécessitent un nom complet peuvent être adaptés pour appeler hostname --fqdn.

Je n’ai rencontré récemment qu’un seul logiciel qui exige rigoureusement le hostnamerenvoi d’un fqdn, à savoir ganeti. Ils documentent ceci ici . Je ne vois aucune raison pour laquelle ils ne peuvent pas s'adapter hostname --fqdn, cependant.

Ragoût
la source
"Je ne vois aucune raison pour laquelle ils ne peuvent pas s'adapter hostname --fqdn", répond le premier paragraphe sous "Pourquoi un nom d'hôte qualifié complet" - cela nécessite des conjectures et nécessite un résolveur fonctionnel. Demander le noyau est l'option la plus sûre et la plus fiable.
Womble
3
@womble - Tant que le fichier / etc / hosts a une entrée pour machine ( 10.0.0.1 hostname.example.com hostname) et que /etc/nsswitch.conf spécifie la résolution locale avant DNS ( hosts: files dns), le fichier hôtes local remplit alors un résolveur fonctionnel. En tant que tel, l'argument en faveur de l'utilisation d'un nom de domaine complet au lieu d'un nom d'hôte est rarement valable. En outre, le hostnamepackage de serveur de messagerie Zimbra est un autre exemple de logiciel nécessitant de manière rigide le renvoi d’un nom de domaine complet.
crashmaxed le
@crashmaxed: Il s'agit de plusieurs exigences supplémentaires, dont certaines pourraient ne pas être possibles dans un environnement donné ou être gâchées par erreur. Avoir le nom de domaine complet dans les structures de données du noyau est beaucoup plus simple.
womble
11

De manière un peu tangentielle, en cherchant cette question, je suis devenue assez folle pour vérifier le code source de "hostname" et écrire un script pour imprimer les résultats de l'enquête (Fedora 19). Ce qui manque, c’est un coup d’œil sur "/ etc / hosts", qui, à mon humble avis, devrait être tenu à l’abri de tout cela.

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

La sortie sur une machine virtuelle Amazon EC2 exécutant Fedora 19 , après avoir défini manuellement les valeurs du noyau et rempli /etc/hostname, mais sans aucune modification, /etc/hostspourrait ressembler à ceci:

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

La manière résiliente d’obtenir le nom d’hôte qualifié complet en Perl serait alors:

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

et dans bash ce serait:

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
}

Remarques

Remarque 1: HOSTNAME est une variable shell fournie par bash ("automatiquement définie sur le nom de l'hôte actuel"), mais rien n'indique que bash arrive à cette valeur.

Note 2: N'oubliez jamais / etc / hostname dans /boot/initrams-FOO.img ...

David Tonhofer
la source
4
Désolé si cela devrait être évident, mais qu'est-ce que tout cela a à voir avec la définition du nom d'hôte?
Chris S
En résumé, les notes que j'ai prises lors de la recherche de définition du nom d'hôte sur mes instances de Fedora 19 EC2. En ce qui concerne le résultat: 1) Définissez le FQHN dans / etc / hostname 2) Ne touchez pas à / etc / hosts 3) Vous pouvez définir le 'nom d’hôte du noyau' sur le FQHN ou le nom d’hôte non qualifié, si non défini, la valeur est prise à partir de / etc / hostname 4) Vous pouvez définir le 'nom de domaine du noyau' sur le nom de domaine, ce qui est plus agréable que simplement '(aucun)'.
David Tonhofer
-4

Les options / etc / hosts fonctionnent bien.

Mais vous voulez vous assurer que tous les fichiers appropriés sont mis à jour, lancez l' outil d' installation

Riaan
la source
Ma distribution n'a pas d'outil de "configuration"; quelle distribution utilisez-vous qui en a une?
Nickgrim
tout système d'exploitation basé sur redhat utilise-t-il l'outil de configuration rhel / centos / fedora whar OS?
Riaan
3
Puisque la question parle de différences entre les distributions basées sur RHEL et celles basées sur Debian, nous devons supposer que le demandeur utilise les deux. Il n'y a pas d'outil de «configuration» sur les distributions basées sur Debian.
Martijn Heemels
-4

Hm ... Dans les hôtes Linux, si vous souhaitez modifier le nom d'hôte et le nom de domaine complet, vous devez résoudre 3 étapes (par exemple, le nouvel hôte est rizzo.ifp.com ):

Étape 1: Modifiez la valeur de l’hôte dans la configuration des propriétés du réseau:

sudo vi /etc/sysconfig/network

Changer ou ajouter une chaîne:

HOSTNAME=rizzo.ifp.com

Étape n ° 2: modifiez la configuration de votre hôte

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

Étape # 3 Redémarrez votre hôte Bien joué, vérifiez la nouvelle configuration

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
sous
la source
-4

La commande n'est pas correcte. Ce doit être:

1.2.3.4 full.example.com full

Ainsi, l'exemple pourrait ressembler à ceci:

[External IP] rizzo.example.com rizzo 
Christian Azuero
la source
4
Cette question a déjà des réponses vraiment de qualité. Cela n'ajoute rien de nouveau.
Esa Jokinen