Qual é o limite de tamanho do / etc / hosts?

44

Como posso determinar ou definir o limite de tamanho de /etc/hosts? Quantas linhas ele pode ter?

Geremia
fonte
64
... Eu acho que no ponto onde esta se torna uma preocupação real em vez de uma curiosidade acadêmica você longe passado do ponto onde seria mais sensato para configurar um servidor de DNS privado em termos de desempenho e facilidade de manutenção.
Shadur
5
Estou surpreso que você esteja perguntando. Por que você espera um limite de tamanho significativo e preciso nos arquivos de configuração?
Basile Starynkevitch
3
@BasileStarynkevitch Perguntei porque um arquivo de hosts de ~ 2 MB não estava funcionando no meu roteador, mas o problema foi que eu não suspirei o dnsmasq para reler o arquivo de hosts.
Geremia 29/08
2
@ Geremia meu arquivo hosts é de 500M, mais de 15.000 entradas, sem problemas. É sempre melhor para determinar a causa raiz do problema e resolvê-lo primeiro
BSD
3
Você está usando seu arquivo host para bloquear endereços IP? Nesse caso, você deve usar o iptables com ipset. Usar o iptables sozinho causará um grande impacto no desempenho, no entanto, com o ipset, uma lista de quase 500.000 ips tem impacto insignificante.
cybernard

Respostas:

57

Os efeitos problemáticos incluem uma resolução lenta do nome do host (a menos que o SO converta de alguma forma a lista linear em uma estrutura de pesquisa mais rápida?) E o potencial para uma interação surpreendente com a tabconclusão do shell bem antes que qualquer tamanho de arquivo significativo seja atingido.

Por exemplo! Se colocar 500.000 entradas de host em/etc/hosts

# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts

para ciência, a tabconclusão padrão do nome do host no ZSH leva cerca de 25 segundos no meu sistema para retornar um prompt de conclusão (concedido, este é um laptop de 2008 com um disco de 5400 RPM, mas ainda assim).

agitar
fonte
21

Eu não acho que tenha um limite de tamanho em termos de número de linhas.

Antes do DNS (que foi colocado em uso em 1985), era esse arquivo que servia como o único meio para realizar pesquisas de nome de host, portanto, presumo que isso significa que o arquivo deve ter milhares ou pelo menos centenas de entradas para ser capaz de suportar os nós da Internet pré-1985 mais bem conectados.

Aqui está um exemplo de 1985 (o formato mudou um pouco): http://jim.rees.org/apollo-archive/hosts.txt Este arquivo tem 1680 linhas das quais 1325 são linhas de host. As 355 linhas restantes estão em branco, comentários, redes ou gateways 1 .

O único limite real que eu pude encontrar foi que, em alguns sistemas, as linhas individuais são limitadas a menos de BUFSIZcaracteres (1024 na minha máquina OpenBSD).

Se você tiver mais do que algumas entradas /etc/hosts, considere a criação de um servidor de nomes local, mas essa é minha opinião pessoal.


1 Obrigado a Jeff Schaller por desenterrar isso.

Kusalananda
fonte
Antes do DNS, não acho que era comum converter a tabela de hosts da Internet completa em /etc/hostsformato. A maioria dos sistemas Unix nem estava na Internet e, mesmo que houvesse uma máquina, ela não precisava de uma tabela host completa, apenas o punhado de máquinas com as quais precisava conversar. Eu ficaria surpreso se houvesse muitas máquinas com mais de 100 entradas.
Barmar 30/08/19
13

Como posso determinar o limite de tamanho de / etc / hosts?

Como é um arquivo comum, o limite corresponderia aos limites do sistema de arquivos subjacente (que seria limitado pelo número de discos atrás dele), menos o espaço usado por quaisquer outros arquivos no mesmo /sistema de arquivos (provavelmente raiz ( )):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (com o tamanho padrão do bloco 4KiB)
  • xfs: 500 TiB

Como posso definir o limite de tamanho de / etc / hosts?

Como é um arquivo editado manualmente, apenas manualmente:

sed -i '100,$d' /etc/hosts

(para remover as linhas 100 e além).

Jeff Schaller
fonte
3
Verdadeiro em princípio, mas os limites do sistema de arquivos (por exemplo, terabytes) são praticamente irrelevantes.
Basile Starynkevitch
11

Os limites de tamanho se aplicam apenas ao alocar buffers estáticos. gethostbyname(3), que analisa as entradas /etc/hosts, não aloca buffers estáticos - e nunca o possui. A versão original do algoritmo BSD 4.3 de 1983 mostra um padrão de arquivo aberto, enquanto linha de análise, de fechamento de arquivo:

sethostent(0);
while (p = gethostent()) {
    if (strcmp(p->h_name, name) == 0)
        break;
    for (cp = p->h_aliases; *cp != 0; cp++)
        if (strcmp(*cp, name) == 0)
            goto found;
}
found:
endhostent();

As implementações modernas mantêm essa herança em todos os aspectos essenciais.

De qualquer forma, internamente, a *hostentfamília de funções armazena um ponteiro de arquivo para a linha atual no arquivo. sethostentabre o arquivo e define a posição do ponteiro do arquivo. gethostentobtém dados e avança o ponteiro. endhostentfecha o ponteiro do arquivo. A Biblioteca GNU C oferece uma referência completa sobre essas funções.

Como você pode imaginar na implementação, as entradas que ocorrem no início do arquivo são resolvidas mais rapidamente. Se o seu arquivo hosts for enorme, isso entra em jogo.

Portanto, não importa o tamanho do arquivo, o sistema operacional o consumirá. Eventualmente, porém, você atingirá os limites do sistema de arquivos (de acordo com a resposta de Jeff Schaller ). Você também tem limites máximos de tamanho de linha (de acordo com a resposta de Kusalananda ). Mas, no final, você pode fazer o tamanho que quiser. Mas por favor, não.

bispo
fonte
2
Usando o glibc e o linux, isso não é tão simples, infelizmente. Se você chamar gethostbyname e o sistema estiver configurado adequadamente (padrão em muitos sistemas), em vez de ler / etc / host, o nscd será chamado. Não tenho idéia se o nscd armazenará em cache apenas ocorrências no arquivo ou tentará armazená-lo como um todo. Neste último caso, você teria uma limitação carneiro para o tamanho do arquivo (assumindo que a configuração nscd permite que tanto entradas)
PlasmaHH
1
A versão 4.3BSD está aqui . Ele suportava uma versão com hash dbm do / etc / hosts. IIRC, o dbm impôs alguns limites de tamanho que poderiam causar falhas na tentativa de criar um db com hash.
Mark Plotnick
2

... Eu estraguei meu cérebro e, para a minha vida, não consigo pensar em uma única situação ou circunstância em que você abordasse qualquer tipo de problema de limite de tamanho /etc/hosts- você enfrentaria problemas práticos como os o desempenho atingido na getaddrinfo()família de chamadas do sistema que todos precisam consultar o arquivo antes de decidir se devem enviar uma consulta DNS, para não falar dos problemas em manter um arquivo de texto simples desse tamanho.

Suspeito que o que temos aqui seja uma falha na comunicação em um nível superior. Que problema você está tentando resolver com um /etc/hostsarquivo gigantesco ? Estou quase certo de que existe uma solução melhor que essa.

Shadur
fonte
8
Algumas pessoas usam um hostsarquivo para colocar na lista negra anúncios / malware / rastreamento / etc. Existem listas selecionadas na internet, a que eu uso tem 41 mil linhas e 1,1 MB de tamanho.
Bert
Provavelmente seria melhor usar o desempenho dnsmasqpara isso - veja, por exemplo, dnsgate (que eu não tentei).
reinierpost
A mina tem 1,7 MB com 57 mil linhas. Você pode obter seu /etc/hostsarquivo enorme em hostsfile.org
styrofoam fly
@reinierpost que é bastante perspicaz, na verdade!
Jeff Schaller