Configuración del nombre de host: FQDN o nombre corto

178

Me di cuenta de que el método "preferido" para configurar el nombre de host del sistema es fundamentalmente diferente entre los sistemas Red Hat / CentOS y Debian / Ubuntu.

La documentación de CentOS y la guía de implementación de RHEL dicen que el nombre de host debe ser el FQDN :

HOSTNAME=<value>, donde <value>debe estar el Nombre de dominio completo (FQDN), como hostname.example.com, pero puede ser el nombre de host que sea necesario.

La guía de instalación de RHEL es un poco más ambigua:

El programa de instalación le solicita que proporcione un nombre de host para esta computadora, ya sea como un nombre de dominio completo (FQDN) en el formato hostname.domainname o como un nombre de host corto en el formato hostname .

La referencia de Debian dice que el nombre de host no debe usar el FQDN :

3.5.5. El nombre de host

El núcleo mantiene el nombre de host del sistema . El guión de inicio en el nivel de ejecución S, que está vinculado a " /etc/init.d/hostname.sh ", establece el nombre de host del sistema en el momento del arranque (utilizando el comando hostname ) al nombre almacenado en " / etc / hostname ". Este archivo debe contener solo el nombre de host del sistema, no un nombre de dominio completo.

No he visto ninguna recomendación específica de IBM sobre cuál usar, pero algunos programas parecen tener preferencia.

Mis preguntas:

  • En un entorno heterogéneo, ¿es mejor usar la recomendación del proveedor o elegir una y ser coherente en todos los hosts?
  • ¿Qué software ha encontrado que sea sensible a si el nombre de host está configurado como FQDN o nombre corto?
Cakemox
fuente

Respuestas:

106

Elegiría un enfoque consistente en todo el entorno. Ambas soluciones funcionan bien y seguirán siendo compatibles con la mayoría de las aplicaciones. Sin embargo, hay una diferencia en la capacidad de administración.

Voy con el nombre corto como la configuración HOSTNAME y configuro el FQDN como la primera columna /etc/hostspara la IP del servidor, seguido del nombre corto.

No he encontrado muchos paquetes de software que impongan o muestren una preferencia entre los dos. Encuentro que el nombre corto es más limpio para algunas aplicaciones, específicamente el registro. Tal vez he tenido mala suerte al ver dominios internos como server.northside.chicago.rizzomanufacturing.com. ¿Quién quiere ver eso en los registros o en un indicador de shell ?

A veces, participo en adquisiciones o reestructuraciones de empresas en las que cambian los dominios y / o subdominios internos. Me gusta usar el nombre de host corto en estos casos porque el registro, los inicios, la impresión, el monitoreo de sistemas, etc. no necesitan una reconfiguración completa para dar cuenta de los nuevos nombres de dominio.

Una configuración típica de servidor RHEL / CentOS para un servidor llamado "rizzo" con el dominio interno "ifp.com" se vería así:

/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
fuente
77
Al igual que usted, prefiero el nombre corto, sin embargo, descubrí recientemente que algunas aplicaciones de Oracle requieren que el resultado hostnamesea ​​el FQDN. Solo tenerlo no /etc/hostses lo suficientemente bueno. Eso interfirió con mi consistencia.
James O'Gorman
3
La diferencia en la capitalización de los nombres de host en este ejemplo seguramente no es una mejor práctica ref: tools.ietf.org/search/rfc1178
teknopaul
2
No debe /etc/sysconfig/networkcontener líneas como: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes
@JasmineLognnes Correcto, lo he corregido. Espero que a ewwhite no le importe.
kubanczyk
1
No se trata solo de preferencia. Ver hostname(1)en cualquier máquina Linux.
39

Casi todo el software es sensible a la configuración correcta del nombre de host. Mientras trabajaba en Digg, una vez derribé todo el sitio durante 2 horas debido a un cambio aparentemente inocente /etc/hostsque afectó la noción de nombre de host del sistema. Camina ligeramente. Dicho esto, puede estar un poco confundido aquí. No creo que la HOSTNAME=configuración sea directamente equivalente a cómo usan las distribuciones basadas en Debian /etc/hostname.

Lo que funciona para mí en un entorno heterogéneo es:

  1. Establezca el nombre de host de la manera recomendada por el proveedor, utilizando un condicional en su software de administración de configuración.
  2. Use el hostnamecomando para establecer el nombre de host utilizado por el núcleo, etc.
  3. En /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Esta configuración aún no me ha fallado.

Paul Lathrop
fuente
Esta es más o menos la configuración que uso en el trabajo. El nombre corto debe estar bien siempre y cuando el nombre de dominio se encuentra en la ruta de búsqueda de ADN (/etc/resolv.conf) para las máquinas relevantes en su entorno
gWaldo
¿Recomiendas específicamente una IP de red local en lugar de una pública?
code_monk
34

Ciertamente no tendrá problemas para encontrar referencias en línea que le dirán que definitivamente lo haga de una forma u otra. Sin embargo, me parece que tener un nombre corto como nombre de host y tener el nombre completo en / etc / hosts es ciertamente mucho más frecuente. Parece la forma más sensata, ya que los servicios que necesitan un nombre completo pueden adaptarse para llamar en su hostname --fqdnlugar.

Recientemente me he encontrado con una pieza de software que requiere rígidamente que se devuelva un fqdn hostname, que era ganeti. Documentan esto aquí . hostname --fqdnSin embargo, no veo ninguna razón a la que no puedan adaptarse .

estofado
fuente
"No veo ninguna razón a la que no puedan adaptarse hostname --fqdn" se responde en el primer párrafo bajo "Por qué un nombre de host completamente calificado": requiere conjeturas y requiere un solucionador que funcione. Preguntar al kernel es la opción más segura y confiable.
womble
3
@womble: siempre que el archivo / etc / hosts tenga una entrada para la máquina ( 10.0.0.1 hostname.example.com hostname) y /etc/nsswitch.conf especifique la resolución local antes de DNS ( hosts: files dns), el archivo de hosts locales cumplimentará con una resolución funcional. Como tal, el argumento para usar un FQDN en lugar de un nombre de host raramente aguanta. Además, otro ejemplo de software que requiere rígidamente hostnamedevolver un FQDN es el paquete del servidor de correo Zimbra.
crashmaxed
@crashmaxed: Eso es varios requisitos adicionales, cualquiera de los cuales podría no ser posible en un entorno determinado o fallar por error. Tener el FQDN en las estructuras de datos del kernel es mucho más simple.
womble
11

De manera algo tangencial, mientras investigaba esta pregunta, me he vuelto lo suficientemente loco como para verificar el código fuente del "nombre de host" y escribir un script para imprimir resultados de investigación (Fedora 19). Lo que falta es un vistazo a "/ etc / hosts", que en mi humilde opinión debería mantenerse al margen de todo esto en primer lugar.

#!/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 salida en una máquina virtual Amazon EC2 que ejecuta Fedora 19 , después de configurar manualmente los valores del núcleo y el llenado /etc/hostname, pero sin cambios, /etc/hostspodría ser así:

== 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 forma resistente de obtener el nombre de host totalmente calificado en perl sería:

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

y en bash sería:

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
}

Notas

Nota 1: HOSTNAME es una variable de shell que proporciona bash ("Establecer automáticamente el nombre del host actual"), pero no hay indicios de que bash llegue a ese valor.

Nota 2: nunca olvide / etc / hostname en /boot/initrams-FOO.img ...

David Tonhofer
fuente
44
Lo siento si esto debería ser obvio, pero ¿qué tiene que ver esto con la configuración del nombre de host?
Chris S
Básicamente, las notas que hice mientras investigaba la configuración del nombre de host en mis instancias Fedora 19 EC2. En cuanto al resultado: 1) Establezca el FQHN en / etc / hostname 2) No toque / etc / hosts 3) Puede establecer el 'nombre de host del núcleo' en el FQHN o el nombre de host no calificado, si no se establece, el valor se toma de / etc / hostname 4) Puede establecer el 'nombre de dominio del núcleo' en el nombre de dominio, que es mejor que solo '(ninguno)'.
David Tonhofer
-4

Las opciones / etc / hosts funcionan bien.

Pero desea asegurarse de que todos los archivos correctos estén actualizados ejecute la herramienta de configuración

Riaan
fuente
Mi distribución no tiene una herramienta de "configuración"; ¿Qué distribución estás usando que tiene una?
nickgrim
¿algún sistema operativo basado en redhat tiene la herramienta de configuración rhel / centos / fedora whar OS que está utilizando?
Riaan
3
Como la pregunta habla sobre las diferencias entre las distribuciones basadas en RHEL y Debian, debemos asumir que el autor de la pregunta usa ambas. No existe una herramienta de 'configuración' en las distribuciones basadas en Debian.
Martijn Heemels
-4

Hm ... En los hosts de Linux, si desea cambiar HOSTNAME y FQDN, debe resolver 3 pasos (por ejemplo, el nuevo host es rizzo.ifp.com ):

Paso # 1 Cambie el valor de HOST en la configuración de propiedades de RED:

sudo vi /etc/sysconfig/network

Cambiar o agregar cadena:

HOSTNAME=rizzo.ifp.com

Paso # 2 Edite su configuración de hosts

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

Paso # 3 Reinicie su host Bien hecho, solo verifique la nueva configuración

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

El orden no es correcto. Tiene que ser:

1.2.3.4 full.example.com full

Entonces el ejemplo podría ser así:

[External IP] rizzo.example.com rizzo 
Christian Azuero
fuente
44
Esta pregunta ya tiene respuestas realmente de calidad. Esto no agrega nada nuevo.
Esa Jokinen