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

218411
Legooolas

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

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

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

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

131
Есть ли связанный вопрос для фильтрации группы сайтов через VPN? Похоже, что ответы здесь будут работать только для случая, когда за VPN стоит один сайт. Я нахожусь в Китае, и около половины сайтов, которые я хотел бы использовать, заблокированы, поэтому следует использовать VPN, но другие сайты работают быстрее / плавнее без VPN. hippietrail 8 лет назад 0
Я пошел дальше и задал новый вопрос: http://superuser.com/questions/925947 hippietrail 8 лет назад 0

12 ответов на вопрос

129
TRS-80

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

«Вам придется вручную добавить маршрут» ... как? Как кто-то заставляет, скажем, «192.168.10.123» пройти через VPN, но ничего больше? Timothy Khouri 12 лет назад 1
Лично я обнаружил, что достаточно просто отключить флажок. Мне не нужно было добавлять какие-либо маршруты. Я проверил все, что происходит, где я ожидал, с помощью многочисленных трассировок. eidylon 12 лет назад 15
То же самое, этот флажок был всем, что было нужно. Luk 11 лет назад 1
Просьба уточнить. Какой трафик направляется через VPN? Это просто трафик на IP-адрес VPN-сервера? Например, если VPN-соединение переходит на «my.domain.com», то означает ли это, что весь трафик клиента на «my.domain.com» проходит через VPN, а все остальное идет на шлюз по умолчанию? Triynko 11 лет назад 1
Я использовал команду «route print» и убедился, что сгенерированные Windows 7 маршруты неверны. Он не отправлял трафик, адресованный IP моего VPN, на VPN ... вместо этого он отправлял его на мой локальный шлюз. В таблице также было несколько круглых записей. Я удалил маршрут, созданный Windows, затем вручную добавил правильный маршрут, чтобы запись IP-адреса моего VPN-сервера использовала шлюз VPN и локальный IP-адрес клиента для интерфейса. Затем трафик на мой VPN-сервер был успешно направлен через VPN-туннель, и весь другой трафик не был затронут, как ожидалось. Работает хорошо. Triynko 11 лет назад 1
Мне пришлось снять флажок «Использовать шлюз по умолчанию в удаленной сети», а затем установить флажок «Отключить добавление маршрутов на основе классов», чтобы использовать мою локальную сеть в том же диапазоне IP-адресов. (Локальный и VPN оба используют `192.168.1.x` внутри) wersimmon 11 лет назад 0
@eidylon спасибо, что поделились `tracert` в качестве подсказки метода проверки. Я собирался попросить метод проверки. Ответ можно еще улучшить с помощью рабочего примера того, как проверить, что оба вида трафика идут в соответствующее «правильное место», возможно, с помощью `tracert`. n611x007 10 лет назад 0
Маршрут -p add был особенно полезен для меня, потому что наши общедоступные веб-серверы имеют области, защищенные как паролем, так и ip-ограничениями, поэтому доступ к ним возможен только из нашей собственной сети. Lenne 10 лет назад 0
Этот ответ неполон, потому что вы не упоминаете о необходимости указания интерфейса. Пожалуйста, смотрите мой ответ здесь для более полного объяснения: http://superuser.com/a/862409/16153 Jez 9 лет назад 0
Я искал способ сделать это более 2 лет! Не ожидал, что это будет так просто, как снять флажок. Знаете ли вы, как добиться того же эффекта на Ubuntu и Android? Спасибо! Bruno Finger 7 лет назад 0
18
bPratik

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

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

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

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

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

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

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

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

8
Wayne

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

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

Это хорошее решение, если ваше оборудование может с этим справиться. Enigma 11 лет назад 0
7
Dmitry Petrov

I found that it needed to directly point interface in route command. Without it, Windows going to use main network card interface, instead of VPN. In my case, it looks like

route -p add 192.168.10.187 mask 255.255.255.255 0.0.0.0 IF 26 :: ^destination ^mask ^gateway ^interface 

note the 'IF 26'.

Это сработало и для меня. Чтобы узнать, какой интерфейс вам нужен, просто выполните команду «route print» и проверьте первые строки, отображающие список доступных интерфейсов (найдите ваш VPN там и проверьте его IF - он будет в первом столбце). Funbit 9 лет назад 0
На это есть замечательная статья: [ссылка] (https://documentation.meraki.com/MX-Z/Client_VPN/Configuring_Split-tunnel_Client_VPN#Configuring_Split_Tunnel_for_Windows). Использование 0.0.0.0 в качестве IP-адреса шлюза по умолчанию, похоже, тоже работает, поэтому его не нужно настраивать при изменении. Было бы здорово включить в этот ответ, так как, по моему мнению, он гораздо полезнее, чем верхний. lpd 8 лет назад 0
4
Dave

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

3
TheCompWiz

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

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

2
phk

Я хочу добавить свое решение в смесь. Он работает на оболочке 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=$  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'[: ]+' '')  [ "$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'[: ]+' '')  [ "$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. '')  [ "$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вывод).

2
Der_Meister

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

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24 
Это отлично сработало для меня на Windows 10. x-ray 5 лет назад 0
1
Lonnie

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

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

1
Xantippe

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

Кажется странным, что что-то так легко объяснимо, как это так трудно достичь. Насколько сложно было просто перенаправить трафик от одной программы к интерфейсу VPN, а все остальные программы - к интерфейсу сетевого адаптера по умолчанию? Зачем нам нужно настраивать целую виртуальную машину для этого? А с 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. Uncheck 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