Як я можу зробити маршрут маршрутизатора Windows VPN вибірковим (за цільовою мережею)?


139

Я хочу використовувати VPN для Windows, але лише для певної мережі, щоб вона не перейняла все моє мережеве з'єднання.

наприклад, замість того, щоб VPN став маршрутом за замовчуванням, зробіть його лише маршрутом для 192.168.123.0/24

(Я можу побачити, що в цьому питанні є рішення для Ubuntu , але іноді мені доводиться це робити і в Windows)

Чи можна це автоматизувати так, що коли я підключаюсь до VPN, це робить це?


Чи є пов’язане питання щодо фільтрації купу сайтів через VPN? Схоже, відповіді тут працюватимуть лише у випадку, коли за VPN є один сайт. Я в Китаї, і приблизно половина сайтів, які я хотів би використовувати, заблоковані, тому потрібно пройти через VPN, але інші сайти швидше / плавніше без VPN.
hippietrail

Я пішов вперед і задав нове запитання: superuser.com/questions/925947
hippietrail

Відповіді:


139

Ви можете вимкнути перехоплення всього свого з'єднання, перейшовши до властивостей 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


1
"Вам доведеться вручну додати маршрут" ... як? Як хтось змушує, скажімо, "192.168.10.123" пройти через vpn, але нічого іншого?
Тимофі Хорі

16
Особисто я виявив, що просто відключити прапорець досить. Ніяких маршрутів мені не довелося додавати. Я перевірив, що все відбувається там, де я б очікував цього, через численні трасери.
ейдилон

1
Це ж, цей прапорець був усім необхідним.
Лук

1
Будь ласка, поясніть. Який трафік направляється через VPN? Це лише трафік, орієнтований на IP-сервер VPN? Наприклад, якщо з'єднання VPN переходить на "my.domain.com", то це означає, що весь трафік клієнта на "my.domain.com" переходить через VPN, а все інше переходить на шлюз за замовчуванням?
Трайнко

1
Я скористався командою "print print" і перевірив, що маршрути, створені Windows 7, мертві неправильно. Він не надсилав трафік, адресований IP-адресу мого VPN, до VPN ... натомість він надсилав його до мого локального шлюзу. У таблиці також було кілька кругових записів. Я видалив маршрут, створений Windows, а потім вручну додав правильний маршрут, щоб запис IP-адреси мого VPN використовував шлюз VPN та локальний IP-адресу клієнта для інтерфейсу. Потім трафік на мій сервер VPN був успішно прокладений через тунель VPN, і весь інший трафік не впливав, як очікувалося. Добре працює.
Трайнко

20

Я успішно використовував техніку @ TRS-80 , щоб досягти цього.

Я працюю вдома і маю VPN в корпоративну мережу для свого електронного листа (я ненавиджу веб-пошту !!).

У той же час, мені потрібно постійно займатися серфінгом для інформації, а також мені потрібна ютуб для моєї фонової музики ... Тепер ви точно не хочете передавати youtube з VPN, оскільки це звучить як співає робота !!! :)

Все, що я зробив, це слідкувати за TRS-80:

властивості VPN, вкладка Мережа, властивості "Інтернет-протокол (TCP / IP)", Додатково, зніміть позначку "Використовувати шлюз за замовчуванням у віддаленій мережі"

а потім зробив своє:

на вкладці DNS поставте галочку "зареєструвати адреси цього з'єднання в DNS"

Все працює без проблем!


9

Надана ця відповідь не відображає ваш запит, але я використовую VM спеціально для цієї мети. Таким чином маршрути обмежуються лише мережею всередині VM.

Ви можете знайти кращі відповіді інших людей, але, принаймні, це може дати вам щось розглянути як просте рішення після створення VM.


Це хороше рішення за умови, що ваше обладнання може добре впоратися з цим.
Енігма

Використовували це рішення роками, поки не знайшли цю нитку. :)
ов

7

Я виявив, що потрібно безпосередньо вказати інтерфейс у команді 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

зверніть увагу на "Якщо 26".


Це працювало і для мене. Щоб дізнатись, в якому інтерфейсі потрібно просто виконати команду "print print" і перевірити перші рядки, де відображається список доступних інтерфейсів (знайдіть свій 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

Я хочу додати своє рішення до суміші. Він працює на захищеній Cygwin оболонці UNIX для Windows 7 або новішої версії, але також повинен працювати з MSYS2, Bash-on-Windows [WSL] після складання 14986 або Busybox для Windows). Потрібно запускатись з правами адміністратора.

Він має деякі налаштування і намагається виявити деякі речі, які ви не встановили прямо. Він також встановлює номер інтерфейсу (ЯК) явно для протидії деяким проблемам, які деякі користувачі (як я) мали з іншими рішеннями тут.

#!/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 → вкладка «Мережа»«Протокол Інтернету версії 4 (TCP / IP)» Властивості → «Додатково» → і там зніміть прапорець «Автоматична метрика» прапорець (в додатку до «Використовувати основний шлюз ...» , звичайно) і встановіть значення в «метриці інтерфейсу:» поле до значення нижче , ніж маршрут за замовчуванням (див 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
Джефф Етвуд

1

з російського форуму: http://forum.ixbt.com/topic.cgi?id=14:23549

зберегти як файл (наприклад: 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 за замовчуванням? Чому для цього нам потрібно створити цілу віртуальну машину? І з Linux це можливо, але і його рішення не дуже елегантне.

Це теж дуже затребувано: я натрапив на десятки тем на цю тему. Тож я лише сподіваюся, що хтось усвідомить насмішність цього і щось зробить. (У Windows 8!)

Це рішення - з нерозподіленого пакетного файлу . Він був трохи адаптований.

Інструкції для Windows 7

Сценарій не буде підключатися до і маршрутизації трафіку через VPN до перезавантаження - ви можете замінити route addз route -p addна зміну збережеться, але якщо ви не маєте постійний IP з VPN, він буде в кінцевому підсумку перестане працювати , коли ваші зміни IP VPN.

  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

0

"Короткий" посібник для нобіїв, як я, які мало знають про мережі. Тут не багато нового, але резюме всіх хороших варіантів, описаних у попередніх відповідях та в інших пов'язаних темах. Вся процедура складається з 3 основних етапів:

1) Зробіть, щоб увесь трафік НЕ проходив через VPN. Для цього потрібно зняти Use default gateway on remote networkпрапорець у налаштуваннях VPN. Зніміть цей прапорець для IPv4 та IPv6. Зазвичай я просто відключаю протокол IPv6 повністю для підключення VPN.

(!) Можливо (якщо іноді) зняти прапорець, що прапорець буде достатньо для нормальної роботи - на мій досвід, необхідні маршрути (які спрямовуватимуть необхідний трафік через VPN) можуть бути додані автоматично після встановлення з'єднання VPN. Я точно не знаю, де і як налаштовані ці правила, але такий сценарій існує - ймовірно, це певна магія, яку роблять адміністратори мережі VPN.

2) Здійснюйте лише необхідний трафік через VPN. Для цього потрібно визначити маршрути. Тут у вас є 3 варіанти:

2.1) Додати постійний маршрут через шлюз VPN:

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

де 'шлюз VPN' = 'ваш IP в мережі VPN' = w.x.y.zі цільова адреса / мережа = a.b.c.d. Ви можете знайти w.x.y.z, виконавши ipconfigі шукаючи ім'я свого VPN-з'єднання, або, якщо ви використовуєте PowerShell, ви можете отримати компактний висновок шляхом виконання ipconfig | grep -A5 PPP(який виведе 5 рядків після знаходження кожного з'єднання PPP).

Мінуси: вам доведеться заново створити маршрути, якщо ваш VPN IP зміниться.

2.2) Додати постійний маршрут через мережевий інтерфейс VPN:

route -p add a.b.c.d/<CIDR> 0.0.0.0 IF <interface number>

де a.b.c.dє цільова адреса / мережа та interface numberє ідентифікатором вашого VPN-з'єднання. Цей ідентифікатор може бути знайдений шляхом виконання netstat -rn, або, для більш компактного виведення, netstat -rn | grep -A10 'Interface List'.

Плюси: не потрібно нічого змінювати, якщо ваша VPN-адреса ( w.x.y.z) зміниться.

Мінуси: потрібно видалити маршрути з новим ідентифікатором, якщо ви видалите VPN-з'єднання.

2.3) Використовуйте командлет PowerShell:

Add-VpnConnectionRoute -ConnectionName '<VPN connection name>' -DestinationPrefix a.b.c.d/<CIDR>

Плюси: необхідні маршрути додаються щоразу, коли VPN-з'єднання встановлюється та видаляється кожного разу при відключенні.

Мінуси: немає Get-VpnConnectionRoutesкомандлету, тому керувати цими правилами може бути важко.

3) Перевірте та переконайтеся, що роботи маршрутизації, як очікувалося!

Якщо ви додали стійкі маршрути, ви можете перевірити їх, виконавши netstat -rn | grep -A10 'Persistent Routes'.

І, нарешті, запустіть кілька tracertкоманд як проти IP-адрес, до яких слід отримати доступ через VPN, так і проти тих, які повинні працювати без VPN.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.