Comment rendre le trafic sélectif de la route Windows VPN (par réseau de destination)?


139

Je souhaite utiliser un réseau privé virtuel Windows, mais uniquement pour un réseau particulier, afin de ne pas prendre en charge l'intégralité de ma connexion réseau.

Par exemple, au lieu que le VPN devienne la route par défaut, définissez uniquement la route pour 192.168.123.0/24.

(Je peux voir qu'il existe une solution pour cela pour Ubuntu dans cette question , mais parfois je dois le faire aussi sous Windows)

Cela peut-il être automatisé de sorte que chaque fois que je me connecte au VPN, cela se fasse?


Existe-t-il une question connexe sur le filtrage d’un ensemble de sites via VPN? Il semble que les réponses ici ne fonctionneront que dans le cas où il n'y a qu'un seul site derrière VPN. Je suis en Chine et environ la moitié des sites que je souhaite utiliser sont bloqués. Par conséquent, vous devez passer par un réseau VPN, mais d'autres sites sont plus rapides / plus fluides sans VPN.
hippietrail

Je suis allé de l'avant et a posé une nouvelle question: superuser.com/questions/925947
hippietrail

Réponses:


139

Vous pouvez désactiver la prise en charge de l'intégralité de votre connexion en accédant aux propriétés du VPN, Networkingonglet, Internet Protocol (TCP/IP)propriétés Advanced, décochez Use default gateway on remote network. Cela peut ou non laisser une route à en 192.168.123.0/24fonction de la configuration du serveur VPN. Si ce n'est pas le cas, vous devrez ajouter manuellement l'itinéraire chaque fois, bien que vous puissiez le placer dans un fichier de traitement par lots.

Pour ajouter manuellement la route, exécutez (en tant qu'administrateur):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

Cet exemple créera un itinéraire persistant (il n'est pas nécessaire d'exécuter la commande après un redémarrage) vers l'IP 192.168.0.12via la passerelle VPN 10.100.100.254.

Plus d'informations à ce sujet sur http://technet.microsoft.com/en-us/library/bb878117.aspx


1
"Vous devrez ajouter manuellement la route" ... comment? Comment quelqu'un force-t-il, par exemple, "192.168.10.123" à passer par le vpn, mais rien d'autre?
Timothy Khouri

16
Personnellement, j'ai trouvé que le simple fait de désactiver la case à cocher suffisait. Je n'ai pas eu à ajouter d'itinéraires. J'ai vérifié que tout se passait comme je le souhaitais via de nombreux tracerts.
eidylon

1
Pareil, cette case était tout ce qui était nécessaire.
Luk

1
Précisez s'il vous plaît. Quel trafic est acheminé sur le VPN? S'agit-il simplement d'un trafic ciblé sur l'IP du serveur VPN? Par exemple, si la connexion VPN passe à "my.domain.com", cela signifie-t-il que tout le trafic du client vers "my.domain.com" passe par le VPN et que tout le reste passe par la passerelle par défaut?
Triynko

1
J'ai utilisé la commande "route print" et vérifié que les routes générées par Windows 7 étaient complètement fausses. Il n'envoyait pas le trafic adressé à l'adresse IP de mon VPN au VPN ... mais le transmettait plutôt à ma passerelle locale. Il y avait aussi quelques entrées circulaires dans la table. J'ai supprimé la route créée par Windows, puis ajouté manuellement la route correcte pour que l'entrée de l'adresse IP de mon serveur VPN utilise la passerelle du VPN et l'adresse IP locale du client pour l'interface. Le trafic vers mon serveur VPN a ensuite été acheminé avec succès via le tunnel VPN, et tout le reste du trafic n'a pas été affecté comme prévu. Fonctionne bien.
Triynko

20

J'ai utilisé avec succès la technique de @ TRS-80 pour y parvenir.

Je travaille de chez moi et je dois utiliser un VPN sur le réseau de l'entreprise pour mon courrier électronique (je déteste les courriers électroniques !!).

En même temps, je dois constamment surfer sur Internet et sur youtube pour ma musique de fond ... Maintenant, vous ne voulez certainement pas diffuser YouTube sur un VPN, car cela ressemble à un Robot Singing !!! :)

Je n'ai fait que suivre @ TRS-80:

Propriétés du VPN, onglet Réseau, Propriétés "Protocole Internet (TCP / IP)", Options avancées, décochez "Utiliser la passerelle par défaut sur le réseau distant".

et ensuite mon propre:

sous l'onglet DNS, cochez "enregistrer les adresses de ces connexions dans le DNS"

Tout fonctionne parfaitement!


9

Cette réponse ne correspond pas à votre demande, mais j’utilise une machine virtuelle spécifiquement à cette fin. De cette manière, seul le réseau de la machine virtuelle est limité par les itinéraires.

Vous pouvez trouver de meilleures réponses d’autres personnes, mais au moins, cela peut vous donner quelque chose à considérer car il s’agit d’une solution simple après la création de la machine virtuelle.


C'est une bonne solution à condition que votre matériel puisse la gérer correctement.
Enigma

Utilisé cette solution pendant des années, jusqu'à trouver ce fil. :)
ov

7

J'ai trouvé qu'il fallait pointer directement l'interface dans la commande route. Sans cela, Windows utilisera l'interface de la carte réseau principale au lieu du VPN. Dans mon cas, ça ressemble à

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

notez le 'IF 26'.


Cela a fonctionné pour moi aussi. Pour savoir quelle interface il vous faut simplement exécuter la commande "route print" et consulter les premières lignes affichant la liste des interfaces disponibles (recherchez votre VPN et vérifiez son IF - ce sera dans la première colonne).
Funbit

Il y a un article brillant sur ce: lien . L'utilisation de 0.0.0.0 comme adresse IP de passerelle par défaut semble également fonctionner correctement. Il n'est donc pas nécessaire de l'ajuster en cas de modification. Il serait bon d’incorporer cette réponse, car c’est bien plus utile que la première.
lpd

5

Utilisez la cmdlet Add-VpnConnectionRoute dans Windows 8+.

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

Cela a parfaitement fonctionné pour moi sur Windows 10.
x-ray

4

Si vous avez à la fois IPV4 et IPV6, vous devez décocher la case "Utiliser la passerelle par défaut sur le réseau distant" aux deux endroits, même si vous utilisez uniquement IPV4.



2

Je veux ajouter ma solution au mélange. Il fonctionne sur un shell UNIX basé sur Cygwin sous Windows 7 ou version ultérieure, mais devrait également fonctionner avec MSYS2, Bash-on-Windows [WSL] après la génération 14986 ou Busybox pour Windows). Doit être exécuté avec les privilèges d'administrateur.

Il comporte certains paramètres et tente de détecter certaines choses que vous n'avez pas explicitement définies. Il définit également le numéro d'interface (IF) explicitement pour contrer certains problèmes que certains utilisateurs (comme moi) ont rencontrés avec les autres solutions présentées ici.

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

Il convient également de noter qu'il peut être nécessaire de définir manuellement une métrique basse ou sinon, la route par défaut correspondra avant le trafic destiné au VPN. Pour ce faire, allez dans le paramètre d'adaptateur où vous ouvrez l' élément de menu "… Propriétés" de l'adaptateur VPN → onglet "Réseau""Protocole Internet Version 4 (TCP / IP)" Propriétés → "Avancé" → et vous décochez la « automatique métrique » case à cocher (en plus de la « passerelle par défaut Utiliser ... » bien sûr) et définissez la valeur dans la « Interface métrique: » champ à une valeur inférieure à la route par défaut (voir la ROUTE.EXE -4 printsortie).


1

Un peu vieux mais j'ai trouvé un moyen de faire cela en utilisant une autre machine. J'ai un ordinateur portable sur lequel je configure la connexion VPN et sur celui-ci, FreeProxy est configuré avec Socks5.

Ensuite, j'ai configuré firefox sur ma machine cliente pour utiliser le serveur proxy de l'ordinateur portable. Le résultat est que si j'utilise FireFox ou tout ce qui est configuré pour utiliser ce proxy Socks5, il utilisera le VPN, sinon il utilise le routage standard ..


1

Vous pouvez utiliser quelque chose comme netcatcher - ajoutez simplement tous les itinéraires dont vous avez besoin et oubliez-les. Il ajoutera et supprimera automatiquement des itinéraires lorsque vous connectez ou déconnectez votre session VPN. Si votre adresse IP VPN est obtenue dynamiquement (DHCP), netcatcher le détectera et mettra à jour les itinéraires de manière appropriée.


2
si c'est quelque chose que vous avez écrit, vous devez divulguer cette anseko.com/about.html see faq
Jeff Atwood Le

1

depuis le forum russe: http://forum.ixbt.com/topic.cgi?id=14:43549

enregistrer en tant que fichier (ex: vpn_route.vbs) et après la commande d'exécution connectée au 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

Cela ne peut pas être fait sous Windows sans utiliser des programmes supplémentaires, des fichiers de commandes ou la ligne de commande. Une alternative consiste à obtenir une machine virtuelle (ou physique) sur laquelle vous pouvez exécuter le VPN.

Il semble étrange que quelque chose d'aussi facile à expliquer que cela soit si difficile à réaliser. Comment pourrait-il être difficile de simplement acheminer le trafic d'un programme à l'interface VPN et de tous les autres programmes à l'interface de carte réseau par défaut? Pourquoi aurions-nous besoin de mettre en place une machine virtuelle complète pour cela? Et avec Linux c'est possible mais sa solution n'est pas très élégante non plus.

C'est aussi très recherché: je suis tombé sur des dizaines de sujets sur le même sujet. J'espère donc que quelqu'un réalise la ridicule et fait quelque chose à ce sujet. (Sous Windows 8!)

Cette solution provient d'un fichier de commandes non attribué . Il a été légèrement adapté.

Instructions pour Windows 7

Le script se connectera à votre VPN et acheminera le trafic jusqu’à ce qu’il redémarre - vous pouvez le remplacer route addpar route -p addpour que la modification soit conservée, mais si vous n’avez pas d’adresse IP persistante avec votre VPN, elle finira par ne plus fonctionner lorsque votre IP VPN change.

  1. Ouvrez le centre de réseau et de partage
  2. Ouvrez les propriétés de votre connexion VPN
  3. Cliquez sur l' Networkingonglet
  4. Pour IPv4 et 6:
    1. Cliquez sur Properties
    2. Cliquez sur Advanced
    3. Décocher Use default gateway[...]
  5. Fermez tout ce qui a été ouvert depuis les étapes précédentes
  6. Editez et sauvegardez le script batch ci-dessous
  7. Exécutez-le en tant qu'administrateur

Vous devez remplacer les éléments suivants dans le script:

  • <VPN> avec le nom de la connexion VPN que vous avez créée
  • <USER> avec le nom d'utilisateur VPN
  • <PASS> avec le mot de passe VPN
  • <TARGET> avec l'adresse IP que vous voulez acheminer via le VPN (si vous souhaitez acheminer plus d'adresses, dupliquez simplement les trois lignes où la cible est utilisée)

Remarque: Si vous ne voulez pas enregistrer le mot de passe dans le fichier, remplacez <PASS>avec %password%et ajouter ce qui suit après la première ligne du script: set password= Input password:.

Scénario

@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

Un guide "court" pour les noobs comme moi, qui ne connaissent pas grand chose aux réseaux. Pas grand chose de nouveau ici, mais un résumé de toutes les bonnes options décrites dans les réponses précédentes et dans d’autres sujets connexes. Toute la procédure consiste en 3 étapes de base:

1) Rendre tout le trafic ne va pas via VPN. Pour cela, vous devez décocher la Use default gateway on remote networkcase à cocher dans les paramètres VPN. Assurez-vous de décocher cette case pour IPv4 et IPv6. D'habitude, je désactive simplement le protocole IPv6 complètement pour la connexion VPN.

(!) Il est (parfois) possible que décocher cette case soit suffisant pour un travail normal. D'après mon expérience, les itinéraires nécessaires (qui dirigeront le trafic nécessaire via VPN) peuvent être ajoutés automatiquement une fois la connexion VPN établie. Je ne sais pas exactement où et comment ces règles sont configurées, mais un tel scénario existe - il s'agit probablement d'une magie accomplie par les administrateurs de réseau VPN.

2) N'effectuez que le trafic nécessaire via VPN. Pour cela, vous devez définir des itinéraires. Ici vous avez 3 options:

2.1) Ajouter un itinéraire permanent via une passerelle VPN:

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

où 'passerelle VPN' = 'votre adresse IP sur le réseau VPN' = w.x.y.zet l'adresse / le réseau cible = a.b.c.d. Vous pouvez trouver w.x.y.zen exécutant ipconfiget en recherchant votre nom de connexion VPN ou, si vous utilisez PowerShell, vous pouvez obtenir une sortie compacte en l'exécutant ipconfig | grep -A5 PPP(ce qui produira 5 lignes après avoir trouvé chaque connexion PPP).

Inconvénients: vous devrez recréer des itinéraires si votre IP VPN change.

2.2) Ajouter un itinéraire permanent via l’interface réseau VPN:

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

a.b.c.dest l'adresse / le réseau cible et interface numberest l'identifiant de votre connexion VPN. Cet ID peut être trouvée en exécutant netstat -rn, ou, pour une sortie plus compacte, netstat -rn | grep -A10 'Interface List'.

Avantages: pas besoin de changer quoi que ce soit si votre adresse VPN ( w.x.y.z) va changer.

Inconvénients: nécessité de recréer des itinéraires avec un nouvel ID si vous supprimez votre connexion VPN.

2.3) Utiliser l'applet de commande PowerShell:

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

Avantages: les itinéraires nécessaires sont ajoutés chaque fois que la connexion VPN est établie et supprimés chaque fois qu'il est déconnecté.

Inconvénients: il n'y a pas d' Get-VpnConnectionRoutesapplet de commande, il peut donc être difficile de gérer ces règles.

3) Vérifiez et assurez-vous que le routage fonctionne comme prévu!

Si vous avez ajouté des itinéraires persistants, vous pouvez les vérifier en les exécutant netstat -rn | grep -A10 'Persistent Routes'.

Enfin, exécutez quelques tracertcommandes sur les deux adresses IP censées être accessibles via VPN et sur celles qui doivent fonctionner sans VPN.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.