Jak ustawić selektywny ruch w sieci Windows VPN (według sieci docelowej)?

139

Chcę używać Windows VPN, ale tylko dla określonej sieci, aby nie przejmowała całego mojego połączenia sieciowego.

np. Zamiast VPN staje się domyślną trasą, uczyń ją tylko trasą 192.168.123.0/24

(Widzę, że istnieje rozwiązanie tego problemu dla Ubuntu w tym pytaniu , ale czasami muszę to zrobić również w systemie Windows)

Czy można to zautomatyzować, aby za każdym razem, gdy łączę się z VPN, robi to?

Legooolas
źródło
Czy istnieje podobne pytanie dotyczące filtrowania wielu witryn za pośrednictwem sieci VPN? Wygląda na to, że odpowiedzi tutaj będą działać tylko w przypadku, gdy istnieje jedna strona za VPN. Jestem w Chinach i około połowa witryn, z których chciałbym korzystać, jest zablokowana, więc powinienem przejść przez VPN, ale inne strony są szybsze / płynniejsze bez VPN.
hippietrail
Poszedłem dalej i zadałem nowe pytanie: superuser.com/questions/925947
hippietrail

Odpowiedzi:

139

Możesz wyłączyć przejmowanie całego połączenia, przechodząc do właściwości VPN, Networkingzakładki, Internet Protocol (TCP/IP)właściwości Advanced, odznacz Use default gateway on remote network. To może, ale nie musi oznaczać trasy, w 192.168.123.0/24zależności od konfiguracji serwera VPN. Jeśli nie, musisz za każdym razem ręcznie dodać trasę, chociaż możesz umieścić ją w pliku wsadowym.

Aby ręcznie dodać trasę, uruchom (jako administrator):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

Ten przykład spowoduje trwałe (nie jest konieczne uruchomienie polecenia po ponownym uruchomieniu) trasę do adresu IP 192.168.0.12przez bramę VPN 10.100.100.254.

Więcej na ten temat na http://technet.microsoft.com/en-us/library/bb878117.aspx

TRS-80
źródło
1
„Musisz ręcznie dodać trasę” ... jak? Jak ktoś zmusza, powiedzmy „192.168.10.123”, aby przejść przez VPN, ale nic więcej?
Timothy Khouri,
16
Osobiście uznałem, że samo wyłączenie pola wyboru było wystarczające. Nie musiałem dodawać żadnych tras. Za pomocą licznych tracertów sprawdziłem, że wszystko idzie tam, gdzie się spodziewałem.
eidylon
1
To samo, to pole wyboru było wszystkim, co było potrzebne.
Łuk
1
Proszę o wyjaśnienie. Który ruch jest kierowany przez VPN? Czy to tylko ruch kierowany na adres IP serwera VPN? Na przykład, jeśli połączenie VPN przechodzi do „my.domain.com”, to czy to oznacza, że ​​cały ruch na kliencie do „my.domain.com” przechodzi przez VPN, a wszystko inne idzie do domyślnej bramy?
Triynko,
1
Użyłem polecenia „route print” i zweryfikowałem, że trasy wygenerowane przez Windows 7 były całkowicie błędne. Nie wysyłał ruchu adresowanego do mojego adresu IP VPN do VPN ... zamiast tego wysyłał go do mojej lokalnej bramy. W tabeli znalazło się także kilka okrągłych wpisów. Usunąłem trasę utworzoną przez system Windows, a następnie ręcznie dodałem poprawną trasę, aby wpis adresu IP mojego serwera VPN używał bramy VPN i lokalnego adresu IP klienta dla interfejsu. Ruch do mojego serwera VPN został następnie pomyślnie przekierowany przez tunel VPN, a cały pozostały ruch nie zmienił się zgodnie z oczekiwaniami. Działa dobrze.
Triynko,
20

Z powodzeniem zastosowałem technikę @ TRS-80 , aby to osiągnąć.

Pracuję z domu i muszę połączyć się z VPN do sieci korporacyjnej, aby otrzymywać pocztę e-mail (nienawidzę poczty internetowej !!).

Jednocześnie muszę ciągle surfować po informacje, a także potrzebuję youtube do mojej muzyki w tle ... Teraz zdecydowanie nie chcesz streamować youtube z VPN, ponieważ to brzmi jak śpiew robota !!! :)

Wszystko, co zrobiłem, to obserwowałem @ TRS-80:

właściwości VPN, karta Sieć, właściwości „Protokół internetowy (TCP / IP)”, Zaawansowane, odznacz „Użyj domyślnej bramy w sieci zdalnej”

a potem zrobiłem własne:

w zakładce DNS zaznacz „zarejestruj adresy połączeń w DNS”

Wszystko działa bezproblemowo!

bPratik
źródło
9

Przyznana ta odpowiedź nie odzwierciedla Twojego żądania, ale używam maszyny wirtualnej specjalnie do tego celu. W ten sposób tylko sieć wewnątrz maszyny wirtualnej jest ograniczona przez trasy.

Możesz znaleźć jakieś lepsze odpowiedzi od innych osób, ale przynajmniej może to dać ci coś do rozważenia, ponieważ jest to łatwe rozwiązanie po utworzeniu maszyny wirtualnej.

Wayne
źródło
To dobre rozwiązanie, pod warunkiem, że Twój sprzęt dobrze sobie z tym poradzi.
Enigma
Używał tego rozwiązania przez lata, aż znalazł ten wątek. :)
ov
7

Stwierdziłem, że należy bezpośrednio wskazać interfejs w poleceniu route. Bez tego system Windows użyje głównego interfejsu karty sieciowej zamiast VPN. W moim przypadku to wygląda

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

zwróć uwagę na „IF 26”.

Dmitrij Pietrow
źródło
To również działało dla mnie. Aby dowiedzieć się, który interfejs potrzebujesz, po prostu uruchom polecenie „route print” i sprawdź pierwsze linie wyświetlające listę dostępnych interfejsów (znajdź tam swoją VPN i sprawdź JEŻELI - będzie w pierwszej kolumnie).
Funbit
Jest na to genialny artykuł: link . Używanie 0.0.0.0 jako domyślnego adresu IP bramy również wydaje się działać dobrze, więc nie trzeba jej dostosowywać po zmianie. Byłoby wspaniale włączyć się do tej odpowiedzi, ponieważ imo jest o wiele bardziej przydatna niż pierwsza.
lpd
5

Użyj polecenia cmdlet Add-VpnConnectionRoute w systemie Windows 8+.

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
Der_Meister
źródło
Działa to idealnie dla mnie w systemie Windows 10.
prześwietlenie
4

jeśli masz zarówno IPV4, jak i IPV6, musisz odznaczyć opcję „Użyj domyślnej bramy w sieci zdalnej” w obu miejscach, nawet jeśli używasz tylko IPV4

Dave
źródło
2

Chcę dodać moje rozwiązanie do miksu. Działa na powłoce UNIX zasilanej przez Cygwin w systemie Windows 7 lub nowszym, ale powinien również działać z MSYS2, Bash-on-Windows [WSL] po kompilacji 14986 lub Busybox dla Windows). Musi być uruchamiany z uprawnieniami administratora.

Ma pewne ustawienia i próbuje wykryć niektóre rzeczy, które nie zostały wyraźnie ustawione. Ustawia również jawnie numer interfejsu (IF), aby przeciwdziałać niektórym problemom, jakie niektórzy użytkownicy (jak ja) mieli z innymi rozwiązaniami tutaj.

#!/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

Warto również zauważyć, że może być konieczne ręczne ustawienie niskiej metryki lub w przeciwnym razie domyślna trasa zostanie dopasowana przed ruchem przeznaczonym dla sieci VPN. W tym celu należy przejść do ustawienia karty, w którym otwiera się pozycję menu „… Właściwości” karty VPN → karta „Sie攄Protokół internetowy w wersji 4 (TCP / IP)” Właściwości → „Zaawansowane” → i tam odznaczać „Automatic metryczny” checkbox (oprócz „Użyj domyślnej bramy ...” oczywiście) i ustawić wartość w „Interface metric:” pole do wartości niższej niż domyślnej trasy (patrz ROUTE.EXE -4 printwyjście).

phk
źródło
1

Trochę stary, ale znalazłem sposób, aby to zrobić za pomocą innej maszyny. Mam laptopa, na którym konfiguruję połączenie VPN, a tam mam FreeProxy skonfigurowane z Socks5 ..

Następnie skonfigurowałem firefox na moim komputerze klienckim, aby korzystał z serwera proxy laptopa. W rezultacie, jeśli użyję FireFox lub czegokolwiek, co jest skonfigurowane do używania tego proxy Socks5, użyje VPN, w przeciwnym razie użyje standardowego routingu.

Lonnie
źródło
1

Możesz użyć czegoś takiego jak netcatcher - po prostu dodaj wszystkie potrzebne trasy raz i zapomnij o tym. Automatycznie doda i usunie trasy po połączeniu lub rozłączeniu sesji VPN. Jeśli adres IP VPN jest uzyskiwany dynamicznie (DHCP), łapacz sieci łapie go i odpowiednio aktualizuje trasy.

Andy
źródło
2
jeśli jest to coś, co napisałeś, musisz ujawnić, że anseko.com/about.html zobacz często zadawane pytania
Jeff Atwood
1

z rosyjskiego forum: http://forum.ixbt.com/topic.cgi?id=14:43549

zapisz jako plik (np: vpn_route.vbs) i po podłączeniu VPN wykonaj polecenie

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
Shibormot
źródło
1

Nie można tego zrobić w systemie Windows bez użycia dodatkowych programów, plików wsadowych lub wiersza polecenia. Alternatywą jest zdobycie wirtualnej (lub fizycznej) maszyny, na której można uruchomić VPN.

Wydaje się dziwne, że coś tak łatwego do wytłumaczenia jest tak trudne do osiągnięcia. Jak trudne może być po prostu przekierowanie ruchu z jednego programu do interfejsu VPN i wszystkich innych programów do domyślnego interfejsu NIC? Dlaczego mielibyśmy do tego konfigurować całą maszynę wirtualną? Z Linuksem jest to możliwe, ale jego rozwiązanie również nie jest zbyt eleganckie.

Jest również bardzo poszukiwany: natknąłem się na dziesiątki wątków na ten sam temat. Mam tylko nadzieję, że ktoś zda sobie sprawę z tego niedorzeczności i coś z tym zrobi. (W Windows 8!)

To rozwiązanie pochodzi z nieprzypisanego pliku wsadowego . Został on lekko dostosowany.

Instrukcje dla systemu Windows 7

Skrypt połączy się i ruchu trasy poprzez VPN aż do restartu - można zastąpić route addz route -p adddo zmiany utrzymują się, ale jeśli nie masz uporczywy IP z sieci VPN, to w końcu przestać działać, gdy zmiany IP VPN.

  1. Otwórz Centrum sieci i udostępniania
  2. Otwórz właściwości swojego połączenia VPN
  3. Kliknij Networkingzakładkę
  4. Zarówno dla IPv4, jak i 6:
    1. Kliknij Properties
    2. Kliknij Advanced
    3. Odznacz Use default gateway[...]
  5. Zamknij wszystko otwarte z poprzednich kroków
  6. Edytuj i zapisz skrypt partii znajdujący się poniżej
  7. Uruchom go jako administrator

W skrypcie należy zastąpić następujące elementy:

  • <VPN> o nazwie utworzonego połączenia VPN
  • <USER> z nazwą użytkownika VPN
  • <PASS> z hasłem VPN
  • <TARGET> z adresem IP, który chcesz przekierować przez VPN (jeśli chcesz trasować więcej adresów, po prostu zduplikuj trzy linie, w których używany jest cel)

Uwaga: Jeśli nie chcesz zapisywać hasła w pliku, należy wymienić <PASS>z %password%i dodaj następujący po pierwszej linii skryptu: set password= Input password:.

Scenariusz

@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
Xantippe
źródło
0

„Krótki” przewodnik dla noobów takich jak ja, którzy niewiele wiedzą o sieciach. Nie wiele tu nowych, ale podsumowanie wszystkich dobrych opcji opisanych w poprzednich odpowiedziach i innych powiązanych wątkach. Cała procedura składa się z 3 podstawowych kroków:

1) Upewnij się, że cały ruch NIE przechodzi przez VPN. W tym celu należy odznaczyć Use default gateway on remote networkpole wyboru w ustawieniach VPN. Usuń zaznaczenie tego pola wyboru zarówno dla IPv4, jak i IPv6. Zwykle po prostu całkowicie wyłączam protokół IPv6 dla połączenia VPN.

(!) Jest (czasami) możliwe, że odznaczenie tego pola wyboru wystarczy do normalnej pracy - z mojego doświadczenia wynika, że ​​niezbędne trasy (które będą kierowały konieczny ruch przez VPN) można dodawać automatycznie po ustanowieniu połączenia VPN. Nie wiem dokładnie, gdzie i jak te reguły są skonfigurowane, ale taki scenariusz istnieje - prawdopodobnie jest to magia zrobiona przez administratorów sieci VPN.

2) Wykonuj tylko niezbędny ruch, przechodząc przez VPN. W tym celu musisz zdefiniować trasy. Tutaj masz 3 opcje:

2.1) Dodaj stałą trasę przez bramę VPN:

route -p add a.b.c.d/<CIDR> w.x.y.z lub route -p add a.b.c.d mask e.f.g.h w.x.y.z

gdzie „brama VPN” = „twój adres IP w sieci VPN” = w.x.y.zi adres docelowy / sieć = a.b.c.d. Możesz znaleźć w.x.y.z, wykonując ipconfigi szukając nazwy połączenia VPN lub, jeśli używasz PowerShell, możesz uzyskać kompaktowe wyjście, wykonując ipconfig | grep -A5 PPP(co wyprowadzi 5 linii po znalezieniu każdego połączenia PPP).

Minusy: będziesz musiał ponownie utworzyć trasy, jeśli zmieni się twój adres IP VPN.

2.2) Dodaj stałą trasę przez interfejs sieci VPN:

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

gdzie a.b.c.djest docelowy adres / sieć i interface numberjest identyfikatorem twojego połączenia VPN. Identyfikator ten można znaleźć poprzez wykonanie netstat -rn, lub dla bardziej zwartej wyjściu netstat -rn | grep -A10 'Interface List'.

Plusy: nie musisz nic zmieniać, jeśli zmieni się Twój adres VPN ( w.x.y.z).

Minusy: musisz ponownie utworzyć trasy z nowym identyfikatorem, jeśli usuniesz połączenie VPN.

2.3) Użyj polecenia cmdlet programu PowerShell:

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

Plusy: niezbędne trasy są dodawane za każdym razem, gdy połączenie VPN jest ustanawiane i usuwane za każdym razem, gdy jest rozłączane.

Minusy: nie ma polecenia Get-VpnConnectionRoutescmdlet, więc zarządzanie tymi regułami może być trudne.

3) Sprawdź i upewnij się, że routing działa zgodnie z oczekiwaniami!

Jeśli dodałeś trwałe trasy, możesz je sprawdzić, wykonując netstat -rn | grep -A10 'Persistent Routes'.

Na koniec uruchom kilka tracertpoleceń przeciwko obu adresom IP, które mają być dostępne przez VPN, i przeciwko tym, które powinny działać bez VPN.

ov
źródło