我想做的是为某些应用程序提供一个单独的接口,以通过 WireGuard 使用 VPN,而所有其他应用程序都使用我的常规接口(应用程序拆分隧道)。我已经解决了如何让特定应用程序使用我的 WireGuard 界面。
我现在的问题是,当我的 WireGuard 隧道打开时,我的所有机器流量都通过我的 VPN 引导。
我尝试allowedIPs = 0.0.0.0/0, ::/0
从下方移除[Peer]
,这导致我的隧道不允许从我的应用程序到互联网的流量。
我还尝试添加Table = off
到 under[Interface]
以禁用 WireGuard 将我的隧道添加到我的系统路由表。发生这种情况的是 WireGuard 拒绝保存或导入配置,并以“[Interface] 部分的无效密钥:“表”作为响应。
我正在为 Windows v0.3.14 使用 WireGuard。
有没有其他方法可以做到这一点?
我的一个朋友在 WireGuard 的 zx2c4 (Jason Donenfeld) 的帮助下帮助我解决了这个问题。我在这里为下一个遇到同样问题的人分享我们的解决方案。
WireGuard for Windows 添加了对
Table = off
v0.3.15 的支持。这使得 WireGuard 在隧道打开时不会更新路由表。此时我们有一个隧道,但即使它是应用程序的唯一适配器,Windows 也不会通过它路由流量。为了解决这个问题,我们需要向适配器添加一个默认路由,其优先级低于我们的常规默认路由。
为此,我们首先需要在 WireGuard 中启用DangerousScriptExecution 。为此,我们需要将注册表项设置
HKEY_LOCAL_MACHINE\Software\WireGuard\DangerousScriptExecution
为DWORD(1)
使用 regedit。密钥默认不存在,需要使用 regedit 创建。然后需要重新启动 WireGuard。完成此操作后,我们需要在启动和停止隧道时运行一些 PowerShell 命令来为隧道创建默认路由。此路由需要比我们正常的默认路由具有更高的度量/成本(更低的优先级)。对于此解决方案,我们使用了 95 的指标值(比最高自动指标高 10)。
WireGuard 能够自动执行在隧道配置中的 、 、 和 选项中
PreUp
指定PostUp
的PreDown
windows命令。PostDown
我们使用它来自动设置我们的路线。WireGuard 在
WIREGUARD_TUNNEL_NAME
运行命令时将环境变量设置为此确切隧道的名称。我们可以通过调用将其转换为 PowerShell 对象$wgInterface = Get-NetAdapter -Name %WIREGUARD_TUNNEL_NAME%
。一旦我们将隧道作为 PowerShell 对象,我们就可以在 Windows 中设置或取消我们的路线。
为了创建我们的路线,我们调用
route add 0.0.0.0 mask 0.0.0.0 0.0.0.0 IF $wgInterface.ifIndex metric 95
要删除我们调用的路线
route delete 0.0.0.0 mask 0.0.0.0 0.0.0.0 if $wgInterface.ifIndex metric 95
当我们将所有这些结合在一起时,我们最终会
[Interface]
在隧道配置中得到以下内容。PostUp
,PreDown
, 和Table = off
是这个解决方案给出的。我很想直接回复 Ryan,但我不能¯\_(ツ)_/¯
根据他的回答,我做了一个小小的 powershell helper 脚本。
它可以设置注册表项,重新启动 WireGuard Manager 服务,当然,还可以设置默认路由(还有一个!)
您可以在这里找到它(带有配置示例):https ://gist.github.com/webtroter/36477c014e4cc5f169468891fa7652f2