Como simular o tempo limite da resposta do servidor DNS?

19

Preciso testar o comportamento de um aplicativo quando ele não pode resolver um nome de host devido a um tempo limite. Definir nameserver 127.0.0.1em /etc/resolv.confnão funcionou: as funções relevantes retornar imediatamente com uma exceção. O equipamento de teste é uma VM criada com o Vagrant que recebe seu endereço IP via DHCP.

sinapse
fonte

Respostas:

11

nameserver 127.0.0.1não funcionará, pois o comportamento padrão já é esse. Em vez disso, tente usar um DNS não existente. Para ter certeza, você pode fazer:

nslookup example.com 192.0.2.10

Se você não obtiver resposta, poderá usar 192.0.2.10como seu servidor DNS.

sysfiend
fonte
Não é garantido que isso produza um tempo limite, uma vez que 192.0.2.10 poderia (embora não seja provável) ser um host real e, como 127.0.0.1, poderia retornar a "porta inacessível" imediatamente após a consulta. Você não precisa escolher um host que você está certo não está em execução DNS (como seus cheques comando nslookup), você precisa escolher um host que você com certeza vai não são responder a todos .
Jeff Meden
nslookup example.com non_existent_dns_ipsaídas: ;; connection timed out; trying next origin ;; connection timed out; no servers could be reached
sysfiend
4
@JeffMeden Você provavelmente sabe, mas o intervalo 192.0.2.0/24 é reservado para fins de documentação , portanto não deve ser usado em nenhum lugar (e recusado como um bogon por qualquer firewall que se preze).
Dubu 11/05
2
@Dubu, que na verdade é uma ressalva mais interessante; de acordo com as especificações, o tráfego deve ser rejeitado no roteador, o que provavelmente devolverá um "host de destino inacessível" à pilha, que é novamente diferente de um tempo limite.
Jeff Meden
26

Um tempo limite de conexão ocorre quando o servidor DNS não responde, ou não responde em tempo hábil.

O primeiro pode ser simulado simplesmente bloqueando todo o tráfego para o servidor DNS, em um sistema Linux, por exemplo, com:

# iptables -I OUTPUT -p udp -d <iIP of DNS server> --dport 53 -j DROP

Usar o DROP como destino significa que você nem receberá um erro de conexão recusada, ele se tornará apenas um buraco negro. (É improvável que você normalmente faça transferências de zona, portanto, não é necessário bloquear o protocolo TCP além do UDP.)

Criar atrasos é um pouco mais envolvido. Do netemmanual :

# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit  3000
# tc qdisc add dev eth0 parent 30:1 handle 31: netem  delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32  match ip dst <IP_of_DNS_server>/32 flowid 1:3

O que cria um atraso de 200 ms com variação aleatória de ± 10 ms.

HBruijn
fonte
18

O que você precisa é de um "servidor buraco negro". Você pode usar blackhole.webpagetest.org( 72.66.115.13) que eliminará silenciosamente todas as solicitações.

Por que sugiro isso sobre as outras respostas, é porque o servidor mencionado acima foi estabelecido para esse único propósito.

Exemplo:

barend@shells:~$ dig example.com @72.66.115.13

; <<>> DiG 9.10.3-P4-Debian <<>> example.com @72.66.115.13
;; global options: +cmd
;; connection timed out; no servers could be reached
grooveplex
fonte
2
Apenas quando eu pensei que tinha visto tudo; um servidor dedicado que especificamente não faz nada. Brilhante! (provavelmente apenas uma coisa de configuração de rede e não um servidor real com um filtro-all firewall, mas ainda)
Jeff Meden
1
É um PI de framboesa com um firewall configurado para descartar tudo, para que ele ainda roteie e responda ao ARP (apenas para garantir que o tráfego não obtenha respostas inacessíveis do ICMP).
Pmeenan
@ pmeenan isso é interessante! Obrigado por compartilhar! (Uau, não posso acreditar que você se juntou a apenas para comentário: D)
grooveplex
3

Se você não estiver executando um servidor DNS no seu sistema de teste, poderá usá-lo.

Você pode tentar usar um endereço rfc1918 não utilizado .

Você pode usar o firewall do servidor para bloquear pacotes de saída com uma porta de destino 53.

user9517 suporta GoFundMonica
fonte
1
Alguns firewalls também podem retornar pacotes ICMP para que o tempo limite seja instantâneo.
Nathan Goings