我只想对特定网络使用Windows VPN,这样它就不会接管我的整个网络连接。 192.168.123.0/24的路由

(在这个问题中,我可以看到针对Ubuntu的解决方案,但有时我也必须在Windows上这样做)

这可以自动化,以便每当我连接到VPN时都可以做到吗?

评论

是否有通过VPN过滤大量站点的相关问题?看来这里的答案仅在VPN背后只有一个站点的情况下才有效。我在中国,大约有一半我想使用的站点被阻止,因此应该通过VPN进行访问,但是其他站点在没有VPN的情况下速度更快/更流畅。
我继续问一个新问题:superuser.com/questions/925947

#1 楼

您可以转到VPN的属性,Networking选项卡,Internet Protocol (TCP/IP)属性,Advanced和取消勾选Use default gateway on remote network,以关闭整个连接。根据VPN服务器的设置,这可能会或可能不会留下到192.168.123.0/24的路由。如果没有,您可以每次都手动添加路由,尽管您可以将其放入批处理文件中。

要手动添加路由,请以管理员身份运行:

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254


本示例将通过VPN网关192.168.0.12建立到IP 10.100.100.254的持久性路由(重新引导后无需运行命令)。
有关此内容的更多信息,请访问http://technet.microsoft.com/zh-cn/library/bb878117.aspx

评论


“您必须手动添加路线” ...如何?有人说,如何迫使“ 192.168.10.123”通过vpn,但没有别的?

–提莫西·库里(Timothy Khouri)
2011年6月11日在2:16

就个人而言,我发现仅关闭复选框就足够了。我不必添加任何路线。我通过无数tracerts验证了一切,并按预期进行了处理。

– eidylon
2011年9月28日在20:05

一样,此复选框仅需使用。

–卢克
2012年9月6日于20:59

请说清楚。哪些流量通过VPN路由?它只是将流量定向到VPN服务器的IP吗?例如,如果VPN连接转到“ my.domain.com”,那么这是否意味着到“ my.domain.com”的客户端上的所有流量都通过VPN,其他所有流量都到达默认网关?

– Triynko
2012年9月25日下午0:06

我使用“ route print”命令,并验证Windows 7生成的路由完全错误。它没有将寻址到我的VPN IP的流量发送到VPN ...而是将其发送到我的本地网关。表格中也有一些循环条目。我删除了Windows创建的路由,然后手动添加了正确的路由,以便我的VPN服务器的IP地址条目将使用VPN的网关和客户端的本地IP作为接口。然后,通过VPN隧道成功路由了到我的VPN服务器的流量,所有其他流量均未受到预期的影响。效果很好。

– Triynko
2012年9月25日在7:13

#2 楼

我成功使用@ TRS-80的技术来实现这一目标。 >与此同时,我需要不断地浏览信息,还需要YouTube来播放我的背景音乐...现在,您绝对不希望从VPN上传输youtube,因为这听起来像是机器人唱歌!!! :)

我所做的只是遵循@ TRS-80:


VPN的属性,“网络”选项卡,“ Internet协议(TCP / IP)”
属性,高级,取消选中“在远程网络上使用默认网关”


,然后执行我自己的操作:


在DNS选项卡下,勾选“在DNS中注册此连接地址”


所有工作均无缝进行!

#3 楼

在Windows 8+中使用Add-VpnConnectionRoute cmdlet。

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24


评论


这在Windows 10上对我来说非常理想。

– X射线
18年6月26日在23:26

#4 楼

授予此答案不会反映您的请求,但我为此专门使用了VM。这样,只有VM内的网络受到路由的限制。

您可能会发现其他人的一些更好的答案,但是至少这可以给您一些考虑,因为它是VM拥有后的一种简单解决方案已创建。

评论


如果您的硬件可以很好地处理它,那么这是一个很好的解决方案。

–谜
13年2月7日在15:16

使用此解决方案多年,直到找到此线程。 :)

–o.v
19年8月7日在13:48

这是一个非常酷的解决方案:)

– Ignacio Soler Garcia
20年7月22日在9:28

#5 楼

对于像我这样对网络不太了解的菜鸟的“简短”指南。这里没有太多新内容,但是总结了先前答案和其他相关主题中描述的所有不错的选择。整个过程包括3个基本步骤:

1)使所有流量都不通过VPN。为此,您必须在VPN设置中取消选中Use default gateway on remote network复选框。确保同时取消选中IPv4和IPv6的此复选框。通常,我只是完全禁用IPv6协议以进行VPN连接。

(!)(有时)取消选中该复选框对于正常工作是足够的-根据我的经验,这是必要的路由(将引导必要的路由)建立VPN连接后,可以自动添加通过VPN的流量)。我不知道这些规则的确切位置和配置方式,但是这种情况确实存在-可能是VPN网络管理员做了一些魔术。

2)仅通过VPN进行必要的通信。为此,您需要定义路线。这里有3个选项:

2.1)通过VPN网关添加永久路由: VPN网络上的IP'= route -p add a.b.c.d/<CIDR> w.x.y.z,目标地址/网络= route -p add a.b.c.d mask e.f.g.h w.x.y.z。您可以通过执行w.x.y.z并查找您的VPN连接名称来找到a.b.c.d,或者,如果使用PowerShell,则可以通过执行w.x.y.z(在找到每个PPP连接后将输出5行)来获得紧凑的输出。缺点:如果您的VPN IP更改,您将必须重新创建路由。

2.2)通过VPN网络接口添加永久路由:

ipconfig

其中ipconfig | grep -A5 PPP是目标地址/网络,而route -p add a.b.c.d/<CIDR> 0.0.0.0 IF <interface number>是您的VPN连接的标识符。可以通过执行a.b.c.d来找到此ID,或者,对于更紧凑的输出,可以通过interface number来找到。 >缺点:如果删除VPN连接,则需要使用新ID重新创建路由。

2.3)使用PowerShell cmdlet:

netstat -rn


缺点:没有netstat -rn | grep -A10 'Interface List' cmdlet,因此很难管理这些规则。

3)检查并确保路由按预期工作!

如果添加了持久性路由,您可以通过执行w.x.y.z来检查它们。

最后,针对应该通过VPN访问的两个IP地址和不使用VPN可以工作的IP地址运行一些Add-VpnConnectionRoute -ConnectionName '<VPN connection name>' -DestinationPrefix a.b.c.d/<CIDR>命令。

#6 楼

我发现它需要直接在route命令中指向接口。没有它,Windows将使用主网卡接口而不是VPN。就我而言,它看起来像

route -p add 192.168.10.187 mask 255.255.255.255 0.0.0.0 IF 26
::           ^destination        ^mask           ^gateway   ^interface


注意“ IF 26”。

评论


这也为我工作。要找出您需要的接口,只需执行“ route print”命令并检查显示可用接口列表的第一行(在此处找到您的VPN并检查其IF-将在第一列中)。

–有趣
15年4月24日在1:55

关于这一点的精彩文章:链接。使用0.0.0.0作为默认网关IP似乎也可以很好地工作,因此无需在更改时对其进行调整。最好将这个答案纳入其中,因为imo比顶级答案有用得多。

–lpd
15年6月16日在8:51



#7 楼

如果同时具有IPV4和IPV6,则即使在仅使用IPV4的情况下,也都必须取消选中“在远程网络上使用默认网关”

#8 楼

如果您使用CMAK并设置了客户端可以下载的路由文件,则Windows将下载路由文件并根据需要调整路由。有一些选项可以删除默认路由...并添加各种静态路由等。这被称为“拆分隧道btw”。 -tunnelling-using-cmak.aspx

#9 楼

我要添加我的解决方案。它可以在Windows 7或更高版本的Cygwin支持的UNIX Shell上运行,但也应与MSYS2,Build 14986之后的Windows Bash [WSL]或Windows Busybox一起使用。需要以管理员权限运行。

它具有一些设置,并尝试检测一些您未明确设置的内容。它还显式设置了接口号(IF),以解决某些用户(如我)在这里与其他解决方案所遇到的一些问题。值得注意的是,可能有必要手动设置一个低指标,否则默认路由将在到达VPN的流量之前匹配。为此,请转到适配器设置,在该设置中打开VPN适配器的“ ...属性”菜单项→“网络”选项卡→“ Internet协议版本4(TCP / IP)”属性→“高级”→并取消选中(当然,除了“使用默认网关…”之外)“自动度量”复选框,并将“接口度量:”字段中的值设置为小于默认路由的值(请参阅#!/bin/sh # these three settings are required adapter_name='VPN Connection' username= password= # This setting here might be important because it's about the target network # and in some cases it can't be properly determined automatically so this might # be then worth setting. # Format is in CIDR notation with the network address and a forward slash and # the amount of network bits target_network=192.168.0.0/24 # the IP you will get on the target network, also the VPN gateway on your # local machine, you normally don't need to set this as the script tries to # detect it ip= # optional setting for metric which normally shouldn't be necessary, # except in te very rare cases where it should be set to a value lower than all # other routes that might match the target network metric= # experimental setting to delete routes to the target network prior and after # should normally not be needed unless this script fails and you get error # messages like 'The route addition failed: The object already exists.' route_cleanup=F prog_name=${0##*/} msg() { printf '%s: %s\n' "$prog_name" "$*" } die() { msg "$*" >&2 exit 1 } [ "$adapter_name" ] || die "Adapter name not set!" [ "$username" ] || die "Username not set!" [ "$password" ] || die "Password not set!" if [ "$(uname -o)" != 'MS/Windows' ]; then id -G | grep -qE '\<0|544\>' || die 'Not running with admin rights.' fi msg "Disconnecting any existing connection that might exist." rasdial.exe "$adapter_name" /d msg "Connecting" rasdial.exe "$adapter_name" "$username" "$password" if [ ! "$ip" ]; then msg "Getting IP address on target network." ip=$(netsh.exe interface ip show config name="$adapter_name" | grep -a 'IP Address' | awk -F'[: ]+' '{print }') [ "$ip" ] || die 'Could not get IP! Exiting.' msg "Detected IP address as '$ip'." fi if [ ! "$target_network" ]; then msg "Getting target network." target_network=$(netsh.exe interface ip show config name="$adapter_name" | grep -a 'Subnet Prefix' | awk -F'[: ]+' '{print }') [ "$target_network" ] || die 'Could not get target network! Exiting.' msg "Detected target network as '$target_network'." fi msg "Getting VPN interface number." if=$(ROUTE.EXE print -4 | grep -a "$adapter_name" | awk -F. '{gsub(" ", "");print }') [ "$if" ] || die 'Could not get interface number! Exiting.' msg "Detected VPN interface number as '$if'." if [ "$route_cleanup" = T ]; then msg "Deleting any potentially already existing routes for the target network." ROUTE.EXE delete "$target_network" fi msg "Adding route for target network." if [ "$metric" ]; then ROUTE.EXE add "$target_network" "$ip" IF "$if" Metric "$metric" else ROUTE.EXE add "$target_network" "$ip" IF "$if" fi msg "VPN should be up now." msg "Press enter to make it stop." read -r _ if [ "$route_cleanup" = T ]; then msg "Deleting route." ROUTE.EXE delete "$target_network" fi msg "Disconnecting." rasdial.exe "$adapter_name" /d # msg "Press enter to exit." # read -r _ exit 0 输出)。

#10 楼

有点旧了,但是我找到了使用另一台机器执行此操作的方法。我有一台笔记本电脑,我在其中设置了VPN连接,在那儿,我已经用Socks5设置了FreeProxy。如果我使用FireFox或设置为使用Socks5代理的任何东西,它将使用VPN,否则将使用标准路由。.

#11 楼

您可以使用netcatcher之类的东西-只需添加一次所需的所有路由,然后将其忘记即可。当您连接或断开VPN会话时,它将自动添加和删除路由。如果您的VPN IP地址是动态获得的(DHCP),netcatcher会捕获它并以正确的方式更新路由。

评论


如果这是您写的内容,则需要披露anseko.com/about.html参见常见问题解答

–杰夫·阿特伍德
2011年8月30日9:32

#12 楼

来自俄罗斯论坛:http://forum.ixbt.com/topic.cgi?id=14:43549

另存为文件(例如:vpn_route.vbs),并在vpn连接后执行命令

cscript vpn_route.vbs


vpn_route.vbs:
strComputer = "."
strMACAddress = "MAC of VPN interface here (example 00:45:55:00:00:00)"
strTarget = "route target here (example 192.168.123.0)"
strMask = "mask here (example 255.255.255.0)"
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * From Win32_NetworkAdapterConfiguration Where MACAddress = '" & strMACAddress & "'")
For Each objItem in colItems
strIP = objItem.IPAddress(0)
Next
Set objShell = CreateObject("WScript.Shell")
objShell.Run "route add " & strTarget & " mask " & strMask & " " & strIP


#13 楼

如果不使用其他程序,批处理文件或命令行,则无法在Windows中完成此操作。另一种选择是获得可以在其上运行VPN的虚拟(或物理)计算机。仅将流量从一个程序路由到VPN接口,将所有其他程序路由到默认NIC接口有多困难?为什么我们需要为此设置整个虚拟机?使用Linux可以实现,但是其解决方案也不是很优雅。

这也是很受追捧的:我遇到了很多关于同一主题的话题。因此,我只希望有人意识到这一点可笑,并对此有所作为。 (在Windows 8中!)

此解决方案来自未归类的批处理文件。

Windows 7的说明

该脚本将连接到VPN并通过VPN路由流量,直到重新引导为止-您可以将route add替换为route -p add进行更改保留,但是如果您的VPN没有永久IP,则当您的VPN IP更改时,IP最终将停止工作。


打开网络和共享中心
打开VPN连接的属性
单击Networking选项卡
对于IPv4和6:


单击Properties
单击Advanced

取消选中Use default gateway[...]



关闭以前步骤中打开的所有内容
编辑并保存下面找到的批处理脚本
运行它以管理员身份

您需要在脚本中替换以下内容:



<VPN>用您创建的VPN连接的名称

使用VPN用户名的<USER>

使用VPN密码的<PASS>

<TARGET>使用要通过VPN路由的IP地址(如果要路由更多地址,只需复制使用目标的三行)

注意:如果不想将密码保存在文件中,请将<PASS>替换为%password%,并在脚本的第一行之后添加以下内容:set password= Input password:

脚本

@echo off
@echo make sure to be disconnected!
rasdial <VPN> /d
@echo start to connect to vpn
rasdial <VPN> <USER> <PASS>
netsh interface ip show config name="<VPN>" | findstr "IP" > ip.dat
set /p ip= < ip.dat
del ip.dat
set ip=%ip:~-12%
@echo VPN IP is %ip%

set target=<TARGET>
@echo Add route for %target%
route add %target% mask 255.255.255.255 %ip%

timeout /T 3 > nul