it-swarm-ru.tech

Как я могу сделать выборочный трафик Windows VPN по маршруту (по сети назначения)?

Я хочу использовать Windows VPN, но только для конкретной сети, чтобы она не захватила все мое сетевое соединение.

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

(Я вижу, что есть решение для Ubuntu в этом вопросе , но иногда мне приходится делать это и в Windows)

Можно ли это автоматизировать, чтобы при каждом подключении к VPN это делалось?

135
Legooolas

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

135
TRS-80

Я успешно использовал метод @ TRS-80 для достижения этой цели.

Я работаю из дома и вынужден подключаться к VPN по корпоративной сети для получения электронной почты (я ненавижу веб-почту !!).

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

Все, что я сделал, это следил за @ TRS-80:

свойства VPN, вкладка «Сеть», свойства «Протокол Интернета (TCP/IP)», «Дополнительно», снимите флажок «Использовать шлюз по умолчанию в удаленной сети»

а потом сделал свое:

под вкладкой DNS поставьте галочку "зарегистрировать адреса подключений в DNS"

Все работает без проблем!

19
bPratik

Конечно, этот ответ не отражает ваш запрос, но я использую VM специально для этой цели. Таким образом, только сеть внутри VM ограничена маршрутами.

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

8
Wayne

Я обнаружил, что нужно напрямую указать интерфейс в команде 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
Dmitry Petrov

если у вас есть и IPV4, и IPV6, вы должны снять флажок «Использовать шлюз по умолчанию в удаленной сети» в обоих местах, даже если вы используете только IPV4

4
Dave

Если вы используете CMAK и настроите файл маршрутизации, который клиент может загрузить ... Windows загрузит файл маршрутизации и отрегулирует маршруты соответствующим образом. Есть варианты, чтобы удалить маршрут по умолчанию ... и добавить различные статические маршруты и тому подобное. Это известно как разделенный туннель между прочим.

Здесь есть хорошие инструкции: http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx

3
TheCompWiz

Я хочу добавить свое решение в смесь. Он работает на оболочке 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 → «Сеть» tab → «Протокол Интернета версии 4 (TCP/IP)» Свойства → «Дополнительно» → и там вы снимаете флажок «Автоматическая метрика» (в дополнение к «Использовать шлюз по умолчанию…» конечно) и задаете значение в «Метрика интерфейса:» поле со значением, меньшим, чем маршрут по умолчанию (см. Вывод ROUTE.EXE -4 print).

2
phk

Используйте Add-VpnConnectionRoute командлет в Windows 8+.

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

Вы можете использовать что-то вроде netcatcher - просто добавьте все маршруты, которые вам нужны, один раз и забудьте об этом. Он будет автоматически добавлять и удалять маршруты при подключении или отключении сеанса VPN. Если ваш IP-адрес VPN получен динамически (DHCP), netcatcher перехватит его и правильно обновит маршруты.

1
Andy

с русского форума: 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
shibormot

Немного старый, но я нашел способ сделать это, используя другую машину. У меня есть ноутбук, на котором я установил VPN-соединение, и там у меня есть FreeProxy с Socks5 ..

Затем я настроил Firefox на своем клиентском компьютере для использования прокси-сервера ноутбука. В результате, если я использую FireFox или все, что настроено для использования этого прокси-сервера Socks5, он будет использовать VPN, в противном случае он использует стандартную маршрутизацию.

1
Lonnie

Это невозможно сделать в Windows без использования дополнительных программ, командных файлов или командной строки. Альтернативой является получение виртуальной (или физической) машины, на которой вы можете запустить VPN.

Кажется странным, что что-то так легко объяснимо, как это так трудно достичь. Насколько сложно может быть просто перенаправить трафик из одной программы на интерфейс VPN, а все остальные программы - на интерфейс по умолчанию NIC? Зачем нам нужно настраивать целую виртуальную машину для этого? А с Linux это возможно, но его решение тоже не очень элегантно.

Это тоже очень востребовано: я наткнулся на десятки тем на эту тему. Поэтому я только надеюсь, что кто-то осознает нелепость этого и что-то с этим сделает. (В Windows 8!)

Это решение из неназначенного командного файла . Это было немного адаптировано.

Инструкция для Windows 7

Сценарий будет подключаться и маршрутизировать трафик через VPN до перезагрузки - вы можете заменить route add на route -p add, чтобы изменения сохранились, но если у вас нет постоянного IP с VPN, он в конечном итоге перестанет работать, когда ваш VPN 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
1
Xantippe