¿Cómo simular el tiempo de espera de respuesta del servidor DNS?

19

Necesito probar el comportamiento de una aplicación cuando no puede resolver un nombre de host debido a un tiempo de espera. Ajuste nameserver 127.0.0.1en /etc/resolv.confno funcionó: las funciones pertinentes respondieron de inmediato con una excepción. El equipo de prueba es una máquina virtual creada con Vagrant que recibe su dirección IP a través de DHCP.

sinapsis
fuente

Respuestas:

11

nameserver 127.0.0.1no funcionará ya que el comportamiento predeterminado ya es eso. En su lugar, intente usar un DNS no existente. Para asegurarse, puede hacer:

nslookup example.com 192.0.2.10

Si no obtiene respuesta, puede usarlo 192.0.2.10como su servidor DNS.

sysfiend
fuente
No se garantiza que esto produzca un tiempo de espera, ya que 192.0.2.10 podría (aunque no es probable) ser un host real y, al igual que 127.0.0.1, podría devolver el "puerto inalcanzable" inmediatamente después de la consulta. No necesita elegir un host que está seguro de que no está ejecutando DNS (como lo hace su comando nslookup), debe elegir un host que esté seguro de que no responderá en absoluto .
Jeff Meden
nslookup example.com non_existent_dns_ipsalidas: ;; connection timed out; trying next origin ;; connection timed out; no servers could be reached
sysfiend
44
@JeffMeden Probablemente lo sepa, pero el rango 192.0.2.0/24 está reservado para fines de documentación , por lo que no debe usarse en ningún lugar (y cualquier firewall que lo respete lo rechaza).
Dubu
2
@Dubu que en realidad es una advertencia más interesante; Según las especificaciones, el tráfico debe rechazarse en el enrutador, lo que probablemente devolverá un "host de destino inalcanzable" a la pila, que de nuevo es diferente de un tiempo de espera.
Jeff Meden
26

Se produce un tiempo de espera de conexión cuando el servidor DNS no responde o no responde de manera oportuna.

El primero se puede simular simplemente bloqueando todo el tráfico a su servidor DNS, en un sistema Linux, por ejemplo, con:

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

Usar DROP como objetivo significa que ni siquiera obtendrá un error de conexión rechazada, se convierte en un agujero negro. (Es poco probable que normalmente realice transferencias de zona, por lo que no es necesario bloquear el protocolo TCP además de UDP).

Crear retrasos es un poco más complicado. Del 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

Lo que crea un retraso de 200 ms con una variación aleatoria de ± 10 ms.

HBruijn
fuente
18

Lo que necesita es un "servidor de agujero negro". Puede usar blackhole.webpagetest.org( 72.66.115.13), que descartará todas las solicitudes en silencio.

Por qué sugiero esto sobre las otras respuestas, es porque el servidor antes mencionado se ha establecido para este único propósito.

Ejemplo:

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
fuente
2
Justo cuando pensé que lo había visto todo; un servidor dedicado que específicamente no hace ... nada. ¡Brillante! (probablemente solo una configuración de red y no un servidor real con un firewall de filtro completo, pero aún así)
Jeff Meden
1
Es un Raspberry PI con un firewall configurado para soltar todo, de modo que todavía se enruta y responde a ARP (solo para asegurarse de que el tráfico no obtenga respuestas inalcanzables de ICMP).
pmeenan
@pmeenan eso es interesante! ¡Gracias por compartir! (Wow, no puedo creer que se unió a solo comentario: D)
grooveplex
3

Si no está ejecutando un servidor DNS en su sistema de prueba, debería poder usar su dirección IP.

Puede intentar usar una dirección rfc1918 no utilizada .

Puede usar el firewall de su servidor para bloquear los paquetes salientes con un puerto de destino 53.

user9517 es compatible con GoFundMonica
fuente
1
Algunos cortafuegos también pueden devolver paquetes ICMP para que el tiempo de espera sea instantáneo.
Nathan Goings