Маршрутизация запросов DNS (NRPT) при использовании нескольких туннелей WireGuard
Требуется доступ к нескольким корпоративным сетям, в которых есть сервисы, доступные только изнутри. Сам доступ обеспечивается несколькими VPN-подключениями. Но как быть с DNS?
Введение
Возьмём для примера следующую конфигурацию сети:

Изначальная конфигурация туннеля до example.org с маршрутизацией всего трафика:
[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 с маршрутизацией всего трафика:
[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.
NRPT
Пример команды для добавления записей маршрутизации DNS:
@('.domain1.org', 'domain2.net') |
foreach { Add-DnsClientNrptRule -Namespace $_ -NameServers 192.168.10.10 }
Пример команды удаления записей маршрутизации DNS:
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.
WireGuard
Для активации выполнения скриптов нужно добавить параметр в реестр:
reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f
Исправленная конфигурация туннеля до example.org, маршрутизируется только трафик до этой сети, а также DNS:
[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:
[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
Задача очистки NRPT
При перезагрузке скрипты PostDown не срабатывают. Wireguard пытается подключиться к серверу, имя которого нужно разрешить в DNS, находящемся за туннелем.
Требуется очищать записи NRPT. Для этого нужно создать системную задачу: Cleanup NRPT.xml.