Wie kann ich den routenselektiven Windows-VPN-Verkehr (nach Zielnetzwerk) festlegen?


139

Ich möchte ein Windows-VPN nur für ein bestimmtes Netzwerk verwenden, damit es nicht meine gesamte Netzwerkverbindung übernimmt.

Beispiel: Statt das VPN zur Standardroute zu machen, legen Sie nur die Route für 192.168.123.0/24 fest

(Ich kann sehen, dass es in dieser Frage eine Lösung für Ubuntu gibt , aber manchmal muss ich das auch unter Windows tun.)

Kann dies automatisiert werden, sodass dies immer dann geschieht, wenn ich eine Verbindung zum VPN herstelle?


Gibt es eine verwandte Frage zum Filtern einer Reihe von Websites über VPN? Es sieht so aus, als würden die Antworten hier nur für den Fall funktionieren, dass sich hinter VPN eine einzige Site befindet. Ich bin in China und ungefähr die Hälfte der Sites, die ich verwenden möchte, ist blockiert, sollte also über VPN gehen, aber andere Sites sind ohne VPN schneller / reibungsloser.
Hippietrail

Ich ging weiter und fragte einen neuen Frage: superuser.com/questions/925947
Hippie Trail

Antworten:


139

Sie können die Übernahme Ihrer gesamten Verbindung deaktivieren, indem Sie zu den Eigenschaften von VPN, NetworkingRegisterkarte, Internet Protocol (TCP/IP)Eigenschaften Advanced, Deaktivieren wechseln Use default gateway on remote network. Dies kann 192.168.123.0/24je nach Einrichtung des VPN-Servers eine Route zu hinterlassen oder auch nicht . Wenn dies nicht der Fall ist, müssen Sie die Route jedes Mal manuell hinzufügen, obwohl Sie sie auch in eine Stapeldatei einfügen könnten.

Um die Route manuell hinzuzufügen, führen Sie (als Administrator) Folgendes aus:

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

In diesem Beispiel wird eine dauerhafte Route zur IP-Adresse 192.168.0.12über das VPN-Gateway erstellt (der Befehl muss nach einem Neustart nicht ausgeführt werden) 10.100.100.254.

Weitere Informationen hierzu finden Sie unter http://technet.microsoft.com/en-us/library/bb878117.aspx


1
"Sie müssen die Route manuell hinzufügen" ... wie? Wie erzwingt jemand, sagen wir, "192.168.10.123", das VPN zu durchlaufen, aber sonst nichts?
Timothy Khouri

16
Ich persönlich fand es ausreichend, das Kontrollkästchen auszuschalten. Ich musste keine Routen hinzufügen. Ich habe über zahlreiche Tracerts überprüft, ob alles dort läuft, wo ich es erwarten würde.
Eidylon

1
Dieses Kontrollkästchen war alles, was benötigt wurde.
Luk

1
Bitte klären Sie. Welcher Verkehr wird über das VPN geroutet? Geht es nur um Datenverkehr, der auf die IP des VPN-Servers abzielt? Wenn die VPN-Verbindung beispielsweise zu "my.domain.com" führt, wird dann der gesamte Datenverkehr auf dem Client zu "my.domain.com" über das VPN geleitet, und alles andere wird an das Standardgateway geleitet?
Triynko

1
Ich habe den Befehl "route print" verwendet und festgestellt, dass die von Windows 7 generierten Routen absolut falsch sind. Es wurde kein an die IP meines VPN adressierter Datenverkehr an das VPN gesendet ... stattdessen wurde er an mein lokales Gateway gesendet. Es gab auch ein paar runde Einträge in der Tabelle. Ich habe die von Windows erstellte Route gelöscht und dann die richtige Route manuell hinzugefügt, damit der IP-Adresseintrag meines VPN-Servers das VPN-Gateway und die lokale IP des Clients für die Schnittstelle verwendet. Der Datenverkehr zu meinem VPN-Server wurde dann erfolgreich durch den VPN-Tunnel geleitet, und der gesamte andere Datenverkehr war erwartungsgemäß nicht betroffen. Funktioniert gut.
Triynko

20

Ich habe die Technik des @ TRS-80 erfolgreich angewendet , um dies zu erreichen.

Ich arbeite von zu Hause aus und muss für meine E-Mails eine VPN-Verbindung zum Unternehmensnetzwerk herstellen (ich hasse Webmail !!).

Gleichzeitig muss ich ständig nach Informationen surfen und brauche auch YouTube für meine Hintergrundmusik ... Jetzt willst du definitiv kein YouTube von einem VPN streamen, da es sich so anhört wie ein Robot Singing !!! :)

Alles was ich getan habe war @ TRS-80 zu folgen:

Eigenschaften von VPN, Registerkarte Netzwerk, Eigenschaften von "Internetprotokoll (TCP / IP)", Erweitert, Deaktivieren Sie "Standardgateway im Remotenetzwerk verwenden".

und habe dann mein eigenes gemacht:

Aktivieren Sie auf der Registerkarte DNS das Kontrollkästchen "Diese Verbindungsadressen in DNS registrieren".

Alles funktioniert nahtlos!


9

Zugegeben, diese Antwort entspricht nicht Ihrer Anfrage, aber ich verwende eine VM speziell für diesen Zweck. Auf diese Weise wird nur das Netzwerk innerhalb der VM durch die Routen eingeschränkt.

Möglicherweise finden Sie einige bessere Antworten von anderen Personen, aber zumindest sollten Sie dies in Betracht ziehen, da dies nach der Erstellung der VM eine einfache Lösung ist.


Dies ist eine gute Lösung, sofern Ihre Hardware gut damit umgehen kann.
Enigma

Habe diese Lösung jahrelang benutzt, bis ich diesen Thread gefunden habe. :)
ov

7

Ich fand, dass es Schnittstelle im Wegbefehl direkt zeigen musste. Andernfalls wird Windows anstelle von VPN die Hauptschnittstelle der Netzwerkkarte verwenden. In meinem Fall sieht es so aus

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

beachte das 'IF 26'.


Das hat auch bei mir funktioniert. Um herauszufinden, welche Schnittstelle Sie benötigen, führen Sie einfach den Befehl "route print" aus und überprüfen Sie in den ersten Zeilen die Liste der verfügbaren Schnittstellen (suchen Sie dort Ihr VPN und überprüfen Sie dessen IF - es befindet sich in der ersten Spalte).
Funbit

Es gibt einen brillanten Artikel zu diesem Thema: Link . Die Verwendung von 0.0.0.0 als Standard-Gateway-IP scheint ebenfalls gut zu funktionieren, sodass sie bei Änderungen nicht angepasst werden muss. Es wäre toll, in diese Antwort aufzunehmen, da sie meiner Meinung nach weitaus nützlicher ist als die oberste.
16.06.15

5

Verwenden Sie das Cmdlet Add- VpnConnectionRoute in Windows 8+.

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

Dies funktionierte perfekt für mich unter Windows 10.
Röntgen

4

Wenn Sie sowohl IPV4 als auch IPV6 verwenden, müssen Sie an beiden Stellen das Kontrollkästchen "Standardgateway für Remotenetzwerk verwenden" deaktivieren, auch wenn Sie nur IPV4 verwenden



2

Ich möchte meine Lösung zum Mix hinzufügen. Es läuft auf einer Cygwin-basierten UNIX-Shell unter Windows 7 oder neuer, sollte aber auch mit MSYS2, Bash-on-Windows [WSL] nach Build 14986 oder Busybox für Windows funktionieren. Muss mit Administratorrechten ausgeführt werden.

Es hat einige Einstellungen und versucht, einige der Dinge zu erkennen, die Sie nicht explizit eingestellt haben. Außerdem wird die Schnittstellennummer (IF) explizit festgelegt, um einigen Problemen entgegenzuwirken, die einige Benutzer (wie ich) mit den anderen Lösungen hier hatten.

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

Es ist auch erwähnenswert, dass es möglicherweise erforderlich ist, manuell eine niedrige Metrik festzulegen, da sonst die Standardroute vor dem für das VPN bestimmten Datenverkehr übereinstimmt. Gehen Sie dazu zu der Adaptereinstellung, in der Sie den Menüpunkt "… Eigenschaften" für den VPN-Adapter öffnen → Registerkarte "Netzwerk" → Eigenschaften von "Internet Protocol Version 4 (TCP / IP)""Erweitert" → und dort deaktivieren der „automatischen metric“ Kontrollkästchen (zusätzlich zu dem „Standard - Gateway ...“ natürlich) und den Wert in der Menge „Interface metric:“ Feld auf einen Wert niedriger als die Standardroute (siehe ROUTE.EXE -4 printAusgang).


1

Ein bisschen alt, aber ich habe einen Weg gefunden, dies mit einer anderen Maschine zu tun. Ich habe einen Laptop, auf dem ich die VPN-Verbindung einrichte, und dort habe ich FreeProxy mit Socks5 eingerichtet.

Dann richte ich Firefox auf meinem Clientcomputer ein, um den Proxyserver des Laptops zu verwenden. Das Ergebnis ist, dass wenn ich Firefox oder etwas anderes verwende, das für die Verwendung dieses Socks5-Proxys eingerichtet ist, das VPN verwendet wird, andernfalls wird das Standardrouting verwendet.


1

Sie können so etwas wie netcatcher verwenden - fügen Sie einfach alle benötigten Routen einmal hinzu und vergessen Sie sie. Es werden automatisch Routen hinzugefügt und gelöscht, wenn Sie Ihre VPN-Sitzung verbinden oder trennen. Wenn Ihre VPN-IP-Adresse dynamisch bezogen wird (DHCP), wird sie von Netcatcher abgefangen und die Routen werden ordnungsgemäß aktualisiert.


2
Wenn dies etwas ist, das Sie geschrieben haben, müssen Sie dies anseko.com/about.html offenlegen. Siehe FAQ
Jeff Atwood

1

aus dem russischen Forum: http://forum.ixbt.com/topic.cgi?id=14:43549

Als Datei speichern (Beispiel: vpn_route.vbs) und nach dem Verbinden von vpn den Befehl ausführen

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

Dies ist in Windows nicht möglich, ohne zusätzliche Programme, Batchdateien oder die Befehlszeile zu verwenden. Eine Alternative besteht darin, eine virtuelle (oder physische) Maschine zu erhalten, auf der Sie das VPN ausführen können.

Es ist seltsam, dass etwas so einfach zu erklären ist, wie es so schwer zu erreichen ist. Wie schwierig könnte es sein, den Datenverkehr nur von einem Programm zur VPN-Schnittstelle und alle anderen Programme zur Standard-NIC-Schnittstelle zu leiten? Warum müssen wir dafür eine ganze virtuelle Maschine einrichten? Und mit Linux ist es möglich, aber seine Lösung ist auch nicht sehr elegant.

Es ist auch sehr gefragt: Ich bin auf Dutzende von Threads zum selben Thema gestoßen. Ich hoffe also nur, dass jemand die Lächerlichkeit dieser Dinge erkennt und etwas dagegen unternimmt. (In Windows 8!)

Diese Lösung stammt aus einer nicht zugeordneten Batchdatei . Es wurde leicht angepasst.

Anleitung für Windows 7

Das Skript wird auf und leiten den Verkehr durch den VPN bis zu einem Neustart verbinden - Sie ersetzen können route addmit route -p addfür die Änderung bestehen bleiben, aber wenn Sie keine permanente IP mit Ihrem VPN haben, wird es irgendwann aufhören zu arbeiten , wenn die VPN - IP - Änderungen.

  1. Öffnen Sie das Netzwerk- und Freigabecenter
  2. Öffnen Sie die Eigenschaften für Ihre VPN-Verbindung
  3. Klicken Sie auf die NetworkingRegisterkarte
  4. Für IPv4 und 6:
    1. Klicken Properties
    2. Klicken Advanced
    3. Deaktivieren Sie Use default gateway[...]
  5. Schließen Sie alles, was in den vorherigen Schritten geöffnet wurde
  6. Bearbeiten und speichern Sie das unten stehende Stapelskript
  7. Führen Sie es als Administrator aus

Sie müssen Folgendes im Skript ersetzen:

  • <VPN> mit dem Namen der von Ihnen erstellten VPN-Verbindung
  • <USER> mit dem VPN-Benutzernamen
  • <PASS> mit dem VPN-Passwort
  • <TARGET> mit der IP-Adresse, die Sie über das VPN weiterleiten möchten (wenn Sie mehr Adressen weiterleiten möchten, duplizieren Sie einfach die drei Zeilen, in denen das Ziel verwendet wird)

Hinweis: Wenn Sie das Passwort nicht in der Datei gespeichert werden soll, ersetzen Sie <PASS>mit %password%und fügen Sie die folgende nach der ersten Zeile des Skripts: set password= Input password:.

Skript

@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

Ein "kurzer" Leitfaden für Noobs wie mich, die nicht viel über Netzwerke wissen. Nicht viel Neues hier, aber eine Zusammenfassung aller guten Optionen, die in früheren Antworten und in anderen verwandten Themen beschrieben wurden. Das gesamte Verfahren besteht aus 3 grundlegenden Schritten:

1) Stellen Sie sicher, dass der gesamte Datenverkehr NICHT über VPN erfolgt. Dazu müssen Sie das Use default gateway on remote networkKontrollkästchen in den VPN-Einstellungen deaktivieren . Deaktivieren Sie dieses Kontrollkästchen für IPv4 und IPv6. Normalerweise deaktiviere ich das IPv6-Protokoll für die VPN-Verbindung einfach vollständig.

(!) Es ist (manchmal) möglich, dass das Deaktivieren dieses Kontrollkästchens für die normale Arbeit ausreicht - meiner Erfahrung nach können erforderliche Routen (die den erforderlichen Datenverkehr über VPN leiten) automatisch hinzugefügt werden, nachdem die VPN-Verbindung hergestellt wurde. Ich weiß nicht genau, wo und wie diese Regeln konfiguriert sind, aber es gibt ein solches Szenario - wahrscheinlich ist es eine Zauberei, die von VPN-Netzwerkadministratoren ausgeführt wird.

2) Stellen Sie nur den erforderlichen Datenverkehr über VPN her. Dazu müssen Sie Routen definieren. Hier haben Sie 3 Möglichkeiten:

2.1) Permanente Route über VPN-Gateway hinzufügen:

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

Dabei ist 'VPN-Gateway' = 'Ihre IP im VPN-Netzwerk' = w.x.y.zund Zieladresse / Netzwerk = a.b.c.d. Sie können suchen, w.x.y.zindem ipconfigSie den Namen Ihrer VPN-Verbindung ausführen und nach diesem suchen. Wenn Sie PowerShell verwenden, können Sie eine kompakte Ausgabe erhalten, indem Sie ausführen ipconfig | grep -A5 PPP(die nach dem Auffinden jeder PPP-Verbindung 5 Zeilen ausgibt).

Nachteile: Sie müssen Routen neu erstellen, wenn sich Ihre VPN-IP ändert.

2.2) Fügen Sie eine permanente Route über die VPN-Netzwerkschnittstelle hinzu:

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

wo a.b.c.dist die Zieladresse / Netzwerk und interface numberist die Kennung Ihrer VPN-Verbindung. Diese ID kann durch Ausführen von netstat -rnoder für eine kompaktere Ausgabe ermittelt werden netstat -rn | grep -A10 'Interface List'.

Vorteile: Sie müssen nichts ändern, wenn sich Ihre VPN-Adresse ( w.x.y.z) ändern wird.

Nachteile: Sie müssen Routen mit neuer ID neu erstellen, wenn Sie Ihre VPN-Verbindung löschen.

2.3) Verwenden Sie das PowerShell-Cmdlet:

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

Vorteile: Die erforderlichen Routen werden jedes Mal hinzugefügt, wenn eine VPN-Verbindung hergestellt und bei jedem Trennen gelöscht wird.

Nachteile: Es gibt kein Get-VpnConnectionRoutesCmdlet, daher kann es schwierig sein, diese Regeln zu verwalten.

3) Überprüfen und sicherstellen, dass das Routing wie erwartet funktioniert!

Wenn Sie persistente Routen hinzugefügt haben, können Sie diese durch Ausführen von überprüfen netstat -rn | grep -A10 'Persistent Routes'.

Führen Sie schließlich einige tracertBefehle für beide IP-Adressen aus, auf die über VPN zugegriffen werden soll, und für diejenigen, die ohne VPN funktionieren sollen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.