{"id":143,"date":"2017-04-06T10:05:03","date_gmt":"2017-04-06T13:05:03","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/04\/sobre-o-arquivo-hosts\/"},"modified":"2026-09-08T02:28:46","modified_gmt":"2026-09-08T05:28:46","slug":"sobre-o-arquivo-hosts","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/sobre-o-arquivo-hosts\/","title":{"rendered":"Entendendo o arquivo \/etc\/hosts"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro escrevendo com um marcador no quadro que mapeia endere\u00e7os a nomes, com o atalho local mais curto que o caminho at\u00e9 o servidor DNS\" src=\"\/wp-content\/uploads\/2026\/09\/etc-hosts-v3.webp\" width=\"1052\" height=\"652\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> post de 2017, revisado. Uma corre\u00e7\u00e3o importante: o texto original sugeria dom\u00ednios <code>.dev<\/code> para desenvolvimento local. <strong>N\u00e3o use.<\/strong> O <code>.dev<\/code> virou um TLD real do Google e est\u00e1 na lista de <em>HSTS preload<\/em> \u2014 os navegadores for\u00e7am HTTPS nele, e o seu site local em HTTP simplesmente deixa de abrir. O certo hoje \u00e9 <code>.test<\/code> ou <code>.localhost<\/code>. A explica\u00e7\u00e3o est\u00e1 na se\u00e7\u00e3o sobre nomes.<\/div>\n<p>O <code>\/etc\/hosts<\/code> \u00e9 a lista de nomes que a sua m\u00e1quina resolve sozinha, sem perguntar a ningu\u00e9m. Uma linha ali tem preced\u00eancia sobre o DNS inteiro da internet \u2014 o que faz dele uma ferramenta \u00f3tima para desenvolvimento e testes, e uma armadilha das boas quando algu\u00e9m esquece uma linha l\u00e1 dentro.<\/p>\n<p><!-- more --><\/p>\n<h2>O formato<\/h2>\n<p>Cada linha mapeia um endere\u00e7o IP para um ou mais nomes. O <code>#<\/code> comenta:<\/p>\n<pre><code class=\"language-text\">endere\u00e7o_IP      nome_can\u00f4nico      [apelido...]\n<\/code><\/pre>\n<p>Um arquivo t\u00edpico:<\/p>\n<pre><code class=\"language-text\">127.0.0.1       localhost\n127.0.1.1       minha-maquina\n192.168.0.10    servidor.local     servidor\n\n# IPv6\n::1             localhost ip6-localhost ip6-loopback\n<\/code><\/pre>\n<p>O <code>127.0.0.1<\/code> \u00e9 o loopback: sua pr\u00f3pria m\u00e1quina. O <code>127.0.1.1<\/code>, que aparece no Debian e no Ubuntu, existe para o hostname da m\u00e1quina resolver mesmo sem rede configurada \u2014 n\u00e3o \u00e9 engano nem duplicata.<\/p>\n<p>Para ver o seu:<\/p>\n<pre><code class=\"language-bash\">cat \/etc\/hosts\n<\/code><\/pre>\n<p>E para editar, precisa de privil\u00e9gio, porque \u00e9 arquivo de sistema:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/hosts\n<\/code><\/pre>\n<h2>Como testar (e por que n\u00e3o com ping)<\/h2>\n<p>A ferramenta certa \u00e9 o <code>getent<\/code>, porque ele consulta exatamente a mesma cadeia de resolu\u00e7\u00e3o que os programas usam:<\/p>\n<pre><code class=\"language-bash\">getent hosts servidor.local\n# 192.168.0.10    servidor.local servidor\n<\/code><\/pre>\n<p>Aqui mora uma confus\u00e3o cl\u00e1ssica, com uma reviravolta moderna. Historicamente, <code>dig<\/code> e <code>nslookup<\/code> falam <strong>direto com o servidor DNS<\/strong> e ignoram o <code>\/etc\/hosts<\/code> \u2014 da\u00ed o conselho, repetido h\u00e1 anos, de que testar com <code>dig<\/code> n\u00e3o serve.<\/p>\n<p>S\u00f3 que nas distribui\u00e7\u00f5es com <strong>systemd-resolved<\/strong> (Ubuntu moderno, Fedora) o <code>dig<\/code> consulta o stub em <code>127.0.0.53<\/code>, e o resolved responde a partir do <code>\/etc\/hosts<\/code>. Ou seja: ali o <code>dig<\/code> <em>enxerga<\/em> o arquivo. Para ver o que o DNS externo realmente responde, aponte um servidor explicitamente:<\/p>\n<pre><code class=\"language-bash\">getent hosts site.exemplo         # o que a maquina resolve (le \/etc\/hosts)\ndig +short @8.8.8.8 site.exemplo  # o que o DNS externo responde\ncurl -I http:\/\/site.exemplo       # o teste de verdade, ponta a ponta\n<\/code><\/pre>\n<p>O <code>getent<\/code> continua sendo a resposta certa para &#8220;o que esta m\u00e1quina realmente resolve&#8221;, porque \u00e9 o \u00fanico que percorre a mesma cadeia que os programas usam.<\/p>\n<h2>Quem decide a ordem: o nsswitch.conf<\/h2>\n<p>O <code>\/etc\/hosts<\/code> ter prioridade sobre o DNS n\u00e3o \u00e9 lei da natureza \u2014 \u00e9 configura\u00e7\u00e3o, e ela vive em outro arquivo:<\/p>\n<pre><code class=\"language-bash\">grep hosts \/etc\/nsswitch.conf\n# algo como: hosts: files mdns4_minimal [NOTFOUND=return] dns mymachines\n<\/code><\/pre>\n<p>A linha exata varia: o Debian puro traz apenas <code>files dns<\/code>, e o Fedora traz <code>files myhostname resolve [!UNAVAIL=return] dns<\/code>. O que importa \u00e9 a posi\u00e7\u00e3o relativa.<\/p>\n<p>L\u00ea-se da esquerda para a direita. <code>files<\/code> \u00e9 o <code>\/etc\/hosts<\/code>, e por vir primeiro \u00e9 consultado antes do <code>dns<\/code>. Se algu\u00e9m inverter essa ordem, o arquivo perde a preced\u00eancia \u2014 \u00e9 o primeiro lugar para olhar quando uma entrada aparentemente correta \u00e9 ignorada.<\/p>\n<p>Nas distribui\u00e7\u00f5es que usam <strong>systemd-resolved<\/strong> (Ubuntu moderno, Fedora), o <code>\/etc\/resolv.conf<\/code> costuma apontar para <code>127.0.0.53<\/code> e o cache fica com o servi\u00e7o. Isso n\u00e3o muda a preced\u00eancia do <code>\/etc\/hosts<\/code>, que continua sendo consultado antes \u2014 mas muda o lugar de investigar o resto:<\/p>\n<pre><code class=\"language-bash\">resolvectl status              # quais servidores DNS estao em uso\nresolvectl query site.exemplo  # como o resolved resolve esse nome\nsudo resolvectl flush-caches   # limpar o cache do resolvedor\n<\/code><\/pre>\n<h2>Nomes para desenvolvimento local: use .test<\/h2>\n<p>Aqui est\u00e1 o erro mais comum, e a raz\u00e3o desta revis\u00e3o. Durante anos se usou <code>.dev<\/code> para projeto local:<\/p>\n<pre><code class=\"language-text\">127.0.0.1    meuapp.dev      # NAO FACA ISSO\n<\/code><\/pre>\n<p>A cronologia costuma ser contada errado, e ela importa. O <code>.dev<\/code> \u00e9 um TLD do Google desde <strong>2014<\/strong>, mas o que quebrou o uso local n\u00e3o foi a venda de dom\u00ednios: foi o <strong>HSTS preload<\/strong>. Em setembro de 2017 o TLD inteiro entrou na lista embutida do Chromium e, a partir do Chrome 63, em dezembro de 2017, qualquer endere\u00e7o <code>.dev<\/code> passou a ser for\u00e7ado para HTTPS antes mesmo de sair uma requisi\u00e7\u00e3o. O registro p\u00fablico s\u00f3 abriu em fevereiro de 2019 \u2014 ou seja, o <code>.dev<\/code> j\u00e1 estava invi\u00e1vel para desenvolvimento local mais de um ano antes de existir um \u00fanico site <code>.dev<\/code> no mundo.<\/p>\n<p>E n\u00e3o h\u00e1 contorno: a entrada cobre o TLD inteiro com <code>include_subdomains<\/code>, a lista vem embutida no Chrome, no Firefox e no Edge, e dom\u00ednio em HSTS preload tamb\u00e9m n\u00e3o oferece o bot\u00e3o de &#8220;prosseguir mesmo assim&#8221; na tela de erro de certificado. Seu servidor local em HTTP simplesmente nunca \u00e9 alcan\u00e7ado.<\/p>\n<p>Use os nomes que a <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc6761\">RFC 6761<\/a> reserva justamente para isso e que nunca ser\u00e3o vendidos como dom\u00ednio:<\/p>\n<pre><code class=\"language-text\">127.0.0.1    meuapp.test\n127.0.0.1    api.meuapp.test\n127.0.0.1    blog.meuapp.test\n<\/code><\/pre>\n<p>S\u00e3o reservados <code>.test<\/code>, <code>.example<\/code>, <code>.invalid<\/code> e <code>.localhost<\/code>. Para desenvolvimento, <code>.test<\/code> \u00e9 o indicado. E h\u00e1 um b\u00f4nus no <code>.localhost<\/code>: onde existe <strong>systemd-resolved<\/strong> ou o m\u00f3dulo <code>myhostname<\/code> no <code>nsswitch.conf<\/code>, qualquer <code>*.localhost<\/code> j\u00e1 vai para o loopback automaticamente \u2014 <code>meuapp.localhost<\/code> funciona sem editar arquivo nenhum. Isso vem do systemd, n\u00e3o da glibc: numa m\u00e1quina sem nenhum dos dois, n\u00e3o funciona. Confira com <code>getent hosts meuapp.localhost<\/code>.<\/p>\n<h2>Usos que valem no dia a dia<\/h2>\n<p><strong>Testar um servidor antes de virar o DNS.<\/strong> \u00c9 o uso mais \u00fatil: voc\u00ea aponta o dom\u00ednio real para o servidor novo s\u00f3 na sua m\u00e1quina, confere que est\u00e1 tudo certo, e s\u00f3 ent\u00e3o muda o DNS para valer.<\/p>\n<pre><code class=\"language-text\">203.0.113.50    www.meusite.com.br    meusite.com.br\n<\/code><\/pre>\n<p>O navegador vai ao servidor novo enquanto o mundo inteiro continua indo ao antigo. Terminado o teste, <strong>apague a linha<\/strong> \u2014 esquec\u00ea-la ali \u00e9 a origem cl\u00e1ssica do &#8220;o site mudou para todo mundo, menos para mim&#8221;.<\/p>\n<p><strong>Bloquear dom\u00ednios.<\/strong> Apontar um nome para <code>0.0.0.0<\/code> faz a conex\u00e3o falhar imediatamente:<\/p>\n<pre><code class=\"language-text\">0.0.0.0    dominio-indesejado.com\n<\/code><\/pre>\n<p>Com uma ressalva importante no Linux: conectar a <code>0.0.0.0<\/code> cai no seu pr\u00f3prio <code>127.0.0.1<\/code>. Se voc\u00ea roda um servidor web local, o &#8220;bloqueio&#8221; vai exibir o <em>seu<\/em> site em vez de falhar. S\u00f3 h\u00e1 recusa imediata quando n\u00e3o h\u00e1 nada escutando naquela porta.<\/p>\n<p>Funciona para bloqueio pontual. Para bloqueio amplo, uma lista gigante no <code>\/etc\/hosts<\/code> penaliza toda resolu\u00e7\u00e3o de nome da m\u00e1quina \u2014 a\u00ed o caminho \u00e9 um resolvedor com filtro, como Pi-hole ou dnsmasq.<\/p>\n<p><strong>Encurtar nomes de m\u00e1quinas da rede local<\/strong>, para n\u00e3o decorar IP:<\/p>\n<pre><code class=\"language-text\">192.168.0.10    nas\n192.168.0.20    impressora\n192.168.0.30    servidor-web    web\n<\/code><\/pre>\n<p>Com isso, <code>ssh web<\/code> e <code>ping nas<\/code> passam a funcionar. Combina bem com o <code>~\/.ssh\/config<\/code> do post sobre <a href=\"\/2017\/04\/ssh-sem-senha\/\">chaves SSH<\/a>.<\/p>\n<h2>Quando n\u00e3o funciona<\/h2>\n<p>Tr\u00eas causas explicam quase todos os casos:<\/p>\n<ul>\n<li><strong>Cache do navegador.<\/strong> Chrome e Firefox mant\u00eam cache de DNS pr\u00f3prio. Teste antes com <code>getent hosts nome<\/code> ou <code>curl<\/code>; se responder certo no terminal e errado no navegador, o problema \u00e9 o cache dele (no Chrome, <code>chrome:\/\/net-internals\/#dns<\/code>).<\/li>\n<li><strong>Falta o nome exato.<\/strong> <code>meusite.com.br<\/code> e <code>www.meusite.com.br<\/code> s\u00e3o nomes diferentes. Coloque os dois na linha.<\/li>\n<li><strong>Ordem no nsswitch.conf<\/strong> alterada, com <code>dns<\/code> antes de <code>files<\/code>.<\/li>\n<\/ul>\n<p>Vale saber tamb\u00e9m que o <code>\/etc\/hosts<\/code> resolve apenas <strong>endere\u00e7os<\/strong>. N\u00e3o h\u00e1 como mapear registro MX, SRV ou TXT ali \u2014 quem tenta configurar e-mail pelo arquivo bate a cabe\u00e7a \u00e0 toa.<\/p>\n<p>E o aviso que fecha o assunto: o <code>\/etc\/hosts<\/code> s\u00f3 vale na m\u00e1quina onde ele est\u00e1. N\u00e3o existe &#8220;propagar&#8221; \u2014 em servidor, o lugar de mapear nome \u00e9 o DNS, assunto do post <a href=\"\/2017\/04\/conhecendo-o-dns\/\">Conhecendo o DNS<\/a>.<\/p>\n<h2>Para continuar<\/h2>\n<ul>\n<li><a href=\"\/2017\/04\/conhecendo-o-dns\/\">Conhecendo o DNS<\/a> \u2014 o que fazer quando o mapeamento precisa valer para todo mundo<\/li>\n<li><a href=\"\/2017\/04\/ssh-sem-senha\/\">Chaves de autentica\u00e7\u00e3o no SSH<\/a> \u2014 combina com os apelidos de host<\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc6761\">RFC 6761<\/a> \u2014 os dom\u00ednios reservados para uso especial<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>O \/etc\/hosts \u00e9 a lista de nomes que a sua m\u00e1quina resolve sozinha, sem perguntar a ningu\u00e9m. Uma linha ali tem preced\u00eancia sobre o DNS inteiro da internet \u2014 o que faz dele uma ferramenta \u00f3tima para desenvolvimento e testes, &#8230; <a title=\"Entendendo o arquivo \/etc\/hosts\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2017\/04\/sobre-o-arquivo-hosts\/\" aria-label=\"Read more about Entendendo o arquivo \/etc\/hosts\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[39,414,4,415,117],"class_list":["post-143","post","type-post","status-publish","format-standard","hentry","category-linux","tag-dns","tag-hosts","tag-linux","tag-rede","tag-terminal"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=143"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/143\/revisions"}],"predecessor-version":[{"id":1074,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/143\/revisions\/1074"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}