Como simular o tempo limite de resposta do servidor DNS?

17

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

    
por synapse 11.05.2016 / 10:12

4 respostas

10

nameserver 127.0.0.1 nã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.10 como seu servidor DNS.

    
por 11.05.2016 / 10:17
25

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 o tráfego para o seu 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 alvo significa que você nem receberá um erro de conexão recusada, ele se tornará apenas um buraco negro. (É improvável que você normalmente fizesse transferências de zona, portanto, bloquear o protocolo TCP além do UDP não é necessário.)

Criar atrasos é um pouco mais complicado. Do netem manual :

# 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

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

    
por 11.05.2016 / 10:42
16

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

Por que eu sugiro isso sobre as outras respostas, é porque o servidor mencionado acima foi estabelecido com 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
    
por 11.05.2016 / 19:45
3

Se você não estiver executando um servidor DNS no seu sistema de teste, poderá usar o endereço IP dele.

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

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

    
por 11.05.2016 / 10:39