Мне нужно протестировать поведение приложения, когда оно не может разрешить имя хоста из-за тайм-аута. Настройка 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.