Forçar solicitações de DNS do encaminhador para o modo TCP

9

Eu configurei um servidor DNS no SLES10 (atualmente vinculado a 9.6) em um servidor multi-homed. Este servidor pode ser consultado em todas as redes internas e fornece respostas para todas as redes internas. Temos duas zonas "master" de DNS separadas. Cada uma dessas zonas está sendo atendida por vários servidores DNS-Windows com autoridade.

Agora meu servidor linux é um servidor DNS secundário para uma dessas zonas (zona interna privada) e está atuando como encaminhador para a outra zona (zona interna pública).

Até recentemente, essa configuração funcionou sem problemas. Agora eu recebo - ao consultar a zona interna pública (por exemplo, pelo comando host em um cliente linux) a mensagem de erro

;; Truncated, retrying in TCP mode

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), então é repetida no modo TCP, entregando o resposta certa.

Agora a pergunta: Posso configurar minha ligação para consultar os encaminhadores no modo TCP sem tentar primeiro o UDP?

Atualização: tentando usar a arte ASCII ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+
    
por Nils 10.01.2012 / 10:59

2 respostas

8

Primeiro, eu não chamaria isso de erro, apenas uma mensagem informativa.

Em segundo lugar, os servidores DNS sempre responderão às consultas UDP (pelo menos, BIND, não consigo encontrar opções para desabilitar o UDP) e os clientes sempre tentarão enviar uma consulta UDP primeiro (por exemplo, não há opções no resolv.conf para mudar isso nem na JVM) - se eles se encaixam em um pacote UDP (pedidos geralmente fazem)

Se você tiver um caso de uso específico, poderá especificar o uso do TCP, por exemplo, no shell script use 'dig + tcp' ou 'host -T' para resolução, e você pode usar as chamadas do sistema 'sethostent / gethostbyname / endhostent' (veja a página man) para forçar o TCP em outros casos.

Se você realmente quiser tentar bloquear o UDP, a única opção que posso ver é com uma regra de iptable, mas não tenho certeza de que essa configuração funcionaria. Espero que a resolução do DNS simplesmente falhe.

    
por 10.01.2012 / 12:11
4

Seu servidor BIND deve estar usando o EDNS (veja RFC 2671) para permitir pacotes UDP com mais de 512 bytes.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Isso deve permitir que seu grande conjunto NS seja recuperado em UDP, sem exigir a sobrecarga de uma conexão TCP para outras consultas menores.

No entanto, observe que esses são 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 estão suportando isso.

Além disso, observe que host não suporta EDNS. É perfeitamente possível que o seu despachante - > consultas do servidor já estão usando o EDNS, e você simplesmente não pode vê-lo quando você tenta com o seu cliente local.

Experimente dig +bufsize=4096 @server hostname A em vez de usar host .

    
por 10.01.2012 / 11:20