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

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

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

Скажем, у меня есть несколько интерфейсов, все активные, некоторые без указанного DNS-сервера, некоторые сказали определять его автоматически, а некоторые с ним указаны вручную (в интерфейсе ipv4 AND interface ipv6).

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

Спасибо

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

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

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

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

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

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

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

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

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

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

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

Ссылки:

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

См. Эту статью в службе поддержки Microsoft для Объяснение функции автоматической метрики для маршрутов IPv4.

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

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

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

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

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

Что ж, вы можете проверить это на практике.

nslookup 192.168.3.6

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

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

Нам это особенно нужно, когда мы пользуемся VPN-клиентами.

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

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

Итак, вы идете Центр управления сетями и общим доступом -> Изменить настройки адаптера -> Дополнительно -> Расширенные настройки -> и перемещаете НИКАК с DNS, который вы хотите ИСПОЛЬЗОВАТЬ. (ВВЕРХ нужно поднять ВВЕРХ).

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

Чем ты занимаешься.

Вы открываете реестр.

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}

Вот и все. Перезагружать не нужно.

Теперь ваши окна будут использовать DNS, указанный в shrew vpn nic, когда вы используете соединение vpn.

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

Однако публичный DNS-сервер, назначенный Wi-Fi-маршрутизатором, имеет прецедент и либо утверждает, что хосты не существуют, либо отвечают с неожиданным 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   <--- There's my NIC with my fave 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   <--- Awesome!!! My fave DNS is now on top!!
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 более предсказуемым. Попробуйте установить 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 называется "хостами" без расширения. Это позволяет вам перенаправлять URL-запросы вместо отправки в стандартный DNS. На локальный сервер (который должен быть запущен и прослушивать порт 80)