我想在 Windows 上使用 Wireguard 实现“拆分 DNS”,其中特定域的 DNS 请求由可通过 Wireguard 隧道访问的特定 DNS 服务器解析,而其他 DNS 请求由普通 DNS 服务器解析。
在 Windows 上如何执行此操作?在 Linux 上,我将使用自定义调用,resolvconf
而不是使用DNS=
选项wg-quick
(请参阅wg-quick(8))。
答案1
您可以使用 Windows'NRPT(网络策略响应表)将特定区域中的域名路由到特定 DNS 服务器。NRPT 具有大量其他功能,我们将在此用例中介绍这些功能。
我们将使用过程:使用 Powershell 配置 NRPT为此,利用一些轻量级的 Powershell 脚本和Add-DnsClientNrptRule
cmdlet Get-DnsClientNrptRule
,Remove-DnsClientNrptRule
记录在Powershell dnsclient 参考。
因此,让我们为名为 的隧道配置 NRPT example-tunnel
(隧道名称实际上并不重要),我们希望将所有 DNS 名称路由example.com
到侦听的 DNS 服务器172.16.2.53
:
[Interface]
PrivateKey = KGtxx2By12kE/Ru0qkhM/41H0Lu2JzvCSB8dM61MIX0=
Address = 172.16.1.2/32
PostUp = powershell.exe -Command "& { Add-DnsClientNrptRule -Comment 'wg-example-tunnel' -Namespace '.example.com' -NameServers 172.16.2.53 }"
PostDown = powershell.exe -Command "& { Get-DnsClientNrptRule | where Comment -eq 'wg-example-tunnel' | foreach { Remove-DnsClientNrptRule -Name $_.Name -Force } }"
[Peer]
PublicKey = +ZDFdUwa6NZwI8YVQewnl1bBi1D2qKor8/JPLwj6m0=
Endpoint = 203.0.113.234:51820
AllowedIPs = 172.16.1.0/24, 172.16.2.0/24
启用隧道后,应该有一个 NRPT 规则,它应该如下所示:
PS C:\Users\joost> Get-DnsClientNrptRule | fl -Property Name,Namespace,NameServers,Comment
Name : {6105290F-37C2-439C-A25E-F62A8DCE22AC}
Namespace : {.example.com}
NameServers : 172.16.2.53
Comment : wg-example-tunnel
因此这是PostUp=
命令:
Add-DnsClientNrptRule -Comment 'wg-example-tunnel' -Namespace '.example.com' -NameServers 172.16.2.53
它设置带有管理注释的路由规则,以便我们稍后找到并删除它。
命令如下PostDown=
:
Get-DnsClientNrptRule `
| where Comment -eq 'wg-example-tunnel' `
| foreach { Remove-DnsClientNrptRule -Name $_.Name -Force }
这是一个枚举所有 NRPT 规则的管道,它过滤掉与命令中的管理注释相匹配的规则PostUp=
,然后将其删除。
如果 Wireguard 阻止脚本执行,请创建一个注册表项以启用危险脚本执行。
if (-not (Test-Path -Path HKLM:\SOFTWARE\Wireguard)) {
New-Item -Path HKLM:\SOFTWARE\Wireguard -ItemType Directory -ErrorAction Stop
}
Set-ItemProperty -Path HKLM:\SOFTWARE\Wireguard -Name DangerousScriptExecution -Type DWord -Value 1
Get-ItemProperty -Path HKLM:\SOFTWARE\Wireguard
请阅读 Wireguard-Windows 的安全警告管理员注册表.md启用此功能之前请先阅读文档!