Come simulare il timeout di risposta del server DNS?


19

Devo testare il comportamento di un'applicazione quando non è possibile risolvere un nome host a causa di un timeout. Impostazione nameserver 127.0.0.1in /etc/resolv.confnon ha funzionato: le relative funzioni restituiscono immediatamente con un'eccezione. Il banco prova è una macchina virtuale creata con Vagrant che riceve il suo indirizzo IP tramite DHCP.

Risposte:


11

nameserver 127.0.0.1non funzionerà poiché il comportamento predefinito è già quello. Prova invece a utilizzare un DNS non esistente. Per essere sicuro, puoi fare:

nslookup example.com 192.0.2.10

Se non si ottiene risposta, è possibile utilizzare 192.0.2.10come server DNS.


Questo non è garantito per produrre un timeout, poiché 192.0.2.10 potrebbe (sebbene non sia probabile) essere un vero host e, come 127.0.0.1, potrebbe restituire "porta non raggiungibile" immediatamente dopo l'interrogazione. Non è necessario scegliere un host che si è certi che non stia eseguendo DNS (come i controlli dei comandi nslookup), è necessario scegliere un host che sicuramente non risponderà affatto .
Jeff Meden,

nslookup example.com non_existent_dns_ipuscite: ;; connection timed out; trying next origin ;; connection timed out; no servers could be reached
sysfiend,

4
@JeffMeden Probabilmente lo sai, ma l'intervallo 192.0.2.0/24 è riservato a scopo di documentazione , quindi non dovrebbe essere usato da nessuna parte (e rifiutato come un bogon da qualsiasi firewall che si rispetti).
Dubu,

2
@Dubu che in realtà è un avvertimento più interessante; in base alle specifiche, il traffico dovrebbe essere rifiutato sul router che probabilmente restituirà allo stack un "host di destinazione non raggiungibile", che è di nuovo diverso da un timeout.
Jeff Meden,

26

Un timeout di connessione si verifica quando il server DNS non risponde affatto o non risponde in modo tempestivo.

Il primo può essere simulato semplicemente bloccando tutto il traffico verso il tuo server DNS, ad esempio su un sistema Linux con:

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

L'uso di DROP come target significa che non otterrai nemmeno un errore di connessione rifiutata, diventa solo un buco nero. (È improbabile che normalmente si effettuino trasferimenti di zona, quindi non è necessario bloccare il protocollo TCP oltre a UDP.)

La creazione di ritardi è leggermente più complicata. Dal netemmanuale :

# 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

Ciò crea un ritardo di 200 ms con una variazione casuale di ± 10 ms.


18

Ciò di cui hai bisogno è un "server buco nero". Puoi usare blackhole.webpagetest.org( 72.66.115.13) che eliminerà silenziosamente tutte le richieste.

Perché suggerisco questo rispetto alle altre risposte, è perché il suddetto server è stato creato per questo unico scopo.

Esempio:

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

2
Proprio quando pensavo di aver visto tutto; un server dedicato che non fa specificamente ... niente. Brillante! (probabilmente solo una cosa di configurazione di rete e non un vero server con un firewall filtrante, ma comunque)
Jeff Meden,

1
È un Raspberry PI con un firewall impostato per eliminare tutto in modo che instrada e risponda ancora all'ARP (solo per essere sicuri che il traffico non ottenga risposte irraggiungibili ICMP).
pmeenan,

@pmeenan è interessante! Grazie per la condivisione! (Wow, non riesco a credere che ti sia unito solo per commentare: D)
grooveplex,

3

Se non stai eseguendo un server DNS sul tuo sistema di test, dovresti essere in grado di utilizzare il suo indirizzo IP.

Potresti provare a usare un indirizzo rfc1918 inutilizzato .

È possibile utilizzare il firewall del server per bloccare i pacchetti in uscita con una porta di destinazione 53.


1
Alcuni firewall possono anche restituire pacchetti ICMP in modo che il timeout sia istantaneo.
Nathan Goings,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.