Comando / scripts para verificar o tempo de pesquisa de DNS reverso

1

Estou trabalhando em um projeto no qual um mestre se comunica com o número de escravos. Para isso, tem que fazer conexão com hosts na rede. Mas às vezes trava.

Acho que o motivo por trás disso é o consumo extra de tempo durante o Reverse DNS Lookup . Então, por favor, me diga qualquer comando ou script que verifique ou faça a lista para o tempo Reverse DNS Lookup .

EDIT no. 1

Diga também que onde posso adicionar esse comando no código-fonte do rsh para obter uma lista de tempo consumido por cada solicitação, sempre que ele se conectar a outros hosts.

Para que eu possa encontrar o motivo por trás do enforcamento do servidor.

    
por devsda 22.02.2013 / 14:12

2 respostas

1

Parte disso depende de qual resolvedor stub está em uso. Você também pode estar tendo problemas com o IPv6, por exemplo se os registros IPv6 AAAA forem retornados, mas não houver conectividade IPv6.

Assumindo que o software (erm, rsh ? realmente? essa resposta não é rsh specific) está usando o resolvedor do sistema (como ping ) e não sua própria implementação (como dig ou host ), então você pode usar getent para ver o que pode estar acontecendo:

$ time getent ahostsv4 www.google.com
$ time getent ahostsv6 www.google.com

O acima irá realizar uma pesquisa direta e inversa (embora você não possa forçar o getent a procurar um PTR reverso ou outros tipos, ele só se preocupa com os registros A / AAAA).

Existem alguns scripts úteis em esta resposta para link , permitem que você encaminhe as pesquisas reversas (somente IPv4) como getent hosts , mas em perl para que você possa mexer com eles.

As duas possibilidades acima usam o seu resolvedor de sistema, incluindo todas as oscilações e rotatórias envolvidas no nsswitch, então elas devem se comportar como a maioria das aplicações.

Não se esqueça de testar no cliente e o servidor, ou ambos farão pesquisas inversas.

Você também pode verificar seus solucionadores locais, um por um:

$ while read opt p1 ;  do 
    [ "$opt" = "nameserver" ] && dig @$p1 www.google.com +short +identify; 
done < /etc/resolv.conf

e para verificar DNS reverso:

$ dig www.google.com +short | xargs -n1 -i dig -x {} PTR +short +identify

Para depurar ainda mais isso, você precisará verificar:

  • /etc/host.conf (várias opções, incluindo verificação de falsificação via DNS reverso)
  • /etc/resolv.conf (seus resolvedores)
  • /etc/nsswitch.conf (quais bancos de dados devem ser verificados, por exemplo, /etc/hosts , DNS, LDAP, etc)
  • a saída de dnstrace e / ou dig +trace
  • /etc/gai.conf , se presente. Entre outras coisas, isso pode controlar se os registros IPV6 AAAA são classificados antes dos registros A.
  • /etc/nscd.conf se nscd estiver em uso

Se você tiver acesso ao wireshark e ao root, poderá assistir a solicitações de DNS no fio:

# tshark -w dns.cap "port 53"
# tshark -V -ta -n -r dns.cap

(A opção -V é excessivamente detalhada, no entanto, não ocorreu aos desenvolvedores colocar timestamps na saída de dissecação do protocolo com -O dns . Talvez isso tenha sido corrigido em uma versão mais recente.)

Mesmo que você não esteja usando nscd agora, poderá ver facilmente alguns o que está acontecendo se você iniciá-lo interativamente com a opção -dd ou -ddd . Observe que nscd armazena somente em cache os registros do host (A / AAAA), portanto, os registros PTR terminarão negativamente em cache com uma vida útil curta (padrão 20s).

O resolvedor glibc (e outros) suporta " options debug " em /etc/resolv.conf , bem como a variável de ambiente RES_OPTIONS , que pode ser usada para ativar a depuração. Infelizmente, essa funcionalidade útil requer que o DEBUG seja ativado quando o glibc for criado, então é improvável que você possa usá-lo ...

Para trabalhos pesados, o melhor candidato é ltrace , isso permite rastrear e marcar timestamp as chamadas da biblioteca, assim como a forma strace pode rastrear chamadas do sistema, por exemplo gethostbyname() ou gethostbyaddr() . A desvantagem: com as muitas camadas de indireção oferecidas por nsswitch , você provavelmente se perderá na produção volumosa. Uma simples execução no telnet me deu mais de 3.000 linhas de saída, dentro das quais estão enterradas duas chamadas para gethostbyname() .

$ ltrace -ttT -e "getaddr*+gethost*+getname*" getent ahosts www.google.com

13:42:06.118718 getent->getaddrinfo("www.google.com", nil, { 0x2a, 0, 0, 0, 0, nil, 
nil, nil }, { 0x2a, 0x2, 0x3, 0, 16, { 2, 0, { 0x69187d4a } }, "www.google.com", { 
0x2a, 0x2, 0x2, 0x11, 16, { 2, 0, { 0x93187d4a } }, nil, { 0x2a, 0x2, 0x3, 0, 16, {
2, 0, { 0x67187d4a } }, nil, { 0x2a, 0x2, 0x2, 0x11, 16, { 2, 0, { 0x68187d4a } }, 
nil, ... } } } }) = 0 <0.042561>

É um pouco mais difícil entender o que está acontecendo porque não produz endereços IP legíveis para humanos ( 0x69187d4a = 105,24,125,74 - > 74.125.24.105). É provavelmente o melhor método para rastrear problemas locais, como você pode ver todas as chamadas através do NSS.

Eu usei essas alterações no meu ~/.ltrace.conf para o acima, isso pode exigir mais algumas invasões:

typedef size_t = int;
typedef sockaddr = struct(short, short, in_addr);
typedef addrinfo = struct;
typedef addrinfo = struct(hex(int), hex(int), hex(int), hex(int), size_t, sockaddr*, string, addrinfo *);

int getaddrinfo(string, string, addrinfo *, +addrinfo**);
int getnameinfo(sockaddr*, uint, +string, +uint, +string, +uint, uint);
    
por 07.10.2014 / 16:04
0

Se você tiver dúvidas em resposta lenta na consulta inversa, tente um dos métodos abaixo para corrigir o mesmo:

  1. Se possível, desative a pesquisa inversa em seu aplicativo e veja a diferença
  2. Você pode usar o Name Service Cache Daemon (nscd), que também armazena o PTR em cache, mas há algum problema de segurança como:

    The Name Service Cache Daemon (nscd) has a default behavior that
    does not allow applications to validate DNS "PTR" records against
    "A" records.

    In particular, nscd caches a request for a "PTR" record, and when a request comes later for the "A" record, nscd simply divulges the
    information from the cached "PTR" record, instead of querying the
    authoritative DNS for the "A" record.

Referência Link

    
por 26.02.2013 / 05:56