ฉันจะทำให้การจราจรเลือกเส้นทาง Windows VPN (โดยเครือข่ายปลายทาง) ได้อย่างไร?


137

ฉันต้องการใช้ Windows VPN แต่สำหรับเครือข่ายเฉพาะเท่านั้นเพื่อที่จะไม่ใช้การเชื่อมต่อเครือข่ายทั้งหมดของฉัน

เช่นแทนที่จะเป็น VPN เป็นเส้นทางเริ่มต้นให้เป็นเพียงเส้นทางสำหรับ 192.168.123.0/24

(ฉันเห็นได้ว่ามีวิธีแก้ปัญหาสำหรับ Ubuntu ในคำถามนี้แต่บางครั้งฉันต้องทำสิ่งนี้บน Windows ด้วย)

สิ่งนี้สามารถเป็นแบบอัตโนมัติได้หรือไม่เมื่อใดก็ตามที่ฉันเชื่อมต่อกับ VPN จะทำเช่นนี้?


มีคำถามที่เกี่ยวข้องกับการกรองเว็บไซต์จำนวนมากผ่าน VPN หรือไม่ ดูเหมือนว่าคำตอบที่นี่จะใช้ได้เฉพาะกรณีที่มีเว็บไซต์เดียวที่อยู่เบื้องหลัง VPN ฉันอยู่ในประเทศจีนและไซต์ที่ฉันต้องการใช้ประมาณครึ่งหนึ่งถูกบล็อกดังนั้นควรผ่าน VPN แต่เว็บไซต์อื่น ๆ นั้นเร็วกว่า / ราบรื่นกว่าโดยไม่มี VPN
hippietrail

ฉันไปข้างหน้าและถามคำถามใหม่: superuser.com/questions/925947
hippietrail

คำตอบ:


137

คุณสามารถปิดการผ่านการเชื่อมต่อทั้งหมดของคุณได้โดยไปที่คุณสมบัติของ VPN ที่Networkingแท็บInternet Protocol (TCP/IP)คุณสมบัติAdvanced, Use default gateway on remote networkuntick สิ่งนี้อาจหรือไม่อาจทิ้งเส้นทางไป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 VPN10.100.100.254

เพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่http://technet.microsoft.com/en-us/library/bb878117.aspx


1
"คุณจะต้องเพิ่มเส้นทางด้วยตนเอง" ... ได้อย่างไร มีคนบังคับตัวเองอย่างไรสมมติว่า "192.168.10.123" เพื่อผ่าน vpn แต่ไม่มีอะไรอื่นอีกแล้ว?
ทิโมธี Khouri

16
โดยส่วนตัวแล้วฉันพบว่าการปิดช่องทำเครื่องหมายก็เพียงพอแล้ว ฉันไม่ต้องเพิ่มเส้นทางใด ๆ ฉันตรวจสอบทุกอย่างเป็นไปตามที่ฉันคาดไว้ผ่านทางผู้ติดตามจำนวนมาก
eidylon

1
เช่นเดียวกับช่องทำเครื่องหมายนี้คือทั้งหมดที่จำเป็น
ลูก

1
กรุณาชี้แจง การรับส่งข้อมูลใดที่ส่งผ่าน VPN เป็นเพียงปริมาณข้อมูลที่กำหนดเป้าหมายไปยัง IP ของเซิร์ฟเวอร์ VPN หรือไม่ ตัวอย่างเช่นหากการเชื่อมต่อ VPN ไปที่ "my.domain.com" นั่นหมายความว่าทราฟฟิกทั้งหมดบนไคลเอนต์ที่ "my.domain.com" ผ่าน VPN และทุกอย่างอื่นไปที่เกตเวย์เริ่มต้นหรือไม่
Triynko

1
ฉันใช้คำสั่ง "พิมพ์เส้นทาง" และตรวจสอบว่าเส้นทาง Windows 7 ที่สร้างขึ้นนั้นผิดพลาด มันไม่ได้ส่งทราฟฟิกที่ส่งไปยัง IP ของ VPN ของฉันไปยัง VPN ... แต่เป็นการส่งไปยังเกตเวย์ท้องถิ่นของฉัน นอกจากนี้ยังมีรายการวงกลมสองสามรายการในตาราง ฉันลบเส้นทางที่ Windows สร้างขึ้นจากนั้นเพิ่มเส้นทางที่ถูกต้องด้วยตนเองเพื่อให้รายการที่อยู่ IP ของเซิร์ฟเวอร์ VPN ของฉันจะใช้เกตเวย์ของ VPN และ IP ท้องถิ่นของลูกค้าสำหรับอินเทอร์เฟซ การรับส่งข้อมูลไปยังเซิร์ฟเวอร์ VPN ของฉันถูกส่งผ่านอุโมงค์ VPN และการรับส่งข้อมูลอื่น ๆ ทั้งหมดไม่ได้รับผลกระทบตามที่คาดไว้ ทำได้ดี.
Triynko

19

ฉันใช้เทคนิคของ@ TRS-80สำเร็จเพื่อให้ได้สิ่งนี้

ฉันทำงานจากที่บ้านและต้อง VPN เข้าสู่เครือข่ายขององค์กรสำหรับอีเมลของฉัน (ฉันเกลียดเว็บเมล !!)

ในขณะเดียวกันฉันต้องท่องข้อมูลอย่างต่อเนื่องและต้องการ youtube สำหรับเพลงประกอบของฉัน ... ตอนนี้คุณไม่ต้องการสตรีม youtube จาก VPN เนื่องจากมันฟังดูเหมือนหุ่นยนต์ร้องเพลง !!! :)

ทั้งหมดที่ฉันทำคือทำตาม @ TRS-80:

คุณสมบัติของ VPN, แท็บเครือข่าย, คุณสมบัติ "Internet Protocol (TCP / IP)", ขั้นสูง, ไม่เลือก "ใช้เกตเวย์เริ่มต้นบนเครือข่ายระยะไกล"

แล้วฉันก็ทำเอง:

ในแท็บ DNS ให้เลือก "ลงทะเบียนที่อยู่การเชื่อมต่อนี้ใน DNS"

ทำงานได้อย่างราบรื่น!


8

ที่ได้รับคำตอบนี้ไม่ได้สะท้อนถึงคำขอของคุณ แต่ฉันใช้ VM โดยเฉพาะเพื่อจุดประสงค์นี้ ด้วยเหตุนี้เครือข่ายภายใน VM จึงถูก จำกัด โดยเส้นทาง

คุณอาจพบคำตอบที่ดีกว่าจากคนอื่น ๆ แต่อย่างน้อยนี่อาจให้สิ่งที่คุณต้องพิจารณาเนื่องจากเป็นวิธีแก้ปัญหาง่าย ๆ หลังจากสร้าง VM แล้ว


นี่เป็นทางออกที่ดีหากฮาร์ดแวร์ของคุณสามารถจัดการได้ดี
Enigma

7

ฉันพบว่ามันจำเป็นต้องชี้ไปที่อินเตอร์เฟสโดยตรงในคำสั่งเส้นทาง หากไม่มี 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'


สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน หากต้องการทราบว่าอินเทอร์เฟซใดที่คุณต้องการใช้งานคำสั่ง "พิมพ์เส้นทาง" และตรวจสอบบรรทัดแรกที่แสดงรายการอินเทอร์เฟซที่มีอยู่ (ค้นหา VPN ของคุณที่นั่นและตรวจสอบ IF - มันจะอยู่ในคอลัมน์แรก)
Funbit

มีบทความที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือ: การเชื่อมโยง การใช้ 0.0.0.0 เป็น IP เกตเวย์เริ่มต้นดูเหมือนว่าจะทำงานได้ดีเช่นกันดังนั้นจึงไม่จำเป็นต้องปรับเมื่อมีการเปลี่ยนแปลง มันจะเป็นการดีถ้าได้รวมคำตอบนี้ไว้เพราะ imo มีประโยชน์มากกว่าคำตอบอันดับต้น ๆ
lpd

4

หากคุณมีทั้ง IPV4 และ IPV6 คุณต้องยกเลิกการเลือก "ใช้เกตเวย์เริ่มต้นบนเครือข่ายระยะไกล" ในทั้งสองแห่งแม้ว่าคุณจะใช้ IPV4 เท่านั้น


3

หากคุณใช้ CMAK และตั้งค่าไฟล์เส้นทางที่ไคลเอนต์สามารถดาวน์โหลด ... windows จะดาวน์โหลดไฟล์เส้นทางและปรับเส้นทางตามความเหมาะสม มีตัวเลือกเพื่อลบเส้นทางเริ่มต้น ... และเพิ่มเส้นทางแบบคงที่และอื่น ๆ สิ่งนี้เรียกว่า btw แบบแยกอุโมงค์

มีวิธีการที่ดีอยู่ที่นี่: http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx



2

ฉันต้องการเพิ่มโซลูชันของฉันลงในส่วนผสม มันทำงานบนเชลล์ UNIX ที่ใช้พลังงานของ Cygwin บน Windows 7 หรือใหม่กว่า แต่ควรทำงานกับ MSYS2, Bash-on-Windows [WSL] หลังจากสร้าง 14986 หรือ Busybox สำหรับ Windows) จำเป็นต้องรันด้วยสิทธิ์ผู้ดูแลระบบ

มีการตั้งค่าบางอย่างและพยายามตรวจหาบางสิ่งที่คุณไม่ได้ตั้งค่าไว้อย่างชัดเจน นอกจากนี้ยังตั้งค่าหมายเลขอินเทอร์เฟซ (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 Protocol รุ่น 4 (TCP / IP)"คุณสมบัติ→ "ขั้นสูง" →และไม่ต้องเลือก"Automatic ตัวชี้วัด"ช่องทำเครื่องหมาย (นอกเหนือไปจากการ"ใช้เกตเวย์เริ่มต้น ..."ของหลักสูตร) และตั้งค่าในส่วน"การเชื่อมต่อของตัวชี้วัด"ฟิลด์เป็นค่าที่ต่ำกว่าเส้นทางเริ่มต้น (ดูROUTE.EXE -4 printการส่งออก)


1

เก่าไปหน่อย แต่ฉันพบวิธีการนี้โดยใช้เครื่องอื่น ฉันมีแล็ปท็อปที่ฉันตั้งค่าการเชื่อมต่อ VPN และที่นั่นฉันมี FreeProxy ตั้งค่ากับ Socks5 ..

จากนั้นฉันตั้งค่า firefox บนเครื่องไคลเอนต์ของฉันเพื่อใช้พร็อกซีเซิร์ฟเวอร์ของแล็ปท็อป .. ผลลัพธ์คือถ้าฉันใช้ FireFox หรือสิ่งใดก็ตามที่ตั้งค่าให้ใช้พร็อกซี Socks5 นั้นจะใช้ VPN มิฉะนั้นจะใช้เส้นทางมาตรฐาน ..


1

คุณสามารถใช้บางอย่างเช่นnetcatcher - เพียงเพิ่มเส้นทางทั้งหมดที่คุณต้องการเพียงครั้งเดียวแล้วลืมมันไป มันจะเพิ่มและลบเส้นทางโดยอัตโนมัติเมื่อคุณเชื่อมต่อหรือยกเลิกการเชื่อมต่อเซสชัน VPN ของคุณ หากที่อยู่ IP VPN ของคุณได้รับแบบไดนามิก (DHCP) netcatcher จะตรวจจับและอัปเดตเส้นทางที่ถูกต้อง


2
หากนี่คือสิ่งที่คุณเขียนคุณต้องเปิดเผยว่าanseko.com/about.htmlดูfaq
Jeff Atwood

1

จากฟอรัมรัสเซีย: 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

สิ่งนี้ไม่สามารถทำได้ใน Windows โดยไม่ต้องใช้โปรแกรมเพิ่มเติมไฟล์แบตช์หรือบรรทัดคำสั่ง อีกทางเลือกหนึ่งคือรับเครื่องเสมือน (หรือทางกายภาพ) ซึ่งคุณสามารถเปิดใช้งาน VPN ได้

ดูเหมือนแปลกที่บางสิ่งบางอย่างสามารถอธิบายได้ง่ายเช่นนี้ยากที่จะบรรลุ เป็นเรื่องยากเพียงใดในการกำหนดเส้นทางการรับส่งข้อมูลจากโปรแกรมหนึ่งไปยังอินเทอร์เฟซ VPN และโปรแกรมอื่น ๆ ทั้งหมดไปยังอินเทอร์เฟซ NIC เริ่มต้น ทำไมเราต้องตั้งค่าเครื่องเสมือนทั้งหมดสำหรับสิ่งนั้น และด้วยลินุกซ์ก็เป็นไปได้ แต่วิธีการแก้ปัญหาก็ไม่ได้สง่างามเช่นกัน

มันเป็นที่ต้องการอย่างมากเช่นกัน: ฉันเจอหลายสิบกระทู้ในหัวข้อเดียวกัน ดังนั้นฉันแค่หวังว่าจะมีคนตระหนักถึงความน่าหัวเราะของเรื่องนี้และทำอะไรบางอย่างเกี่ยวกับเรื่องนี้ (ใน Windows 8!)

การแก้ปัญหานี้มาจากไฟล์ชุด unattributed มันได้รับการดัดแปลงเล็กน้อย

คำแนะนำสำหรับ Windows 7

สคริปต์จะเชื่อมต่อและกำหนดเส้นทางการรับส่งข้อมูลผ่าน VPN ของคุณจนกว่าจะรีบูต - คุณสามารถแทนที่route addด้วยroute -p addเพื่อให้การเปลี่ยนแปลงมีอยู่ แต่ถ้าคุณไม่มี IP ถาวรด้วย VPN ของคุณสคริปต์จะหยุดทำงานในที่สุดเมื่อ IP IP ของคุณเปลี่ยน

  1. เปิดศูนย์เครือข่ายและการแบ่งปัน
  2. เปิดคุณสมบัติสำหรับการเชื่อมต่อ VPN ของคุณ
  3. คลิกที่Networkingแท็บ
  4. สำหรับทั้ง IPv4 และ 6:
    1. คลิก Properties
    2. คลิก Advanced
    3. ยกเลิกการเลือก Use default gateway[...]
  5. ปิดทุกอย่างที่เปิดจากขั้นตอนก่อนหน้า
  6. แก้ไขและบันทึกสคริปต์ชุดงานด้านล่าง
  7. เรียกใช้ในฐานะผู้ดูแลระบบ

คุณต้องแทนที่สิ่งต่อไปนี้ในสคริปต์:

  • <VPN> ด้วยชื่อการเชื่อมต่อ VPN ที่คุณสร้าง
  • <USER> ด้วยชื่อผู้ใช้ VPN
  • <PASS> ด้วยรหัสผ่าน VPN
  • <TARGET> ด้วยที่อยู่ IP ที่คุณต้องการกำหนดเส้นทางผ่าน VPN (หากคุณต้องการกำหนดเส้นทางที่อยู่เพิ่มเติมให้ทำซ้ำสามบรรทัดที่ใช้เป้าหมาย)

หมายเหตุ:หากคุณไม่ต้องการที่จะบันทึกรหัสผ่านในไฟล์แทนที่<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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.