Ошибка DNS request timed out, исправляем за минуту
Добрый день уважаемые читатели и подписчики канала, вы наверняка знаете, что работа всего интернета, помимо маршрутизации трафика, зависит от DNS имен в ip адреса и обратно, и за это отвечают DNS сервера, работа которых должна быть беспрерывна. Бывают случаи, что случаются аварии, в результате которых у вас начинаются проблемы с доступом в интернет и причиной всему ДНС сервера, сегодня я вам расскажу про ошибку: DNS request timed out.
Симптомы ошибки
Ситуация такова, у пользователей перестал работать интернет, при попытке сделать ping google.com, в ответ выдалось сообщение, что данное имя не удается разрешить, если попытаться пропинговать 8.8.8.8, это публичные ДНС сервера Google, то пинг нормально шел, из чего можно сделать вывод, что есть проблемы с рекурсией DNS серверов. Для диагностики ДНС служб используется утилита nslookup, позволяющая выполнить запрос. Для примера я попытался разрешить имя mail.ru
В итоге я получил ошибку DNS request timed out. Превышено время ожидания запроса.
Исправляем ошибку: Превышено время ожидания запроса
Как я и писал выше существует три причины ошибки DNS request timed out:
- Не доступны рекурсивные сервера провайдера или публичные ДНС
- Не доступен основной шлюз на ДНС сервере
- Закрыты порты или требуется авторизация на прокси сервере.
Проверяем рекурсивные сервера
Первое с чего нужно начать это проверить работоспособность рекурсивных серверов, на WIndows Server 2012 R2 это делается в оснастке "Диспетчер DNS", выбираете имя сервера и щелкаете правым кликом, из контекстного меню выбираем свойства.
Переходим на вкладку "Сервер пересылки" и проверяем, чтобы добавленные адреса, нормально разрешались и не было предупреждений.
Для пущей уверенности нажмите кнопку изменить и удостоверьтесь, что в окне "Редактировать серверы пересылки" все зеленое. Если там не удается разрешить имена, то переходим к другим пунктам.
Проверка шлюза
После проверки рекурсии у вас может остаться ошибка DNS request timed out и связанна с неправильным шлюзом или ваш шлюз просто не доступен. Во-первых, откройте окно свойств TCP/IP через оснастку ncpa.cpl либо можно через командную строку и команду ipconfig /all.
Удостоверьтесь, что данный шлюз правильный и если да, то чтобы он был доступен с данного сервера. Далее обязательно посмотрите трассировку трафика и убедитесь, что идет через нужный шлюз, если нет, то убедитесь, что нет статических маршрутов, которые перекрывают метрикой ваш основной шлюз. Если ошибка DNS request timed out сохраняется, то у вас сто процентов закрыты порты на вашем прокси сервере или брандмауэре, убедитесь, что доступен порт 53.
Авторизация на прокси сервере
В моем случае оказалось, что был не доступен шлюз и еще сбросилась сессия на прокси сервере, после того как я на своем фаерволе Kerio Control авторизовал свои ДНС сервера у меня пропала ошибка DNS request timed out, при разрешении имен.
Перезапуск DNS службы
Попробуйте перезапустить службу DNS сервера, это то же может помочь, либо полная перезагрузка контроллера домена, если DNS там. Я ловил такой глюк, на DNS, где был включен сбор логов с сохранением в текстовый файл, тут из-за большой нагрузки служба могла себя повести некорректно.
Выключите антивирус
Очень часто в период настройки антивирусного решения, он может блокировать те процессы, трафик, компоненты, что необходимы серверу DNS, поэтому на момент поиска и устранения проблемы я советую выключить антивирусное решение.
Мониторинг DNS серверов на предмет ошибки "DNS request timed out" через PowerShell и Zabbix
Мало того, что вы решили данную проблему, нужно научиться ее мониторить. Для этого я пошел таким путем:
- 1️⃣Первый вариант. Создать и локально запускать PowerShell скрипт, который выполняет команду nslookup до серверов Google и если получает ошибку "DNS request timed out", то в файле по определенному пути записывает FALSE DNS, если получает имя dns.google, то записывает статус OK. Далее агент Zabbix смотрит статус и на основании его выводит предупреждение или нет в телеграм группу.
$nslookupResult = nslookup 8.8.8.8
if ($nslookupResult -like "dns.google")
{ $status = "OK" }
elseif ($nslookupResult -like "DNS request timed out")
{ $status = "FALSE DNS" }
else
{ $status = "Unknown status" }
Write-Output $status | Out-File -FilePath "C:\temp\DNS_Check.txt"
- 2️⃣Второй вариант, брать на одном сервере список серверов из файла и выполнять на нем скрипт для каждого из них. Далее так же это выводить в файл, с указанием имени сервера и его статус.
$serverList = Get-Content -Path "C:\temp\servers.txt"
foreach ($server in $serverList) {
$nslookupResult = Invoke-Command -ComputerName $server -ScriptBlock
{ nslookup 8.8.8.8 }
if ($nslookupResult -like "dns.google")
{ $status = "OK" }
elseif ($nslookupResult -like "DNS request timed out")
{ $status = "FALSE DNS" }
else
{ $status = "Unknown status" }
Write-Output "$server $status" | Out-File -FilePath "C:\temp\DNS_Check.txt" -Append
}
Спасибо, все получилось
Как Вы авторизовали ДНС сервера в Kerio Control?
Создал правило, разрешающее трафик в интернет для сервера DNS
Спасибо большое за эту и другие ваши статьи, очень выручаете! Месяц бился с этим.
Есть ещё варианты, например, при использовании готовых программ для блокировки телеметрии, особенно тех, которые лезут в host файл, может получиться так, что станет недоступен адрес dns.msftncsi.com, так вот если при загрузке системы она не получит от него ответ, то при наличии интернета система будет сообщать об его отсутствии, к этому чувствительны сервисы гугл и майкрософт точно, про остальные сказать не готов.
Спасибо, все получилось. Долго не мог понять в чем косяк…