Как смоделировать время ожидания ответа DNS-сервера?

19

Мне нужно проверить поведение приложения, когда оно не может разрешить имя хоста из-за тайм-аута. Установка nameserver 127.0.0.1в /etc/resolv.confне сработала: соответствующие функции сразу возвращаются с исключением. Тестовая установка - это виртуальная машина, созданная с помощью Vagrant, которая получает свой IP-адрес через DHCP.

синапс
источник

Ответы:

11

nameserver 127.0.0.1не будет работать, так как поведение по умолчанию уже так. Вместо этого попробуйте использовать несуществующий DNS. Чтобы убедиться, вы можете сделать:

nslookup example.com 192.0.2.10

Если вы не получили ответа, вы можете использовать его в 192.0.2.10качестве DNS-сервера.

sysfiend
источник
Это не гарантирует истечения времени ожидания, так как 192.0.2.10 может (хотя и маловероятно) быть реальным хостом, и, как и 127.0.0.1, он может вернуть «порт недоступен» сразу после запроса. Вам не нужно выбирать хост, который, как вы уверены, не работает с DNS (например, проверки вашей команды nslookup), вам нужно выбрать хост, который, как вы уверены, не будет отвечать вообще .
Джефф Меден
nslookup example.com non_existent_dns_ipвыходы: ;; connection timed out; trying next origin ;; connection timed out; no servers could be reached
sysfiend
4
@JeffMeden Вы, наверное, знаете, но диапазон 192.0.2.0/24 зарезервирован для целей документирования , поэтому его не следует нигде использовать (и отказывать в нем как уважающий любой уважающий себя межсетевой экран).
Дабу
2
@Dubu, это на самом деле более интересное предостережение; в соответствии со спецификацией трафик должен быть отклонен на маршрутизаторе, который, вероятно, вернет «целевой узел недоступен» в стек, что опять-таки отличается от тайм-аута.
Джефф Меден
26

Тайм-аут соединения возникает, когда DNS-сервер вообще не отвечает или не отвечает своевременно.

Первый можно смоделировать, просто блокируя весь трафик на ваш DNS-сервер, например, в системе Linux с помощью:

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

Использование DROP в качестве цели означает, что вы даже не получите ошибку отказа в соединении, она становится просто черной дырой. (Маловероятно, что вы обычно выполняете зонную передачу, поэтому блокирование протокола TCP в дополнение к UDP не требуется.)

Создание задержек немного сложнее. Из netemруководства :

# 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

Что создает задержку 200 мс с случайным отклонением ± 10 мс.

HBruijn
источник
18

Что вам нужно, это «сервер черной дыры». Вы можете использовать blackhole.webpagetest.org( 72.66.115.13), который будет молча отбрасывать все запросы.

Почему я предлагаю это поверх других ответов, потому что вышеупомянутый сервер был создан для этой единственной цели.

Пример:

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
источник
2
Как раз тогда, когда я думал, что видел все это; выделенный сервер, который специально ничего не делает ... Brilliant! (вероятно, просто настройка сети, а не реальный сервер с межсетевым экраном с фильтром, но все же)
Джефф Меден
1
Это Raspberry PI с брандмауэром, настроенным на отбрасывание всего, поэтому он по-прежнему маршрутизируется и отвечает на ARP (просто чтобы убедиться, что трафик не получает ICMP-сообщения о недоступности).
pmeenan
@pmeenan это интересно! Спасибо, что поделился! (Вау, не могу поверить, что вы присоединились только для того, чтобы прокомментировать: D)
grooveplex
3

Если вы не используете DNS-сервер в своей тестовой системе, вы сможете использовать его IP-адрес.

Вы можете попробовать использовать неиспользуемый адрес rfc1918 .

Вы можете использовать брандмауэр вашего сервера для блокировки исходящих пакетов с портом назначения 53.

user9517 поддерживает GoFundMonica
источник
1
Некоторые брандмауэры также могут возвращать ICMP-пакеты, поэтому время ожидания мгновенно.
Натан Гоингс