題 如何製作Windows VPN路由選擇性流量(按目標網絡)?


我想使用Windows VPN但僅適用於特定網絡,因此它不會佔用我的整個網絡連接。

例如,不要將VPN變為默認路由,而是將其設置為192.168.123.0/24的路由

(我可以看到Ubuntu有一個解決方案 在這個問題上,但有時我也必須在Windows上這樣做)

這可以自動化,這樣每當我連接到VPN時它會這樣做嗎?


129
2017-07-24 09:33


起源


是否存在通過VPN過濾一堆網站的相關問題?看起來這裡的答案僅適用於VPN背後有一個站點的情況。我在中國,我想要使用的網站大約有一半被阻止,所以應該通過VPN,但其他網站沒有VPN更快/更順暢。 - hippietrail
我繼續問了一個新問題: superuser.com/questions/925947 - hippietrail


答案:


您可以通過轉到VPN的屬性來關閉接管整個連接, Networking 標籤, Internet Protocol (TCP/IP) 性能, Advanced解開 Use default gateway on remote network。這可能會也可能不會留下一條路線 192.168.123.0/24 取決於VPN服務器的設置。如果沒有,您每次都必須手動添加路由,儘管您可以將其放在批處理文件中。

要手動添加路由,請運行(以管理員身份):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

此示例將使持久化(在重新啟動後不必運行命令)路由到IP 192.168.0.12 通過VPN網關 10.100.100.254

更多關於此的信息 http://technet.microsoft.com/en-us/library/bb878117.aspx


129
2017-07-24 11:11



“你必須手動添加路線”......怎麼樣?有人強迫,讓我們說,“192.168.10.123”通過vpn,但沒有別的? - Timothy Khouri
就個人而言,我發現只要關閉複選框就足夠了。我沒有添加任何路線。我通過無數的痕跡證實了一切都在我預期的地方。 - eidylon
同樣,這個複選框就是所需要的。 - Luk
請澄清。哪些流量通過VPN路由?它只是針對VPN服務器IP的流量嗎?例如,如果VPN連接轉到“my.domain.com”,那麼這意味著客戶端上“my.domain.com”的所有流量都通過VPN,其他所有流量都轉到默認網關嗎? - Triynko
我使用“route print”命令,並驗證Windows 7生成的路由是錯誤的。它沒有將發往我VPN的IP的流量發送到VPN ...而是將其發送到我的本地網關。表格中還有一些圓形條目。我刪除了Windows創建的路由,然後手動添加了正確的路由,以便我的VPN服務器的IP地址條目將使用VPN的網關和客戶端的本地IP作為接口。然後,通過VPN隧道成功路由到我的VPN服務器的流量,並且所有其他流量未受到預期影響。效果很好。 - Triynko


我成功使用了 @ TRS-80實現這一目標的技巧。

我在家工作,必須通過VPN連接到企業網絡上我的電子郵件(我討厭webmail !!)。

與此同時,我需要不斷地瀏覽信息,還需要youtube才能獲得我的背景音樂......現在你絕對不想將自己的視頻流傳輸到VPN,因為這聽起來像是機器人歌唱! :)

我所做的就是關注@ TRS-80:

VPN的屬性,網絡選項卡,“Internet協議(TCP / IP)”   屬性,高級,取消勾選“在遠程網絡上使用默認網關”

然後做了我自己的:

在DNS選項卡下,勾選“在DNS中註冊此連接地址”

一切都無縫銜接!


18
2018-02-28 16:05





當然,這個答案並不反映您的要求,但我專門為此目的使用了VM。這樣,只有VM內部的網絡受到路由的限制。

您可能會找到其他人更好的答案,但至少這可能會給您一些考慮因素,因為它是創建VM後的一個簡單解決方案。


8
2017-07-24 10:09



如果您的硬件可以很好地處理它,這是一個很好的解決方案 - Enigma


我發現它需要在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'。


7
2017-09-25 05:41



這對我也有用。要找出您需要的接口,只需執行“route print”命令並檢查顯示可用接口列表的第一行(在那裡找到您的VPN並檢查其IF - 它將在第一列中)。 - Funbit
有一篇精彩的文章: 鏈接。使用0.0.0.0作為默認網關IP似乎也可以很好地工作,因此無需在更改時進行調整。在這個答案中加入它會很棒,因為它比頂級答案更有用。 - lpd


如果您同時擁有IPV4和IPV6,則必須在兩個位置取消選中“在遠程網絡上使用默認網關”,即使您只使用IPV4


4
2017-07-29 09:03





如果您使用CMAK並設置客戶端可以下載的路由文件... Windows將下載路由文件並根據需要調整路由。有一些選項可以刪除默認路由...並添加各種靜態路由等。這被稱為分裂隧道btw。

這裡有一個很好的方法: http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx


3
2018-03-28 18:32





我想在混合中添加我的解決方案。它運行在Windows 7或更高版本的Cygwin驅動的UNIX shell上,但也應該在構建14986或Windows的Busybox之後與MSYS2,Bash-on-Windows [WSL]一起使用。需要使用管理員權限運行。

它有一些設置並試圖檢測一些你沒有明確設置的東西。它還明確設置接口編號(IF)以解決一些用戶(像我一樣)在這裡遇到的其他解決方案的一些問題。

#!/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 $4}')

  [ "$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 $4}')

  [ "$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 $1}')

[ "$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

還值得注意的是,可能需要手動設置低度量標準,否則默認路由將在發往VPN的流量之前匹配。您可以通過轉到打開的適配器設置來執行此操作 “...屬性” VPN適配器的菜單項→ “聯網” 選項卡→ “Internet協議版本4(TCP / IP)” 屬性→ “高級” →你在那裡取消選中 “自動指標” 複選框(除了 “使用默認網關......” 當然)並設置值 “接口指標:” 字段值低於默認路由(請參閱 ROUTE.EXE -4 print 輸出)。


2
2017-10-26 15:29





使用 附加VpnConnectionRoute Windows 8+中的cmdlet。

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

2
2018-01-26 07:11



這在Windows 10上對我來說非常適合。 - x-ray


有點舊,但我找到了一種方法,使用另一台機器。我有一台筆記本電腦,我設置了VPN連接,在那裡我有FreeProxy設置Socks5 ..

然後我在我的客戶端機器上設置firefox以使用筆記本電腦的代理服務器..結果是,如果我使用FireFox或任何設置使用該Socks5代理的東西,它將使用VPN,否則它使用標準路由..


1
2018-04-20 19:46





你可以使用類似的東西 netcatcher  - 只需添加您需要的所有路線並忘記它。當您連接或斷開VPN會話時,它將自動添加和刪除路由。如果您的VPN IP地址是動態獲取的(DHCP),netcatcher將捕獲它並以正確的方式更新路由。


1
2017-08-30 09:23



如果這是你寫的東西,你需要披露 anseko.com/about.html 看到 常問問題 - Jeff Atwood


來自俄羅斯論壇: 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

1
2018-02-18 16:37