(在这个问题中,我可以看到针对Ubuntu的解决方案,但有时我也必须在Windows上这样做)
这可以自动化,以便每当我连接到VPN时都可以做到吗?
#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
评论
是否有通过VPN过滤大量站点的相关问题?看来这里的答案仅在VPN背后只有一个站点的情况下才有效。我在中国,大约有一半我想使用的站点被阻止,因此应该通过VPN进行访问,但是其他站点在没有VPN的情况下速度更快/更流畅。我继续问一个新问题:superuser.com/questions/925947