Содержание

Маршрутизация запросов DNS (NRPT) при использовании нескольких туннелей WireGuard

Требуется доступ к нескольким корпоративным сетям, в которых есть сервисы, доступные только изнутри. Сам доступ обеспечивается несколькими VPN-подключениями. Но как быть с DNS?

Возьмём для примера следующую конфигурацию сети:

WireGuard multisite network design
Схема сети
Клиентская ОС — Windows 10, официальный клиент — WireGuard.
Изначальная конфигурация туннеля до example.org с маршрутизацией всего трафика:

ini

[Interface]
PrivateKey = WCyC+paCiPG4Uoo3KgjQJs66UVmr2pnIw8/QVMxy0XE=
Address = 10.2.10.111/24
DNS = 10.2.1.2

[Peer]
PublicKey = lVRqsn0AhI9rERWJsE/NxclRFbzR4yKSpeBlZ65IagU=
AllowedIPs = 0.0.0.0/0
Endpoint = wg.example.org

Изначальная конфигурация туннеля до consto.net с маршрутизацией всего трафика:

ini

[Interface]
PrivateKey = aKQOplUyh8YSCr+ryLbgAyB+3u0x7rqdRWiN9AVWdG8=
Address = 10.1.10.111/24
DNS = 10.1.1.2

[Peer]
PublicKey = R5NnvwRnOz8ojVu55UMFg/zZp/pB6MCxANmBFHnbvjs=
AllowedIPs = 0.0.0.0/0
Endpoint = wg.consto.net

Нужно направить запросы DNS для домена example.org на сервер 10.2.1.2, а для домена consto.net — на сервер 10.1.1.2. При этом в качестве основного DNS используется, например, сервер 1.1.1.1. Для решения задачи будем использовать NRPT (Name Resolution Policy Table) Windows и PostUp, PostDown скрипты клиента WireGuard.

Пример команды для добавления записей маршрутизации DNS:

powershell

@('.domain1.org', 'domain2.net') | 
foreach { Add-DnsClientNrptRule -Namespace $_ -NameServers 192.168.10.10 }

Пример команды удаления записей маршрутизации DNS:

powershell

Get-DnsClientNrptRule | 
where Namespace -in '.domain1.org', 'domain2.net' | 
foreach { Remove-DnsClientNrptRule -Name $_.Name -Force }

Посмотреть текущие записи можно командой Get-DnsClientNrptRule или в Local Group Policy Editor -> Computer Configuration -> Windows Settings -> Name Resolution Policy.

Для активации выполнения скриптов нужно добавить параметр в реестр:

cmd

reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f

Исправленная конфигурация туннеля до example.org, маршрутизируется только трафик до этой сети, а также DNS:

ini

[Interface]
PrivateKey = WCyC+paCiPG4Uoo3KgjQJs66UVmr2pnIw8/QVMxy0XE=
Address = 10.2.10.111/24
PostUp = powershell.exe -Command "@('.example.org') | foreach { Add-DnsClientNrptRule -Namespace $_ -NameServers 10.2.1.2 }"
PostDown = powershell.exe -Command "Get-DnsClientNrptRule | where Namespace -in '.example.org' | foreach { Remove-DnsClientNrptRule -Name $_.Name -Force }"

[Peer]
PublicKey = lVRqsn0AhI9rERWJsE/NxclRFbzR4yKSpeBlZ65IagU=
AllowedIPs = 10.2.0.0/16
Endpoint = wg.example.org

Исправленная конфигурация туннеля до consto.net, маршрутизируется только трафик до этой сети, а также DNS:

ini

[Interface]
PrivateKey = aKQOplUyh8YSCr+ryLbgAyB+3u0x7rqdRWiN9AVWdG8=
Address = 10.1.10.111/24
PostUp = powershell.exe -Command "@('.consto.net') | foreach { Add-DnsClientNrptRule -Namespace $_ -NameServers 10.1.1.2 }"
PostDown = powershell.exe -Command "Get-DnsClientNrptRule | where Namespace -in '.consto.net' | foreach { Remove-DnsClientNrptRule -Name $_.Name -Force }"

[Peer]
PublicKey = R5NnvwRnOz8ojVu55UMFg/zZp/pB6MCxANmBFHnbvjs=
AllowedIPs = 10.1.0.0/16
Endpoint = wg.consto.net

При перезагрузке скрипты PostDown не срабатывают. Wireguard пытается подключиться к серверу, имя которого нужно разрешить в DNS, находящемся за туннелем. Требуется очищать записи NRPT. Для этого нужно создать системную задачу: Cleanup NRPT.xml.

  1. Client DNS with multiple VPN connections
  2. How to do split DNS with Wireguard on Windows
  3. The NRPT
  4. Procedure: Configure the NRPT
  5. Add-DnsClientNrptRule
  6. WireGuard Registry Keys for Admins