Definindo o nome do host: FQDN ou nome abreviado?

178

Percebi que o método "preferido" de definir o nome do host do sistema é fundamentalmente diferente entre os sistemas Red Hat / CentOS e Debian / Ubuntu.

A documentação do CentOS e o guia de implantação do RHEL dizem que o nome do host deve ser o FQDN :

HOSTNAME=<value>, onde <value>deve estar o FQDN (nome de domínio totalmente qualificado), como hostname.example.com, mas pode ser o nome de host necessário.

O guia de instalação do RHEL é um pouco mais ambíguo:

A Instalação solicita que você forneça um nome de host para este computador, como um nome de domínio totalmente qualificado (FQDN) no formato hostname.domainname ou como um nome de host curto no formato hostname .

A referência Debian diz que o nome do host não deve usar o FQDN :

3.5.5 O nome do host

O kernel mantém o nome do host do sistema . O script init no nível de execução S, com o link simbólico para " /etc/init.d/hostname.sh " define o nome do host do sistema no momento da inicialização (usando o comando hostname ) como o nome armazenado em " / etc / hostname ". Este arquivo deve conter apenas o nome do host do sistema, não um nome de domínio totalmente qualificado.

Não vi nenhuma recomendação específica da IBM sobre qual usar, mas alguns softwares parecem ter uma preferência.

Minhas perguntas:

  • Em um ambiente heterogêneo, é melhor usar a recomendação do fornecedor ou escolher uma e ser consistente em todos os hosts?
  • Qual software você encontrou que é sensível a saber se o nome do host está definido como o FQDN ou o nome abreviado?
Cakemox
fonte

Respostas:

106

Eu escolheria uma abordagem consistente em todo o ambiente. Ambas as soluções funcionam bem e permanecerão compatíveis com a maioria dos aplicativos. Há uma diferença na capacidade de gerenciamento, no entanto.

Eu escolho o nome abreviado como a configuração HOSTNAME e defino o FQDN como a primeira coluna /etc/hostsdo IP do servidor, seguida pelo nome abreviado.

Eu não encontrei muitos pacotes de software que impõem ou exibem uma preferência entre os dois. Acho que o nome abreviado é mais limpo para alguns aplicativos, especificamente o log. Talvez eu tenha tido azar de ver domínios internos como server.northside.chicago.rizzomanufacturing.com. Quem quer ver isso nos logs ou em um prompt de shell ?

Às vezes, estou envolvido em aquisições ou reestruturações de empresas em que domínios e / ou subdomínios internos mudam. Eu gosto de usar o nome abreviado do host nesses casos porque o registro, kickstarts, impressão, monitoramento de sistemas etc. não precisam de reconfiguração completa para dar conta dos novos nomes de domínio.

Uma configuração típica do servidor RHEL / CentOS para um servidor chamado "rizzo" com domínio interno "ifp.com" seria semelhante 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'
ewwhite
fonte
7
Como você, prefiro o nome abreviado, mas descobri recentemente que alguns aplicativos Oracle exigem que a saída hostnameseja o FQDN. Apenas tê-lo /etc/hostsnão é bom o suficiente. Isso mexeu com a minha consistência.
James O'Gorman
3
A diferença de capitalização dos nomes de host neste exemplo não é certamente uma das melhores práticas ref: tools.ietf.org/search/rfc1178
teknopaul
2
Não deve /etc/sysconfig/networkconter linhas semelhantes: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes
@JasmineLognnes Certo, eu corrigi. Espero que ewwhite não se importe.
kubanczyk
1
Não se trata apenas de preferência. Veja hostname(1)em qualquer máquina Linux.
39

Praticamente todo software é sensível à configuração correta do nome do host. Enquanto trabalhava no Digg, uma vez reduzi o site inteiro por 2 horas devido a uma mudança aparentemente inocente /etc/hostsque afetou a noção de nome de host do sistema. Pise levemente. Dito isto, você pode estar um pouco confuso aqui. Eu não acho que a HOSTNAME=configuração seja diretamente equivalente a como as distribuições baseadas no Debian usam /etc/hostname.

O que funciona para mim em um ambiente heterogêneo é:

  1. Defina o nome do host da maneira recomendada pelo fornecedor, usando uma condicional no seu software de gerenciamento de configuração.
  2. Use o hostnamecomando para definir o nome do host usado pelo kernel, etc.
  3. Em /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Essa configuração ainda não falhou comigo.

Paul Lathrop
fonte
Essa é basicamente a configuração que uso no trabalho. O nome abreviado deve ser bom, desde que o nome de domínio está no caminho de pesquisa de DNA (/etc/resolv.conf) para as máquinas relevantes em seu ambiente
gWaldo
você recomenda especificamente um IP de rede local em oposição a um IP público?
code_monk
34

Você certamente não terá problemas para encontrar referências on-line, o que lhe dirá para fazê-lo definitivamente de uma maneira ou de outra. Parece-me, no entanto, que ter um nome abreviado como o nome do host e ter o nome completo em / etc / hosts é certamente muito mais prevalente. Parece a maneira mais sensata, pois os serviços que precisam de um nome totalmente qualificado podem ser adaptados para serem chamados hostname --fqdn.

Recentemente, encontrei apenas um software recentemente que exige rigidamente a devolução de um fqdn hostname, que era ganeti. Eles documentam isso aqui . Não vejo nenhuma razão pela qual eles não possam se adaptar hostname --fqdn.

ensopado
fonte
"Não vejo nenhum motivo para o qual eles não possam se adaptar hostname --fqdn" é respondido no primeiro parágrafo em "Por que um nome completo de host" - requer adivinhação e requer um resolvedor funcional. Pedir o kernel é a opção mais segura e confiável.
womble
3
@womble - Contanto que o arquivo / etc / hosts tenha uma entrada para a máquina ( 10.0.0.1 hostname.example.com hostname) e /etc/nsswitch.conf especifique a resolução local antes do DNS ( hosts: files dns), a resolução de um trabalho é realizada pelo arquivo hosts local. Como tal, esse argumento para usar um FQDN em vez de um nome de host raramente retém água. Além disso, outro exemplo de software que exige rigidamente o hostnameretorno de um FQDN é o pacote do servidor de correio Zimbra.
precisa saber é o seguinte
@crashmaxed: São vários requisitos extras, alguns dos quais podem não ser possíveis em um determinado ambiente ou estragados por engano. Ter o FQDN nas estruturas de dados do kernel é muito mais simples.
womble
11

De maneira um tanto tangencial, enquanto pesquisava essa pergunta, fiquei louco o suficiente para verificar o código fonte de "hostname" e escrever um script para imprimir resultados de investigação (Fedora 19). O que está faltando é uma olhada em "/ etc / hosts", que na minha humilde opinião deve ser mantida fora de tudo isso em primeiro 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"

A saída em uma VM Amazon EC2 executando o Fedora 19 , após definir manualmente os valores e o preenchimento do kernel /etc/hostname, mas sem alterações, /etc/hostspode ser assim:

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

A maneira resiliente de obter o nome completo do host em perl seria:

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 no bash seria:

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 é uma variável de shell que o bash fornece ("Definido automaticamente como o nome do host atual."), Mas não há nenhuma indicação sobre o bash chegar a esse valor.

Nota 2: Nunca esqueça / etc / hostname em /boot/initrams-FOO.img ...

David Tonhofer
fonte
4
Desculpe se isso deve ser óbvio, mas o que isso tem a ver com a configuração do nome do host?
Chris S
Basicamente, anotações que fiz enquanto pesquisava a configuração do nome do host nas minhas instâncias do Fedora 19 EC2. Quanto ao resultado: 1) Defina o FQHN em / etc / hostname 2) Não toque em / etc / hosts 3) Você pode definir o 'nome do host do kernel' como o FQHN ou o nome do host não qualificado, se o valor for desmarcado. / etc / hostname 4) Você pode definir o 'nome de domínio do kernel' como o nome de domínio, que é mais agradável do que apenas '(nenhum)'.
David Tonhofer
-4

As opções / etc / hosts funcionam bem.

Mas você deseja garantir que todos os arquivos adequados sejam atualizados, execute a ferramenta de configuração

Riaan
fonte
Minha distribuição não possui uma ferramenta de "configuração"; qual distribuição você está usando que possui uma?
nickgrim
qualquer sistema operacional baseado em redhat tem a ferramenta de instalação rhel / centos / fedora whar OS que você está usando?
Riaan
3
Como a pergunta fala sobre diferenças entre distros baseados em RHEL e baseados em Debian, devemos assumir que o solicitante usa ambos. Não existe ferramenta de 'configuração' nas distribuições baseadas no Debian.
Martijn Heemels
-4

Hm ... Nos hosts linux, se você deseja alterar HOSTNAME e FQDN, deve resolver 3 etapas (por exemplo, o novo host é rizzo.ifp.com ):

Etapa # 1 Altere o valor HOST na configuração de propriedades da REDE:

sudo vi /etc/sysconfig/network

Alterar ou adicionar sequência:

HOSTNAME=rizzo.ifp.com

Etapa # 2 Edite sua configuração de hosts

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

Etapa 3: Reinicie seu host Bem feito, basta verificar a nova configuração

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

O pedido não está certo. Tem que ser:

1.2.3.4 full.example.com full

Portanto, o exemplo pode ser assim:

[External IP] rizzo.example.com rizzo 
Christian Azuero
fonte
4
Esta pergunta já tem respostas de qualidade. Isso não adiciona nada de novo.
Esa Jokinen