Как Windows решает, какой DNS-сервер использовать при разрешении имен?

Вопрос или проблема

Какой алгоритм использует Windows, чтобы решить, какой DNS-сервер запросить для разрешения имён?

Допустим, у меня есть несколько активных интерфейсов: у некоторых DNS-сервер не указан, у некоторых он определяется автоматически, а у некоторых указан вручную (в интерфейсе ipv4 и интерфейсе ipv6).

Я задаю этот общий вопрос, надеясь, что смогу решить более конкретную задачу в Windows Vista — у меня два интерфейса, один с меньшим метриком и вручную указанным DNS-сервером. nslookup использует ЭТОТ DNS-сервер и корректно разрешает имена. Однако все остальные приложения не могут разрешить имя, если я вручную не укажу DNS-сервер для другого интерфейса, который потом и используют приложения. nslookup также использует DNS-сервер, указанный для этого другого интерфейса, когда он задан.

Спасибо

Если я не ошибаюсь, это определяется порядком связывания сетевых адаптеров в расширенных настройках в папке сетевых подключений. Вы можете это проверить, изменив порядок связывания различных сетевых адаптеров и запустив nslookup в качестве теста.

Чтобы расширить мой ответ, цитируя статью, которая связана с Эваном, приведу выдержку из этой статьи:

Служба DNS-клиента запрашивает DNS-сервера в следующем порядке:

  1. DNS-клиент отправляет запрос на имя на первый DNS-сервер из списка DNS-серверов предпочтительного адаптера и ждет одну секунду для получения ответа.

  2. Если DNS-клиент не получает ответа от первого DNS-сервера в течение одной секунды, он отправляет запрос на имя на первые DNS-сервера на всех адаптерах, которые еще рассматриваются, и ждет две секунды для получения ответа.

  3. Если DNS-клиент не получает ответа ни от одного DNS-сервера в течение двух секунд, он отправляет запрос на все DNS-серверы на всех адаптерах, которые еще рассматриваются, и ждет еще две секунды для получения ответа.

  4. Если DNS-клиент все еще не получает ответа от какого-либо DNS-сервера, он отправляет запрос на имя на все DNS-сервера на всех адаптерах, которые еще рассматриваются, и ждет четыре секунды для получения ответа.

  5. Если услуга DNS-клиента не получает ответа от какого-либо DNS-сервера, она отправляет запрос на все DNS-серверы на всех адаптерах, которые еще рассматриваются, и ждет восемь секунд для получения ответа.

Предпочтительный адаптер в шаге 1 – это адаптер, который указан первым в порядке связывания.

В Windows 10 необходимо обновить метрику каждого интерфейса в желаемом порядке.

  1. Перейдите в Панель управления > Сеть и Интернет > Сетевые подключения
  2. Щелкните правой кнопкой мыши по нужному подключению (подключение с более высоким приоритетом)
  3. Выберите Свойства > Протокол интернета версии 4
  4. Щелкните Свойства > Дополнительно
  5. Снимите галочку “Автоматическая метрика”
  6. Введите 10 в “Метрика интерфейса”
  7. Нажмите ОК

Ссылки:

Я использовал 10 для своего LAN, 20 для WLAN и 100 для VPN интерфейсов (я предпочитаю локальный DNS на работе, но у других может быть наоборот). Помните, меньшая метрика = более высокий приоритет.

Просмотрите эту статью на сайте Microsoft Support An explanation of the Automatic Metric feature for IPv4 routes.

Я подозреваю, что это работает потому, что часть выбора маршрута является установкой IP-источника интерфейса с самым высоким приоритетом метрики (наименьшая цифра), так как вы не используете одинаковый IP-адрес для всех подключений, в то время как двухпортовое BGP -подключение использовало бы один и тот же IP-источник, но выбирало бы разные шлюзы следующего перехода в зависимости от IP-назначения.

Для сервера установите службу DNS и сделайте что-то целенаправленное/интеллектуальное, я не согласен делать это на серверной ОС.

Чтобы конкретно ответить на вопрос, Windows использует первые DNS-записи, связанные с сетью с наивысшим рангом (интерфейс с меньшим значением InterfaceMetric имеет более высокий ранг). Примеры ниже показывают, как получить и изменить значение ранга интерфейса. Если на интерфейсе не настроены ручные DNS-сервера, Windows полагается на DNS-сервера, предоставленные любым DHCP-сервером, связанным с сетевым интерфейсом.

Одна из частых ситуаций, когда эта проблема возникает, заключается в том, что у вас есть одна или несколько VPN, предоставляющих DNS-сервер для ресурсов, определенных для этой виртуальной сети.

Однако публичный DNS-сервер, назначенный роутером WiFi, имеет приоритет и либо заявляет, что хосты не существуют, либо отвечает неожиданным IP-адресом.

Чтобы разрешить это, нам нужно четко указать, какой сетевой интерфейс должен иметь приоритет, указав его ассоциированную “метрику”. (В настоящее время эта метрика может быть установлена только через PowerShell … см. ниже)

Изменение метрики сетевого интерфейса (например, VPN)

Сначала, список локальных интерфейсов и их метрики

C:\> Get-NetIPInterface | Select-Object -Property InterfaceAlias, InterfaceMetric | Sort-Object -Property InterfaceMetric

InterfaceAlias               InterfaceMetric
--------------               ---------------
vEthernet (DockerNAT)                     15
Npcap Loopback Adapter                    25
Ethernet 11                               25
Local Area Connection* 1                  25
Local Area Connection* 2                  25
Npcap Loopback Adapter                    25
Ethernet 2                                35
Wi-Fi                                     55
Bluetooth Network Connection              65
Loopback Pseudo-Interface 1               75
MY VPN                                   200   <--- Вот мой NIC с моим любимым DNS
vEthernet (Default Switch)              5000

Затем установите метрику сетевого интерфейса

(ЗАМЕЧАНИЕ: Убедитесь, что вы делаете это из административной консоли PowerShell)

C:\>  Set-NetIPInterface -InterfaceAlias "MY VPN" -InterfaceMetric 10
C:\> Get-NetIPInterface | Select-Object -Property InterfaceAlias, InterfaceMetric | Sort-Object -Property InterfaceMetric

InterfaceAlias               InterfaceMetric
--------------               ---------------
MY VPN                                    10   <--- Отлично!!! Мой любимый DNS теперь на вершине!!
vEthernet (DockerNAT)                     15
Npcap Loopback Adapter                    25
Ethernet 11                               25
Local Area Connection* 1                  25
Local Area Connection* 2                  25
Npcap Loopback Adapter                    25
Ethernet 2                                35
Wi-Fi                                     55
Bluetooth Network Connection              65
Loopback Pseudo-Interface 1               75
vEthernet (Default Switch)              5000

Тестирование эффекта метрики интерфейса

В этом примере до изменения значения метрики пингование локального ресурса, который также имеет публично определенный IP, возвращает его публичный IP (вместо внутреннего IP, возвращаемого DNS-сервером моего VPN).

Пример, когда плохо! 🙁

> ping 10640-TEST

Pinging 10640-TEST.example.com [XX.163.171.155] with 32 bytes of data:
Reply from XX.163.171.155: bytes=32 time=80ms TTL=45
Reply from XX.163.171.155: bytes=32 time=76ms TTL=45

Пример, когда хорошо! 🙂

После изменения метрики сетевого интерфейса я теперь вижу ожидаемый внутренний IP-адрес, который возвращается DNS-сервером, связанным с моим VPN:

> ping 10640-TEST

Pinging 10640-TEST.example.com [192.168.100.44] with 32 bytes of data:
Reply from 192.168.100.44: bytes=32 time=42ms TTL=127
Reply from 192.168.100.44: bytes=32 time=52ms TTL=127

Эта страница описывает алгоритм, используемый Windows для выполнения DNS-запросов. Она не достаточно подробна, чтобы дать вам все ответы, которые вы ищете, но некоторое время с анализатором и эта статья должны быть всем, что вам нужно, чтобы понять, что происходит в вашей конкретной ситуации.

У меня была точно такая же проблема. Я потратил день, пытаясь это выяснить.

Если у вас несколько сетевых карт и если вы указываете DNS-сервер в каждой из них, знаете ли вы, какой DNS-сервер будет использоваться?

Что ж, вы можете это проверить с помощью:

nslookup 192.168.3.6

Итак, вы видите сервер, который ваш ПК на самом деле использует.

Вопрос: как Windows выбирает, какой DNS-сервер использовать, и как мы можем это изменить.

Это особенно необходимо, когда мы используем VPN-клиенты.

Ответ от qwerty2010 правильный и корректный. Но вы можете использовать его ТОЛЬКО тогда, когда у вас есть сетевой адаптер в панели управления – центр сети и общего доступа – изменить настройки адаптера – список сетевых карт

Только если вы видите сетевой адаптер, который отвечает за ваш VPN-клиент, вы можете использовать графический интерфейс.

Итак, вы переходите Центр сети и общего доступа -> Изменить параметры адаптера -> Дополнительно -> Расширенные настройки -> и перемещаете ВВЕРХ сетевой адаптер с DNS, который вы хотите использовать.

Однако, если, например, вы используете клиент Shrew VPN – у вас не будет сетевых карт.

Что вы делаете? Вы открываете реестр.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

И ищете в папках 0000, 0001 и так далее, папку с

DriverDesc = Shrew Soft Virtual Adapter

Затем копируете в буфер обмена

NetCfgInstanceId = {B498E7DE-7257-48F6-AD32-60E470030F05}

Теперь переходите

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Linkage]

и открываете key = Bind. Вы увидите список, который выглядит так:

\Device\{1DF89CE3-CAAD-4EB7-A53F-AD16BC1D5EFD}
\Device\{70126DBE-B44D-4392-9417-0CABD6E384B1}
\Device\{D5127F8E-E7BB-4661-AE5A-A922614173D0}
\Device\{C44039AB-6801-4A9B-A736-3B12782FF411}
\Device\{85231D0F-CD05-4774-A983-632C5D83AC62}
\Device\{7E87BC81-8C58-4E05-9FA0-7897A6AA5CCE}
\Device\{3A1A3EFC-A9DE-4BCA-BAF6-81C7074487E0}
\Device\{8D41EDFC-04AC-4537-B5D5-0D54EB51A023}

Вам нужно просто переместить наверх

\Device\{B498E7DE-7257-48F6-AD32-60E470030F05}
\Device\{1DF89CE3-CAAD-4EB7-A53F-AD16BC1D5EFD}
\Device\{70126DBE-B44D-4392-9417-0CABD6E384B1}
\Device\{D5127F8E-E7BB-4661-AE5A-A922614173D0}
\Device\{C44039AB-6801-4A9B-A736-3B12782FF411}
\Device\{85231D0F-CD05-4774-A983-632C5D83AC62}
\Device\{7E87BC81-8C58-4E05-9FA0-7897A6AA5CCE}
\Device\{3A1A3EFC-A9DE-4BCA-BAF6-81C7074487E0}
\Device\{8D41EDFC-04AC-4537-B5D5-0D54EB51A023}

Вот и все. Нет необходимости перезагружать.

Теперь Windows будет использовать DNS, указанный в Shrew VPN, когда вы используете VPN-соединение.

В Windows 10 и 11 приоритет DNS определяется метрикой интерфейса, это документировано здесь – DNS-серверы на интерфейсе с наименьшим значением метрики будут использоваться первыми.

Важно отметить, что интерфейс фактически имеет два значения метрики интерфейса, одно для IPv4 и одно для IPv6.

Вы можете настроить их либо через:

Панель управления -> Центр управления сетями и общим доступом -> Изменить параметры адаптера -> Свойства Ethernet -> Протокол интернета версии 4/6 -> Дополнительно -> Метрика интерфейса

Или через PowerShell:

Set-NetIPInterface -InterfaceAlias "Ethernet" -AddressFamily IPv4 -InterfaceMetric 50
Set-NetIPInterface -InterfaceAlias "Ethernet" -AddressFamily IPv6 -InterfaceMetric 50

Для целей DNS учитывается наименьшее из двух значений, другими словами список интерфейсов сортируется по min(Ipv4Metric, Ipv6Metric).

Каждый интерфейс (например, Ethernet или Wi-Fi) затем имеет список DNS-серверов, но в этом списке сначала появляются серверы IPv6.

Вот пример сценария:

Интерфейс IPv4 метрика IPv6 метрика Мин метрика IPv6 DNS IPv4 DNS
Ethernet 1 50 50 50 2001:db8::1 10.1.1.1
Ethernet 2 10 50 10 10.2.2.2

Windows сначала находит лучший интерфейс — Ethernet 2, поскольку у него наименьшая метрика, и, следовательно, будет использовать DNS-сервер 10.2.2.2

Следующий лучший интерфейс — Ethernet 1, Windows попытается 2001:db8::1, так как сначала используются серверы IPv6 DNS. И, наконец, 10.1.1.1

Примечание: Смотрите мои эксперименты, которые это доказывают

Редактировать: хотя команда nslookup по умолчанию использует IPv6 адрес, в зависимости от используемого метода вызова API, Windows приложения могут использовать либо только IPv6, либо запрашивать сразу оба сервера IPv6/IPv4. Параметр InterfaceMetric не влияет на это поведение.

Как это может помочь вам или другим, вы можете отключить круговое использование перечисленных DNS в Windows, чтобы сделать использование DNS более предсказуемым. Попробуйте установить RoundRobin=0 в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DNS\Parameters (справка) чтобы отключить круговое использование DNS.

Также существует “тайм-аут” для вращения серверов, вы также можете попробовать установить его в ноль:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters
 ServerPriorityTimeLimit=0

Это не решается случайным образом. Вы подключены к роутеру, который получает свой IP от компании, имеющей DNS-серверы. Они получают ваш запрос, если вы не измените IP вручную на другой DNS, например, OpenDns. Или вы можете задать свои собственные DNS-серверы. Это также работает. Просто введите IP-адреса в центр сети, и все должно быть в порядке. И да, вам придется задавать их вручную.

Вы также можете изменить файл в C:\Windows\System32 под названием “hosts” без расширения. Это позволяет перенаправлять запросы URL вместо того, чтобы отправлять их на стандартный DNS. На локальный сервер (который должен быть запущен и слушать на порту 80)

.

Ответ или решение

Вопрос о том, как Windows выбирает DNS-сервер для разрешения имен, встает перед многими пользователями в условиях мультинетворкинга, когда системы подключены к нескольким сетям одновременно. Понимание того, какие факторы влияют на выбор DNS-сервера, может быть критически важным для оптимизации работы сетевых приложений и обеспечения корректного разрешения имен. Рассмотрим теорию, пример и применение этой технологии в Windows.

Теория

Система Windows определяет, какой DNS-сервер использовать, основываясь на нескольких критериях, таких как приоритет интерфейса сетевого подключения и порядок настроек DNS на различимы разными адаптерами сети. Ключевым элементом здесь является "метрика интерфейса" (Interface Metric), которая определяет приоритетность использования адаптера. Интерфейс с наименьшей метрикой получает более высокий приоритет. Эта метрика автоматически устанавливается системой, но может быть вручную настроена через параметры сетевого адаптера или с помощью команд PowerShell.

Кроме того, Windows использует алгоритм поэтапного пересылки запросов к DNS-серверам. Если первый DNS-сервер не отвечает в течение одной секунды, то запрос отправляется ко всем серверам на всех интерфейсах. Для IPv4 и IPv6 существуют отдельные списки DNS-серверов: исходно обращение идет сначала к IPv6 серверам, если они присутствуют.

Пример

Рассмотрим стандартный сценарий: у вас есть несколько активных интерфейсов, включая VPN, Ethernet и Wi-Fi. Каждый из них может иметь собственные настройки DNS, установленные вручную или автоматически. Один из интерфейсов (например, Ethernet) может иметь метрику интерфейса, равную 10, в то время как Wi-Fi — 20. В этом случае запросы к DNS, как правило, будут сначала отправлены по интерфейсу Ethernet. Если для Ethernet и IPv6 и IPv4 метрики имеют одно и то же значение, система сначала проверит список DNS-серверов для IPv6.

Чтобы установить метрику интерфейса вручную, можно использовать PowerShell:

Set-NetIPInterface -InterfaceAlias "Ethernet" -InterfaceMetric 10

Это приведет к тому, что для интерфейса "Ethernet" будет использоваться метрика 10, что, в свою очередь, повысит приоритет этого интерфейса при выборе DNS-сервера.

Применение

Знание алгоритма выбора DNS-сервера в Windows особенно важно в корпоративной среде, где неправильный выбор сервера DNS может привести к задержкам в разрешении имен и даже к невозможности доступа к внутренним ресурсам сети компании. При использовании VPN, неправильный выбор DNS может привести к тому, что внешние серверы не смогут правильно резолвить внутренние доменные имена.

Также, во избежание конфликта DNS, может быть полезна корректная настройка файла hosts, который находится в директории C:\Windows\System32\drivers\etc\. Он позволяет локально переопределять адреса некоторых ресурсов, не обращаясь к DNS-серверу для их разрешения. Увы, это костыльная мера, и она не должна быть основной стратегией в управлении DNS-резолвингом.

В конечном итоге, корректная настройка и понимание того, как система Windows выбирает DNS-сервер, позволяет значительно улучшить сетевую производительность и надежность. Это критично важно для обеспечения эффективной работы как домашних пользователей, так и корпоративных сетей, обеспечивая быструю и надежную связь с необходимыми интернет-ресурсами и внутренними сетями.

Оцените материал
Добавить комментарий

Капча загружается...