Eu configurei um servidor DNS no SLES10 (atualmente vincular 9.6) em um servidor com hospedagem múltipla. Este servidor pode ser consultado em todas as redes internas e fornece respostas para todas as redes internas. Temos duas zonas "principais" DNS separadas. Cada uma dessas zonas está sendo atendida por vários servidores DNS do Windows com autoridade.
Agora meu servidor linux é um servidor DNS secundário para uma dessas zonas (zona interna privada) e atua como encaminhador para a outra zona (zona interna pública).
Até recentemente, essa configuração funcionava sem problemas. Agora eu recebo - ao consultar a zona interna pública (por exemplo, pelo host
comando em um cliente linux) a mensagem de erro
;; Truncado, tentando novamente no modo TCP
um wireshark-dump revelou a causa disso: a primeira consulta sai no modo UDP, a resposta não se encaixa no UDP (devido à longa lista de NS autoritativos), depois é repetida no modo TCP, fornecendo a resposta correta.
Agora a pergunta: Posso configurar minha ligação para consultar os encaminhadores no modo TCP sem tentar o UDP primeiro?
Atualização: Tentando minha mão na arte ASCII ...
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+
fonte
host
comando e qual consulta está sendo enviada.minimal-responses: yes
à configuração do BIND no SLES 10 - isso pode reduzir os tamanhos de resposta. De qualquer forma, a maioria das consultas normais não excederá o limite de 512 bytes.Respostas:
Primeiro, eu não chamaria isso de erro, apenas uma mensagem informativa.
Segundo, os servidores DNS sempre respondem a consultas UDP (pelo menos BIND, não consigo encontrar opções para desativar o UDP) e os clientes sempre tentam (?) Enviar uma consulta UDP primeiro (por exemplo, não há opções no resolv.conf para alterar isso nem na JVM) - se eles se encaixam em um pacote UDP (geralmente, as solicitações)
Se você tiver um caso de uso específico, poderá especificar o uso de TCP, por exemplo, no shell script, use 'dig + tcp' ou 'host -T' para resolução e use as chamadas de sistema 'sethostent / gethostbyname / endhostent' (consulte man página) para forçar o TCP em outros casos.
Se você realmente deseja tentar bloquear o UDP, a única opção que posso ver é com uma regra iptable, mas não tenho certeza de que essa configuração funcione. Espero que a resolução do DNS simplesmente falhe.
fonte
Seu servidor BIND deve estar usando EDNS (consulte RFC 2671) para permitir pacotes UDP com mais de 512 bytes.
Isso deve permitir que seu conjunto NS grande seja recuperado pelo UDP, sem exigir a sobrecarga de uma conexão TCP para outras consultas menores.
Observe, no entanto, que esses são realmente os valores padrão. Se o EDNS não estiver sendo usado, algo está bloqueando ou os servidores que recebem as opções do EDNS não o suportam.
Além disso, observe que
host
não suporta EDNS. É perfeitamente possível que suas consultas de encaminhador -> servidor já estejam usando EDNS, e você simplesmente não pode vê-lo quando tenta com seu cliente local.Tente em
dig +bufsize=4096 @server hostname A
vez de usarhost
.fonte