Чи не працює дозвіл імен DNS при активному VPN підключенні в Windows 10

У Windows 10 при активному VPN підключенні в режимі Force Tunneling (Включена опція "Use default gateway on remote network" / "Використовувати основний шлюз в віддаленої мережі") для розпізнавання імен через службу DNS використовуються DNS сервера і суфікси, налаштовані для VPN підключення. Відповідно, ви втрачаєте можливість ні перетворювати DNS імена в своїй локальній мережі і користуватися Інтернетом через внутрішню LAN.

При цьому з Windows 10 можна виконати ping до ресурсів у вашій LAN мережі (пропінгуйте ваш шлюз, сусідній комп'ютер або принтер), але по імені вони не доступні, тому що Windows намагається вирішити імена в локальній мережі через DNS сервера, зазначені для VPN з'єднання.

В Google я знайшов рекомендації щодо відключення IPv6 на локальному (LAN) підключенні і це працює (якщо ви хочете використовувати Force-Tunneling).

Якщо для VPN підключення використовується режим Split Tunneling (Знята галка "Use default gateway on remote network"), ви можете користуватися інтернетом через свою локальну мережу, але не можете ні перетворювати DNS адреси у віддаленій VPN мережі (в цьому випадку не допомагає відключення IPv6).

Потрібно розуміти, що Windows відправляє DNS запит з мережевого інтерфейсу, у якого вищий пріоритет (менше значення метрики інтерфейсу). Припустимо, ваше VPN підключення працює в режимі Split Tunneling (ви хочете користуватися інтернетом через свою LAN і корпоративними ресурсами через VPN підключення).

За допомогою PowerShell перевірте значення метрик всіх мережевих інтерфейсів:

Get-NetIPInterface | Sort-Object Interfacemetric

На зображенні вище видно, що у локального Ethernet підключення вказана нижча метрика (25), ніж у VPN інтерфейсу (в цьому прикладі 100). Відповідно, DNS трафік йде через інтерфейс з більш низьким значенням метрики. Це означає, що ваші DNS запити відправляються на ваші локальні DNS сервера, а не на DNS сервера VPN підключення. Тобто в такій конфігурації ви не можете ні перетворювати адреси в зовнішній VPN мережі.

Крім того, потрібно обов'язково згадати нову фічу DNS клієнта в Windows 8.1 і Windows 10. У цих версіях ОС для максимально швидкого отримання відповідей на DNS запити був доданий функціонал DNS релолвера під назвою Smart Multi-Homed Name Resolution (SMHNR). При використанні SMHNR система за замовчуванням відправляє DNS запити на всі відомі системі DNS сервера паралельно і використовує ту відповідь, який прийшов швидше. Це небезпечно, тому що потенційно зовнішні DNS сервера (які вказані в вашому VPN підключенні) можуть бачити ваші DNS запити (витік ваших DNS запитів зовні). Ви можете відключити SMHNR в Windows 10 за допомогою групової політики:

Computer Configuration -> Administrative Templates -> Network -> DNS Client-> Turn off smart multi-homed name resolution = Enabled.

Або командами (для Windows 8.1):

Set-ItemProperty -Path "HKLM: \ Software \ Policies \ Microsoft \ Windows NT \ DNSClient" -Name DisableSmartNameResolution -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM: \ SYSTEM \ CurrentControlSet \ Services \ Dnscache \ Parameters" -Name DisableParallelAandAAAA -Value 1 -Type DWord

У Windows 10 Creators Update (1709) і вище DNS запити відправляються на всі відомі DNS сервера по порядку, а не паралельно. Ви можете збільшити пріоритет конкретного DNS, якщо зменшите його метрику.

Відповідно, зміна метрики дозволить вам відправляти DNS запити через мережевий інтерфейс (LAN або VPN), дозвіл імен через який для вас більш пріоритетно.

Отже, чим менше значення метрики інтерфейсу, тим більше пріоритет такого підключення. Windows виставляє метрику IPv4 мережних інтерфейсів автоматично в залежності від їх швидкості і типу. Наприклад, для LAN підключення з швидкістю> 200 Мбіт значення метрики інтерфейсу 10, а для бездротового Wi-FI підключення зі швидкістю 50-80 Мбіт метрика 50 (див. Таблицю https://support.microsoft.com/en-us/help/ 299540 / an-explanation-of-the-automatic-metric-feature-for-ipv4-routes).

Ви можете змінити метрику інтерфейсу через графічний інтерфейс, PowerShell або команду netsh.

Наприклад, ви хочете, щоб DNS запити відправлялися через VPN підключення. Вам потрібно збільшити метрики ваших локальних LAN підключений, щоб вони стали більше 100 (в моєму прикладі).

Відкрийте Панель управління -> Мережа та Інтернет -> Мережеві підключення, відкрийте властивості вашого Ethernet підключення, виберіть властивості протоколу TCP / IPv4, перейдіть на вкладку "Розширені можливості пошуку TCP / IP". Зніміть галку "Автоматичне призначення метрики"І змініть метрику інтерфейсу на 120.

Теж саме можна зробити командами PowerShell управління мережею (використовуйте індекс вашого LAN інтерфейсу, отриманий за допомогою командлета Get-NetIPInterface):

Set-NetIPInterface -InterfaceIndex 11 -InterfaceMetric 120

Або netsh (потрібно вказати ім'я вашого LAN підключення)

netsh int ip set interface interface = "Ethernet 3" metric = 120

Аналогічно ви можете зменшити значення метрики у властивостях VPN підключення.

Також ви можете змінити налаштування вашого VPN підключення, змінивши режим на SplitTunneling і вказати DNS суфікс для підключення c допомогою PowerShell:

Get-VpnConnection
Set-VpnConnection -Name "VPN" -SplitTunneling $ True
Set-VpnConnection -Name "VPN" -DnsSuffix yourdomain.com