Comment simuler le délai de réponse du serveur DNS?


19

J'ai besoin de tester le comportement d'une application lorsqu'elle ne peut pas résoudre un nom d'hôte en raison d'un délai d'attente. Réglage nameserver 127.0.0.1en /etc/resolv.confne fonctionne pas: les fonctions pertinentes reviennent immédiatement à une exception. Le banc d'essai est une machine virtuelle créée avec Vagrant qui reçoit son adresse IP via DHCP.

Réponses:


11

nameserver 127.0.0.1ne fonctionnera pas car le comportement par défaut est déjà celui-là. Essayez plutôt d'utiliser un DNS non existant. Pour vous en assurer, vous pouvez faire:

nslookup example.com 192.0.2.10

Si vous n'obtenez aucune réponse, vous pouvez l'utiliser 192.0.2.10comme serveur DNS.


Cela ne garantit pas un délai d'attente, car 192.0.2.10 pourrait (bien que ce ne soit probablement pas) être un véritable hôte, et comme 127.0.0.1, il pourrait retourner "port inaccessible" immédiatement après l'interrogation. Vous n'avez pas besoin de choisir un hôte dont vous êtes sûr qu'il n'exécute pas DNS (comme vos vérifications de commande nslookup), vous devez choisir un hôte dont vous êtes sûr qu'il ne répondra pas du tout .
Jeff Meden

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

4
@JeffMeden Vous le savez probablement, mais la plage 192.0.2.0/24 est réservée à des fins de documentation , elle ne doit donc pas être utilisée n'importe où (et refusée comme bogon par un pare-feu qui se respecte).
Dubu

2
@Dubu qui est en fait une mise en garde plus intéressante; selon la spécification, le trafic doit être rejeté au niveau du routeur, ce qui rendra probablement un "hôte de destination inaccessible" à la pile, ce qui est à nouveau différent d'un délai d'attente.
Jeff Meden

26

Un délai d'expiration de connexion se produit lorsque le serveur DNS ne répond pas du tout ou ne répond pas en temps opportun.

Le premier peut être simulé en bloquant simplement tout le trafic vers votre serveur DNS, sur un système Linux par exemple avec:

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

Utiliser DROP comme cible signifie que vous n'aurez même pas d'erreur de connexion refusée, cela devient juste un trou noir. (Il est peu probable que vous fassiez normalement des transferts de zone, donc le blocage du protocole TCP en plus d'UDP n'est pas nécessaire.)

La création de retards est un peu plus compliquée. Du netemmanuel :

# 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

Ce qui crée un retard de 200 ms avec une variation aléatoire de ± 10 ms.


18

Vous avez besoin d'un "serveur trou noir". Vous pouvez utiliser blackhole.webpagetest.org( 72.66.115.13) qui supprimera silencieusement toutes les demandes.

La raison pour laquelle je suggère cela par rapport aux autres réponses est que le serveur susmentionné a été créé à cette seule fin.

Exemple:

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
Juste au moment où je pensais avoir tout vu; un serveur dédié qui ne fait rien ... rien. Brillant! (probablement juste une chose de configuration réseau et pas un serveur réel avec un pare-feu filtrant tout, mais quand même)
Jeff Meden

1
Il s'agit d'un Raspberry PI avec un pare-feu configuré pour tout supprimer afin qu'il achemine toujours et répond à ARP (juste pour être sûr que le trafic n'obtient pas de réponses ICMP inaccessibles).
pmeenan

@pmeenan c'est intéressant! Merci d'avoir partagé! (Wow, je ne peux pas croire que vous vous soyez joint juste pour commenter: D)
grooveplex

3

Si vous n'exécutez pas de serveur DNS sur votre système de test, vous devriez pouvoir utiliser son adresse IP.

Vous pouvez essayer d'utiliser une adresse rfc1918 inutilisée .

Vous pouvez utiliser le pare-feu de votre serveur pour bloquer les paquets sortants avec un port de destination 53.


1
Certains pare-feu peuvent également renvoyer des paquets ICMP afin que le délai d'expiration soit instantané.
Nathan Goings
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.