Назад | Перейти на главную страницу

Как имитировать тайм-аут ответа DNS-сервера?

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

Тайм-аут соединения возникает, когда 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 мс.

Что вам нужно, так это «сервер черной дыры». Ты можешь использовать 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

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

nslookup example.com 192.0.2.10

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

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

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

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