Вопрос или проблема
Какой алгоритм использует Windows, чтобы решить, какой DNS-сервер запросить для разрешения имён?
Допустим, у меня есть несколько активных интерфейсов: у некоторых DNS-сервер не указан, у некоторых он определяется автоматически, а у некоторых указан вручную (в интерфейсе ipv4 и интерфейсе ipv6).
Я задаю этот общий вопрос, надеясь, что смогу решить более конкретную задачу в Windows Vista — у меня два интерфейса, один с меньшим метриком и вручную указанным DNS-сервером. nslookup использует ЭТОТ DNS-сервер и корректно разрешает имена. Однако все остальные приложения не могут разрешить имя, если я вручную не укажу DNS-сервер для другого интерфейса, который потом и используют приложения. nslookup также использует DNS-сервер, указанный для этого другого интерфейса, когда он задан.
Спасибо
Если я не ошибаюсь, это определяется порядком связывания сетевых адаптеров в расширенных настройках в папке сетевых подключений. Вы можете это проверить, изменив порядок связывания различных сетевых адаптеров и запустив nslookup в качестве теста.
Чтобы расширить мой ответ, цитируя статью, которая связана с Эваном, приведу выдержку из этой статьи:
Служба DNS-клиента запрашивает DNS-сервера в следующем порядке:
DNS-клиент отправляет запрос на имя на первый DNS-сервер из списка DNS-серверов предпочтительного адаптера и ждет одну секунду для получения ответа.
Если DNS-клиент не получает ответа от первого DNS-сервера в течение одной секунды, он отправляет запрос на имя на первые DNS-сервера на всех адаптерах, которые еще рассматриваются, и ждет две секунды для получения ответа.
Если DNS-клиент не получает ответа ни от одного DNS-сервера в течение двух секунд, он отправляет запрос на все DNS-серверы на всех адаптерах, которые еще рассматриваются, и ждет еще две секунды для получения ответа.
Если DNS-клиент все еще не получает ответа от какого-либо DNS-сервера, он отправляет запрос на имя на все DNS-сервера на всех адаптерах, которые еще рассматриваются, и ждет четыре секунды для получения ответа.
Если услуга DNS-клиента не получает ответа от какого-либо DNS-сервера, она отправляет запрос на все DNS-серверы на всех адаптерах, которые еще рассматриваются, и ждет восемь секунд для получения ответа.
Предпочтительный адаптер в шаге 1 – это адаптер, который указан первым в порядке связывания.
В Windows 10 необходимо обновить метрику каждого интерфейса в желаемом порядке.
- Перейдите в Панель управления > Сеть и Интернет > Сетевые подключения
- Щелкните правой кнопкой мыши по нужному подключению (подключение с более высоким приоритетом)
- Выберите Свойства > Протокол интернета версии 4
- Щелкните Свойства > Дополнительно
- Снимите галочку “Автоматическая метрика”
- Введите 10 в “Метрика интерфейса”
- Нажмите ОК
Ссылки:
Я использовал 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-сервер, позволяет значительно улучшить сетевую производительность и надежность. Это критично важно для обеспечения эффективной работы как домашних пользователей, так и корпоративных сетей, обеспечивая быструю и надежную связь с необходимыми интернет-ресурсами и внутренними сетями.