Come posso rendere il traffico selettivo del percorso VPN di Windows (per rete di destinazione)?


139

Voglio usare una VPN di Windows ma solo per una particolare rete, in modo che non subentri alla mia intera connessione di rete.

ad esempio, invece che la VPN diventi la route predefinita, rendila solo la route per 192.168.123.0/24

(Vedo che esiste una soluzione per Ubuntu in questa domanda , ma a volte devo farlo anche su Windows)

Questo può essere automatizzato in modo che ogni volta che mi collego alla VPN lo faccia?


C'è una domanda correlata per filtrare un sacco di siti tramite VPN? Sembra che le risposte qui funzioneranno solo nel caso in cui ci sia un singolo sito dietro VPN. Sono in Cina e circa la metà dei siti che vorrei utilizzare sono bloccati, quindi dovrebbero passare attraverso la VPN ma altri siti sono più veloci / più fluidi senza VPN.
hippietrail,

Sono andato avanti e ho posto una nuova domanda: superuser.com/questions/925947
hippietrail

Risposte:


139

Puoi disattivare il controllo dell'intera connessione andando alle proprietà della VPN, Networkingscheda, Internet Protocol (TCP/IP)proprietà Advancede deselezionala Use default gateway on remote network. Questo può o meno lasciare una rotta a 192.168.123.0/24seconda della configurazione del server VPN. In caso contrario, dovrai aggiungere manualmente il percorso ogni volta, anche se potresti inserirlo in un file batch.

Per aggiungere manualmente il percorso, esegui (come amministratore):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

In questo esempio verrà instradato persistentemente (non è necessario eseguire il comando dopo un riavvio) verso l'IP 192.168.0.12tramite il gateway VPN 10.100.100.254.

Maggiori informazioni su http://technet.microsoft.com/en-us/library/bb878117.aspx


1
"Dovrai aggiungere manualmente il percorso" ... come? In che modo qualcuno forza, diciamo, "192.168.10.123" a passare attraverso la VPN, ma nient'altro?
Timothy Khouri,

16
Personalmente, ho scoperto che era sufficiente disattivare la casella di controllo. Non ho dovuto aggiungere alcun percorso. Ho verificato che tutto sarebbe andato dove mi sarei aspettato tramite numerosi tracert.
eidylon,

1
Lo stesso, questa casella era tutto ciò che era necessario.
Luk,

1
Si prega di precisare. Quale traffico viene instradato sulla VPN? È solo il traffico indirizzato all'IP del server VPN? Ad esempio, se la connessione VPN va a "my.domain.com", significa che tutto il traffico sul client a "my.domain.com" passa attraverso la VPN e tutto il resto va al gateway predefinito?
Triynko,

1
Ho usato il comando "route print" e ho verificato che le route generate da Windows 7 erano completamente errate. Non stava inviando traffico indirizzato all'IP della mia VPN alla VPN ... invece lo stava inviando al mio gateway locale. C'erano anche alcune voci circolari nella tabella. Ho eliminato il percorso creato da Windows, quindi ho aggiunto manualmente il percorso corretto in modo che la voce dell'indirizzo IP del mio server VPN utilizzasse il gateway VPN e l'IP locale del client per l'interfaccia. Il traffico sul mio server VPN è stato quindi instradato correttamente attraverso il tunnel VPN e tutto il resto del traffico non è stato influenzato come previsto. Funziona bene.
Triynko,

20

Ho usato con successo la tecnica di @ TRS-80 per raggiungere questo obiettivo.

Lavoro da casa e devo VPN sulla rete aziendale per la mia e-mail (odio la webmail !!).

Allo stesso tempo, ho bisogno di navigare costantemente per informazioni e ho anche bisogno di YouTube per la mia musica di sottofondo ... Ora non vuoi assolutamente mandare in streaming YouTube da una VPN dal momento che sembra un Robot Singing !!! :)

Tutto quello che ho fatto è stato seguire @ TRS-80:

proprietà della VPN, scheda Rete, proprietà "Protocollo Internet (TCP / IP)", Avanzate, deselezionare "Usa gateway predefinito sulla rete remota"

e poi ho fatto il mio:

nella scheda DNS, selezionare "registra gli indirizzi di queste connessioni in DNS"

Tutto funziona alla perfezione!


9

Concesso questa risposta non riflette la tua richiesta ma utilizzo una VM appositamente per questo scopo. In questo modo solo la rete all'interno della VM è limitata dalle route.

Potresti trovare risposte migliori da altre persone, ma almeno questo potrebbe darti qualcosa da considerare in quanto soluzione semplice dopo la creazione della VM.


Questa è una buona soluzione a condizione che l'hardware sia in grado di gestirlo bene.
Enigma,

Ho usato questa soluzione per anni, fino a quando non ho trovato questa discussione. :)
ov

7

Ho scoperto che doveva indirizzare direttamente l'interfaccia nel comando route. Senza di essa, Windows utilizzerà l'interfaccia della scheda di rete principale, anziché VPN. Nel mio caso, sembra

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

notare "IF 26".


Questo ha funzionato anche per me. Per scoprire quale interfaccia è sufficiente eseguire il comando "route print" e controllare le prime righe che visualizzano l'elenco delle interfacce disponibili (trova lì la tua VPN e controlla la sua IF - sarà nella prima colonna).
Funbit

C'è un brillante articolo su questo: link . L'uso di 0.0.0.0 come IP gateway predefinito sembra funzionare anche bene, quindi non è necessario modificarlo al momento della modifica. Sarebbe bello incorporarlo in questa risposta, poiché imo è molto più utile di quello in alto.
LP


4

se hai entrambi IPV4 e IPV6 devi deselezionare "Usa gateway predefinito su rete remota" in entrambe le posizioni, anche se usi solo IPV4



2

Voglio aggiungere la mia soluzione al mix. Funziona su una shell UNIX basata su Cygwin su Windows 7 o versioni successive, ma dovrebbe funzionare anche con MSYS2, Bash-on-Windows [WSL] dopo la build 14986 o Busybox per Windows). Deve essere eseguito con i privilegi di amministratore.

Ha alcune impostazioni e cerca di rilevare alcune delle cose che non hai impostato esplicitamente. Imposta inoltre il numero di interfaccia (IF) esplicitamente per contrastare alcuni problemi che alcuni utenti (come me) hanno avuto con le altre soluzioni qui.

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

Vale anche la pena notare che potrebbe essere necessario impostare manualmente una metrica bassa o altrimenti il ​​percorso predefinito corrisponderà prima del traffico destinato alla VPN. Puoi farlo andando sull'impostazione dell'adattatore dove apri la voce di menu "... Proprietà" per l'adattatore VPN → scheda "Rete"" Proprietà del protocollo Internet versione 4 (TCP / IP)" Proprietà → "Avanzate" → e lì deseleziona la casella di controllo "Metrica automatica" (oltre alla "Usa gateway predefinito ..." ovviamente) e imposta il valore nel campo "Metrica interfaccia:" su un valore inferiore alla route predefinita (vedi ROUTE.EXE -4 printoutput).


1

Un po 'vecchio ma ho trovato il modo di farlo usando un'altra macchina. Ho un laptop in cui ho impostato la connessione VPN e lì ho FreeProxy configurato con Socks5 ..

Quindi ho installato firefox sul mio computer client per utilizzare il server proxy del laptop .. il risultato è che se uso FireFox o qualsiasi cosa sia configurata per utilizzare quel proxy Socks5, utilizzerà la VPN, altrimenti usa il routing standard.


1

Puoi usare qualcosa come netcatcher : aggiungi tutti i percorsi di cui hai bisogno una volta e dimenticalo. Aggiungerà ed eliminerà automaticamente le route quando ti connetti o disconnetti la sessione VPN. Se il tuo indirizzo IP VPN viene ottenuto in modo dinamico (DHCP) netcatcher lo prenderà e aggiornerà le rotte nel modo giusto.


2
se questo è qualcosa che hai scritto devi rivelare che anseko.com/about.html vedi faq
Jeff Atwood

1

dal forum russo: http://forum.ixbt.com/topic.cgi?id=14:43549

salva come file (es: vpn_route.vbs) e dopo vpn connesso esegui il comando

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

Questo non può essere fatto in Windows senza l'utilizzo di programmi aggiuntivi, file batch o riga di comando. Un'alternativa è quella di ottenere una macchina virtuale (o fisica) su cui è possibile eseguire la VPN.

Sembra strano che qualcosa di così facilmente spiegabile sia così difficile da raggiungere. Quanto potrebbe essere difficile instradare il traffico da un programma all'interfaccia VPN e tutti gli altri programmi all'interfaccia NIC predefinita? Perché dovremmo configurare un'intera macchina virtuale per questo? E con Linux è possibile ma anche la sua soluzione non è molto elegante.

È anche molto ricercato: mi sono imbattuto in dozzine di discussioni sullo stesso argomento. Quindi spero solo che qualcuno realizzi la risonanza di questo e faccia qualcosa al riguardo. (In Windows 8!)

Questa soluzione proviene da un file batch non attribuito . È stato leggermente adattato.

Istruzioni per Windows 7

Lo script si connetterà e instraderà il traffico attraverso la tua VPN fino al riavvio: puoi sostituirlo route addcon route -p addper rendere persistente la modifica, ma se non hai un IP persistente con la tua VPN, alla fine smetterà di funzionare quando l'IP della VPN cambia.

  1. Apri il Centro connessioni di rete e condivisione
  2. Apri le proprietà per la tua connessione VPN
  3. Fai clic sulla Networkingscheda
  4. Per IPv4 e 6:
    1. Clic Properties
    2. Clic Advanced
    3. Deseleziona Use default gateway[...]
  5. Chiudi tutto aperto dai passaggi precedenti
  6. Modifica e salva lo script batch che trovi di seguito
  7. Eseguilo come amministratore

È necessario sostituire quanto segue nello script:

  • <VPN> con il nome della connessione VPN che hai creato
  • <USER> con il nome utente VPN
  • <PASS> con la password VPN
  • <TARGET> con l'indirizzo IP che si desidera instradare attraverso la VPN (se si desidera instradare più indirizzi, è sufficiente duplicare le tre linee in cui viene utilizzato il target)

Nota: Se non si desidera salvare la password nel file, sostituire <PASS>con %password%e aggiungere la seguente dopo la prima riga dello script: set password= Input password:.

copione

@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

Una guida "breve" per i rumorosi come me, che non sanno molto delle reti. Non molto nuovo qui, ma un riepilogo di tutte le buone opzioni descritte nelle risposte precedenti e in altri thread correlati. L'intera procedura prevede 3 passaggi di base:

1) Rendere tutto il traffico NON diretto via VPN. Per questo è necessario deselezionare la Use default gateway on remote networkcasella di controllo nelle impostazioni VPN. Assicurati di deselezionare questa casella di controllo sia per IPv4 che per IPv6. Di solito disabilito completamente il protocollo IPv6 per la connessione VPN.

(!) È (a volte) possibile deselezionare la casella di controllo per il normale lavoro: nella mia esperienza, i percorsi necessari (che indirizzeranno il traffico necessario tramite VPN) possono essere aggiunti automaticamente dopo aver stabilito la connessione VPN. Non so esattamente dove e come siano configurate queste regole, ma esiste uno scenario del genere - probabilmente è una magia fatta dagli amministratori di rete VPN.

2) Rendere solo il traffico necessario diretto tramite VPN. Per questo è necessario definire percorsi. Qui hai 3 opzioni:

2.1) Aggiungi percorso permanente tramite gateway VPN:

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

dove "VPN gateway" = "il tuo IP sulla rete VPN" = w.x.y.ze indirizzo / rete target = a.b.c.d. Puoi trovarlo w.x.y.zeseguendo ipconfige cercando il nome della tua connessione VPN o, se usi PowerShell, puoi ottenere un output compatto eseguendo ipconfig | grep -A5 PPP(che produrrà 5 righe dopo aver trovato ogni connessione PPP).

Contro: dovrai ricreare i percorsi se il tuo IP VPN cambierà.

2.2) Aggiungi percorso permanente tramite interfaccia di rete VPN:

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

dove si a.b.c.dtrova l'indirizzo / la rete di destinazione ed interface numberè l'identificatore della tua connessione VPN. Questo ID può essere trovato eseguendo netstat -rn, o, per l'uscita più compatto, netstat -rn | grep -A10 'Interface List'.

Pro: non è necessario modificare nulla se il tuo indirizzo VPN ( w.x.y.z) cambierà.

Contro: è necessario ricreare i percorsi con un nuovo ID se si elimina la connessione VPN.

2.3) Utilizzare il cmdlet di PowerShell:

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

Pro: i percorsi necessari vengono aggiunti ogni volta che viene stabilita una connessione VPN ed eliminata ogni volta che viene disconnessa.

Contro: non esiste un Get-VpnConnectionRoutescmdlet, quindi può essere difficile gestire queste regole.

3) Controllare e assicurarsi che il routing funzioni come previsto!

Se sono stati aggiunti percorsi persistenti, è possibile verificarli eseguendo netstat -rn | grep -A10 'Persistent Routes'.

E, infine, esegui alcuni tracertcomandi su entrambi gli indirizzi IP che dovrebbero essere accessibili tramite VPN e contro quelli che dovrebbero funzionare senza VPN.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.