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


Me he dado 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.

Documentación de centos y el Guía de despliegue de RHEL decir el nombre de host debe ser el FQDN:

HOSTNAME=<value>, dónde <value> debe ser el dominio totalmente calificado   Nombre (FQDN), como hostname.example.com, pero puede ser lo que sea   el nombre de host es necesario

los Guía de instalación de RHEL Es un poco más ambiguo:

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

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

3.5.5. El nombre de host

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

No he visto ninguna recomendación específica de IBM sobre cuál usar, pero algún software Parece tener una 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 es sensible a si el nombre de host está configurado como FQDN o nombre corto?

164
2017-11-17 13:07


origen




Respuestas:


Elegiría un enfoque coherente 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 manejabilidad.

Voy con el nombre corto como la configuración de HOSTNAME, y establezco el FQDN como la primera columna en /etc/hosts para la IP del servidor, seguido del nombre corto.

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

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

Una configuración típica del servidor RHEL / CentOS para un servidor llamado "rizzo" con 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'

96
2017-11-17 13:20



Al igual que usted, prefiero el nombre corto, sin embargo, recientemente descubrí que algunas aplicaciones de Oracle requieren la salida de hostname para ser el FQDN. Solo tenerlo en /etc/hosts no es lo suficientemente bueno Eso arruinó mi consistencia. - James O'Gorman
La diferencia en el uso de mayúsculas en los nombres de host en este ejemplo seguramente no es una buena práctica ref: tools.ietf.org/search/rfc1178 - teknopaul
No debería /etc/sysconfig/network contienen lineas 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
No se trata solo de preferencia. Ver hostname(1) En cualquier máquina Linux.


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

Lo que me funciona en un entorno heterogéneo es:

  1. Configure el nombre de host de la manera recomendada por el proveedor, usando un condicional en su software de administración de configuración.
  2. Utilizar el hostname comando para configurar el nombre de host usado por el kernel, etc.
  3. En /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Esta configuración no me ha fallado todavía.


36
2017-11-21 18:48



Esta es la configuración que uso en el trabajo. El nombre corto debe estar bien siempre que el nombre de dominio esté en la ruta de búsqueda de ADN (/etc/resolv.conf) para las máquinas relevantes en su entorno - gWaldo
¿Recomiendas específicamente una red IP local en lugar de una pública? - code_monk


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

Solo he encontrado una pieza de software recientemente que requiere de manera rígida que se devuelva un fqdn hostname, que fue ganeti. Documentan esto aquí. No veo ninguna razón por la que no puedan adaptarse. hostname --fqdn, sin embargo.


29
2017-12-15 14:45



Bonificación por dar un ejemplo! Gracias. - Cakemox
"No veo ninguna razón por la que no puedan adaptarse hostname --fqdnse responde en el primer párrafo bajo "Por qué un nombre de host completo": requiere conjeturas y requiere un resolutor que funcione. Preguntar el kernel es la opción más segura y confiable. - womble♦
@womble - Mientras el archivo / etc / hosts tenga una entrada para la máquina (10.0.0.1 hostname.example.com hostname) y /etc/nsswitch.conf especifica la resolución local antes de DNS (hosts: files dns) entonces el archivo local de hosts cumple con un resolutor que funciona. Como tal, el argumento para usar un FQDN en lugar de un nombre de host rara vez retiene el agua. Además, otro ejemplo de software que requiere rígidamente hostname Para devolver un FQDN es el paquete del servidor de correo Zimbra. - crashmaxed
@crashmaxed: Son varios requisitos adicionales, cualquiera de los cuales podría no ser posible en un entorno determinado o podría haberse equivocado por error. Tener el FQDN en las estructuras de datos del kernel es mucho más simple. - womble♦


Algo tangencialmente, mientras investigaba esta pregunta, me he estado volviendo lo suficientemente loco como para verificar el código fuente de "hostname" y escribir un script para imprimir los 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 ejecutando Fedora 19, después de configurar manualmente los valores del kernel y rellenar /etc/hostname, pero sin cambios a /etc/hosts entonces podrí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 resiliente de obtener el nombre de host completo 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 ninguna indicación de que bash llegue a ese valor.

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


10
2017-10-03 11:39



Disculpe 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 tomé al investigar la configuración del nombre de host en mis instancias de Fedora 19 EC2. En cuanto al resultado: 1) Establezca FQHN en / etc / hostname 2) No toque / etc / hosts 3) Puede configurar 'kernel hostname' en FQHN o en el nombre de host no calificado, si no se ha seleccionado el valor, / etc / nombre de host 4) Puede establecer el 'nombre de dominio del kernel' al nombre de dominio, que es mejor que solo '(ninguno)'. - David Tonhofer


Las opciones / etc / hosts funcionan bien.

Pero desea asegurarse de que todos los archivos correctos estén actualizados, ejecute el preparar herramienta


-4
2017-11-25 11:56



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


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 añadir cadena:

HOSTNAME=rizzo.ifp.com

Paso 2 Edita la configuración de tu host

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

Paso 3 Reinicia tu host Bien hecho, solo verifica la nueva configuración

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

-4
2017-12-22 10:56





El orden no es correcto. Tiene que ser:

1.2.3.4 full.example.com full

Entonces el ejemplo podría gustar esto:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



Esta pregunta ya tiene respuestas realmente de calidad. Esto no añade nada nuevo. - Esa Jokinen