15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
23.10.2024

Como Atribuir um Hostname Estático a uma Máquina Linux

Um hostname estático é um rótulo legível por humanos, configurado de forma permanente e atribuído a um sistema Linux, que persiste após reinicializações e não é substituído por serviços de rede como o DHCP. Ao contrário de um hostname transitório — que pode ser definido dinamicamente pelo daemon de rede e redefinido na próxima inicialização — um hostname estático é armazenado em disco e permanece autoritativo independentemente de como a máquina obtém o seu endereço IP.

Esta distinção é extremamente importante em ambientes de produção. Quando executa um VPS ou um servidor dedicado, um hostname estável é a âncora para entradas SSH known-hosts, Nomes Alternativos de Sujeito de certificados TLS, identificadores syslog, etiquetas de destino Prometheus e nomes principais Kerberos. Um hostname que muda silenciosamente após uma renovação DHCP pode quebrar todos estes simultaneamente.

O Que É Exatamente um Hostname Linux?

O Linux rastreia três classes distintas de hostname, cada uma servindo um propósito diferente:

Tipo de HostnameLocalização de ArmazenamentoÂmbitoSobrevive à Reinicialização
Estático/etc/hostnameIdentidade persistente do sistemaSim
TransitórioApenas em tempo de execução do kernelTemporário, definido por NTP/DHCPNão
Estético/etc/machine-infoNome de exibição UTF-8 (espaços permitidos)Sim

O hostname estático é o que configura intencionalmente. O hostname transitório é o que o kernel está a usar atualmente — normalmente idêntico ao estático, a menos que um servidor DHCP ou systemd-timesyncd o tenha substituído. O hostname estético é puramente cosmético (por exemplo, "Alex's Web Server") e nunca é usado em DNS ou SSH.

Os hostnames estáticos válidos seguem as regras RFC 1123: apenas letras minúsculas, dígitos e hífenes; sem sublinhados; sem hífenes no início ou no fim; máximo de 63 caracteres por rótulo; máximo de 253 caracteres no total para um nome de domínio totalmente qualificado (FQDN).

Verificar o Hostname Atual

Antes de fazer quaisquer alterações, audite o estado atual dos três tipos de hostname:

hostnamectl

Exemplo de saída num sistema baseado em systemd:

 Static hostname: old-server-name
 Pretty hostname: Old Server Name
Transient hostname: dhcp-assigned-name
       Icon name: computer-server
         Chassis: server
      Machine ID: a1b2c3d4e5f6...
         Boot ID: 9f8e7d6c5b4a...
Operating System: Ubuntu 22.04.3 LTS
          Kernel: Linux 5.15.0-91-generic
    Architecture: x86-64

Se o Hostname Transitório diferir do Hostname Estático, o seu cliente DHCP está a substituir o valor estático — um problema abordado na secção de persistência abaixo.

Para sistemas sem hostnamectl, utilize:

hostname
cat /etc/hostname
uname -n

Método 1: Utilizar hostnamectl (Distribuições Baseadas em systemd)

Este método aplica-se ao Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux e qualquer distribuição que execute systemd como PID 1.

Passo 1: Definir o Hostname Estático

sudo hostnamectl set-hostname new-static-hostname

hostnamectl escreve o valor em /etc/hostname, chama a syscall sethostname(2) para atualizar o kernel em execução imediatamente e notifica systemd-hostnamed — tudo atomicamente. Não é necessária reinicialização.

Para definir os três tipos de hostname simultaneamente:

sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transient

Passo 2: Verificar a Alteração

hostnamectl

Confirme que o campo Hostname Estático mostra o seu novo valor. Verifique também se o kernel o reconheceu:

hostname

Passo 3: Atualizar /etc/hosts

hostnamectl não atualiza /etc/hosts automaticamente. Não atualizar este ficheiro faz com que sudo emita o aviso unable to resolve host, quebra aplicações que chamam gethostbyname() no hostname local e pode fazer com que serviços baseados em Java (Elasticsearch, Kafka) falhem no arranque.

sudo nano /etc/hosts

O ficheiro deve conter no mínimo:

127.0.0.1   localhost
127.0.1.1   new-static-hostname.yourdomain.com  new-static-hostname

A segunda linha usa 127.0.1.1 (não 127.0.0.1) para o próprio hostname da máquina em sistemas da família Debian. Em sistemas da família RHEL, use o endereço IP primário real em vez disso:

192.168.1.50  new-static-hostname.yourdomain.com  new-static-hostname

Se estiver a gerir um VPS com cPanel, a ferramenta de alteração de hostname do cPanel trata de /etc/hosts automaticamente, mas deve verificar o resultado manualmente na mesma.

Método 2: Editar Manualmente /etc/hostname (Distribuições Sem systemd)

Este método aplica-se a versões mais antigas do Debian/Ubuntu que usam SysVinit ou Upstart, Alpine Linux, Gentoo com OpenRC, Void Linux e sistemas embebidos.

Passo 1: Editar /etc/hostname

sudo nano /etc/hostname

O ficheiro deve conter exatamente uma linha — o hostname curto sem espaços em branco finais ou nova linha além do terminador de linha padrão:

new-static-hostname

Passo 2: Atualizar /etc/hosts

sudo nano /etc/hosts

Aplique o mesmo mapeamento descrito no Método 1.

Passo 3: Aplicar a Alteração Sem Reinicializar

Notifique o kernel em execução do novo hostname imediatamente:

sudo hostname new-static-hostname

Em sistemas com systemd-hostnamed disponível mesmo sem adoção completa do systemd:

sudo systemctl restart systemd-hostnamed

Em sistemas SysVinit puros, o comando hostname acima é suficiente. A alteração entra em vigor para todos os novos processos; as shells existentes ainda mostrarão o prompt antigo até abrir uma nova sessão de terminal ou executar:

exec bash

Método 3: Substituição do Cloud-Init (Crítico para Instâncias VPS na Nuvem)

Este é o cenário mais frequentemente ignorado. Em plataformas de nuvem — incluindo a maioria dos fornecedores de VPS — o cloud-init é executado em cada inicialização e redefine o hostname para o que a API de metadados da instância retorna. A sua alteração em /etc/hostname será silenciosamente substituída na próxima reinicialização.

Para que um hostname estático sobreviva ao cloud-init, edite /etc/cloud/cloud.cfg:

sudo nano /etc/cloud/cloud.cfg

Encontre ou adicione a seguinte diretiva:

preserve_hostname: true

Em alternativa, crie um ficheiro de substituição drop-in para evitar modificar a configuração gerida pelo pacote:

sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOF

Após esta alteração, o cloud-init deixará de tocar no hostname nas inicializações subsequentes.

Impedir que o DHCP Substitua o Hostname Estático

Mesmo sem o cloud-init, um cliente DHCP pode substituir o hostname transitório. A correção depende do cliente DHCP que a sua distribuição utiliza.

Para dhclient (legado Debian/Ubuntu)

Edite /etc/dhcp/dhclient.conf:

sudo nano /etc/dhcp/dhclient.conf

Adicione ou modifique:

send host-name "new-static-hostname";
supersede host-name "new-static-hostname";

A diretiva supersede garante que o cliente ignora qualquer hostname oferecido pelo servidor DHCP.

Para systemd-networkd com systemd-resolved

Edite ou crie um ficheiro .network em /etc/systemd/network/:

[DHCP]
SendHostname=yes
UseHostname=no

UseHostname=no impede que o hostname oferecido pelo DHCP substitua o estático.

Para NetworkManager (a maioria das distribuições de desktop e servidores modernos)

sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yes

Para impedir que o NetworkManager aceite um hostname do DHCP completamente, adicione a /etc/NetworkManager/NetworkManager.conf:

[main]
hostname-mode=none

Propagação do Hostname: O Que Mais Precisa de Saber

Definir o hostname no sistema operativo é necessário, mas não suficiente num ambiente em rede. Considere estes sistemas a jusante:

  • Registos DNS diretos e inversos: Atualize o registo A e o registo PTR da sua zona DNS. Sem um registo PTR correspondente, muitos servidores de correio rejeitarão o email de saída e algumas ferramentas de segurança sinalizarão o host como suspeito.
  • Certificados SSL/TLS: Se o seu hostname fizer parte do CN ou SAN de um certificado, precisa de um novo certificado. Os certificados SSL associados ao hostname antigo produzirão erros de validação.
  • Registo de domínio e propagação DNS: Se o hostname mapear para um FQDN público, atualize o registo DNS no seu registador de domínio e aguarde o tempo de propagação baseado em TTL.
  • Agentes de monitorização: O exportador de nós Prometheus, Datadog, Zabbix e agentes similares usam o hostname como etiqueta. Após uma alteração de hostname, as métricas históricas podem aparecer sob uma identidade de host diferente.
  • /etc/ssh/ssh_known_hosts: Os ficheiros known-hosts de todo o cluster que referenciam o hostname antigo devem ser atualizados.
  • Ficheiros de configuração de aplicações: Qualquer hostname codificado em configurações de aplicações, strings de ligação JDBC ou listeners anunciados de brokers de mensagens deve ser atualizado.

Comparação: Métodos de Configuração de Hostname

MétodoCompatibilidade de DistribuiçãoRequer ReinicializaçãoTrata Cloud-InitAtualização Atómica
hostnamectl set-hostnameDistribuições systemdNãoNão (necessita de preserve_hostname)Sim
Editar /etc/hostname manualmenteTodas as distribuiçõesNão (com cmd hostname)NãoNão
Cloud-init preserve_hostnameInstâncias na nuvemNãoSimN/A
Configuração do cliente DHCP (supersede)Todas as distribuiçõesNãoNãoNão
NetworkManager nmcliSistemas geridos por NMNãoNãoSim

Casos Extremos e Armadilhas do Mundo Real

Armadilha 1: O ciclo de aviso sudo. Se definir o hostname mas se esquecer de atualizar /etc/hosts, cada invocação de sudo imprimirá sudo: unable to resolve host new-static-hostname. Isto não é fatal, mas adiciona latência a cada comando privilegiado e inunda os registos.

Armadilha 2: Os serviços Java recusam-se a iniciar. O InetAddress.getLocalHost() do Java resolve o hostname via gethostbyname(). Se o hostname não estiver em /etc/hosts ou não for resolvível via DNS, serviços como Elasticsearch, Kafka e Cassandra lançam UnknownHostException no arranque.

Armadilha 3: Hostname com sublinhados. Apesar de serem amplamente usados informalmente, os sublinhados em hostnames violam o RFC 952 e o RFC 1123. Alguns resolvedores DNS, bibliotecas TLS e componentes Kubernetes irão rejeitá-los ou tratá-los incorretamente. Use sempre hífenes.

Armadilha 4: FQDN vs. hostname curto. hostnamectl armazena apenas o hostname curto (por exemplo, web01). O FQDN (por exemplo, web01.example.com) é resolvido combinando o hostname curto com a lista de pesquisa de domínio em /etc/resolv.conf ou /etc/systemd/resolved.conf. Defina Domains=example.com em resolved.conf ou search example.com em resolv.conf para que hostname --fqdn retorne o valor correto.

Armadilha 5: Isolamento de contentores e namespaces. Dentro de um contentor Docker ou namespace LXC, hostnamectl pode falhar com Failed to connect to bus: No such file or directory porque systemd-hostnamed não está em execução. Use hostname new-name diretamente, ou defina o hostname no momento da criação do contentor via docker run --hostname ou a chave hostname: em docker-compose.yml.

Lista de Verificação Prática para Decisões

Use esta lista de verificação antes e depois de cada alteração de hostname num ambiente de produção:

  • Confirme que o novo hostname está em conformidade com o RFC 1123 (minúsculas, apenas hífenes, máximo 63 caracteres por rótulo)
  • Execute hostnamectl antes da alteração e guarde a saída para fins de auditoria
  • Defina o hostname estático com hostnamectl set-hostname ou editando /etc/hostname
  • Atualize /etc/hosts com o hostname curto e o FQDN na mesma linha
  • Se o sistema for uma instância na nuvem, defina preserve_hostname: true na configuração do cloud-init
  • Se o DHCP estiver ativo, configure o cliente DHCP para ignorar os hostnames oferecidos pelo servidor
  • Atualize os registos DNS A e PTR
  • Renove ou reemita quaisquer certificados TLS que referenciem o hostname antigo
  • Reinicie os serviços dependentes do hostname (syslog, agentes de monitorização, aplicações Java)
  • Abra uma nova sessão de shell e verifique se hostname, hostname --fqdn e hostnamectl retornam valores consistentes
  • Verifique /var/log/syslog ou journalctl -b para quaisquer erros pós-alteração que referenciem o hostname antigo

FAQ

O hostnamectl set-hostname requer uma reinicialização para entrar em vigor?

Não. O hostnamectl chama a chamada de sistema sethostname(2) imediatamente, atualizando o kernel em execução em tempo real. A alteração também é escrita em /etc/hostname para persistência. Os novos processos e as novas sessões de shell verão o hostname atualizado sem qualquer reinicialização.

Por que o meu hostname reverte após cada reinicialização num VPS na nuvem?

O cloud-init está quase certamente a substituí-lo. Adicione preserve_hostname: true a /etc/cloud/cloud.cfg ou crie um ficheiro drop-in em /etc/cloud/cloud.cfg.d/99_hostname.cfg com a mesma diretiva. Esta é a causa mais comum de reversão de hostname em máquinas alojadas na nuvem.

Qual é a diferença entre 127.0.0.1 e 127.0.1.1 em /etc/hosts?

127.0.0.1 é o endereço de loopback padrão mapeado para localhost. As distribuições da família Debian usam 127.0.1.1 como endereço de loopback secundário especificamente para o próprio hostname da máquina, evitando conflitos quando a máquina não tem IP estático. Em sistemas da família RHEL e máquinas com IP fixo, use o endereço IP primário real para o mapeamento do hostname.

Posso usar um sublinhado num hostname Linux?

Tecnicamente o sistema operativo aceitará, mas não deve fazê-lo. Os sublinhados violam o RFC 952 e o RFC 1123. Causam falhas na resolução DNS (o BIND rejeita-os por padrão), na validação de certificados TLS e na nomenclatura de nós Kubernetes. Use exclusivamente hífenes.

Como verifico se o hostname é totalmente consistente em todas as camadas do sistema?

Execute a seguinte sequência e confirme que todas as saídas correspondem:

hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"

Se algum destes retornar valores diferentes, uma das camadas — cloud-init, cliente DHCP ou NetworkManager — ainda está a substituir a configuração estática.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar