Rya*_*ams 7 windows vpn split-tunnel wireguard
我想做的是为某些应用程序提供一个单独的界面,以便通过 WireGuard 使用 VPN,而所有其他应用程序都使用我的常规界面(按应用程序拆分隧道)。我已经解决了如何让特定应用程序使用我的 WireGuard 接口。
我现在的问题是,当我的 WireGuard 隧道打开时,我的所有计算机流量都通过我的 VPN 定向。
我尝试allowedIPs = 0.0.0.0/0, ::/0从下面删除[Peer],这导致我的隧道不允许从我的应用程序到互联网的流量。
我还尝试添加Table = off到 under[Interface]以禁用 WireGuard 将我的隧道添加到我的系统路由表。发生这种情况是 WireGuard 拒绝保存或导入配置并响应“[Interface] 部分的无效密钥:“表”。
我正在使用 WireGuard for Windows v0.3.14。
还有其他方法可以实现此目的吗?
Rya*_*ams 10
我的一位朋友在 WireGuard 的 zx2c4(Jason Donenfeld)的帮助下帮助我解决了这个问题。我在这里为下一个人遇到同样问题的人分享我们的解决方案。
WireGuard for Windows 在 v0.3.15 中添加了对 Windows 的支持Table = off。这使得 WireGuard 在隧道打开时不会更新路由表。
此时,我们有一个隧道,但 Windows 不会通过它路由流量,即使它是应用程序的唯一适配器。为了解决这个问题,我们需要向适配器添加一条优先级低于常规默认路由的默认路由。
为此,我们需要首先在 WireGuard 中启用DangerousScriptExecution。为此,我们需要使用 regedit 将注册表项设置HKEY_LOCAL_MACHINE\Software\WireGuard\DangerousScriptExecution为DWORD(1)。默认情况下该密钥不存在,需要使用 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是该解决方案给出的结果。
[Interface]
PrivateKey = <...>
Address = <...>
DNS = <...>
PostUp = powershell -command "$wgInterface = Get-NetAdapter -Name %WIREGUARD_TUNNEL_NAME%; route add 0.0.0.0 mask 0.0.0.0 0.0.0.0 IF $wgInterface.ifIndex metric 95"
PreDown = powershell -command "$wgInterface = Get-NetAdapter -Name %WIREGUARD_TUNNEL_NAME%; route delete 0.0.0.0 mask 0.0.0.0 0.0.0.0 if $wgInterface.ifIndex metric 95"
Table = off
[Peer]
PublicKey = <...>
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = <...>
Run Code Online (Sandbox Code Playgroud)
现在我们已经完成了 IPv4 的工作。如果您也想对IPv6执行此操作(可选),请继续下一部分。
如果 IPv6 在主机系统上可用并且 WireGuard 隧道支持,那么我们也可以将其应用于 IPv6。
警告:如果主机系统不在 IPv6 Internet 上,则不应配置通过 WireGuard 的 IPv6 路由,除非可以接受通过隧道发送一些非隧道流量。忽略这一点将导致您混合非隧道和隧道流量(例如:一些个人流量通过工作网络路由)。如果主机位于 IPv6 互联网上,这不会成为问题,因为任何非隧道 IPv6 流量都将通过主机默认 IPv6 接口进行路由。
要对 IPv6 执行此操作,我们需要在启动和停止隧道时运行一些 PowerShell 命令,以便为隧道创建默认 IPv6 路由。该路由还需要比我们正常的默认路由具有更高的度量(更低的优先级)。对于此解决方案,我们使用的度量值为 205(比最高自动 IPv6 度量值 50 高 155)。我们还需要确保该路由不是持久的,因此如果由于任何原因脚本未将其删除,它将在下次启动时自动删除。
为了创建我们的 IPv6 路由,我们调用netsh interface ipv6 add route prefix= ::0/0 interface= $wgInterface.name metric= 205 store= active
要删除我们的 IPv6 路由,我们调用netsh interface ipv6 delete route prefix= ::0/0 interface= $wgInterface.name
这些 PowerShell 命令需要添加到隧道配置的PostUp末尾。进行此更改后,我们应该在隧道配置中PreDown得到以下内容PostUp和行。PreDown
PostUp = powershell -command "$wgInterface = Get-NetAdapter -Name %WIREGUARD_TUNNEL_NAME%; route add 0.0.0.0 mask 0.0.0.0 0.0.0.0 IF $wgInterface.ifIndex metric 95; netsh interface ipv6 add route prefix= ::0/0 interface= $wgInterface.name metric= 205 store= active"
PreDown = powershell -command "$wgInterface = Get-NetAdapter -Name %WIREGUARD_TUNNEL_NAME%; route delete 0.0.0.0 mask 0.0.0.0 0.0.0.0 if $wgInterface.ifIndex metric 95; netsh interface ipv6 delete route prefix= ::0/0 interface= $wgInterface.name"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13120 次 |
| 最近记录: |