¿Cómo puedo hacer que la ruta VPN de Windows seleccione el tráfico (por red de destino)?

139

Quiero usar una VPN de Windows, pero solo para una red en particular, para que no se haga cargo de toda mi conexión de red.

por ejemplo, en lugar de que la VPN se convierta en la ruta predeterminada, conviértala solo en la ruta 192.168.123.0/24

(Puedo ver que hay una solución para esto para Ubuntu en esta pregunta , pero a veces también tengo que hacer esto en Windows)

¿Se puede automatizar para que siempre que me conecte a la VPN lo haga?

Legooolas
fuente
¿Hay alguna pregunta relacionada para filtrar un montón de sitios a través de VPN? Parece que las respuestas aquí funcionarán solo para el caso en que haya un solo sitio detrás de VPN. Estoy en China y aproximadamente la mitad de los sitios que me gustaría usar están bloqueados, por lo que deberían pasar por VPN, pero otros sitios son más rápidos / más fluidos sin VPN.
hippietrail
Seguí adelante y pidieron una nueva pregunta: superuser.com/questions/925947
sendero hippie

Respuestas:

139

Puede desactivar la toma de toda su conexión yendo a las propiedades de la VPN, Networkingpestaña, Internet Protocol (TCP/IP)propiedades Advanced, desmarque Use default gateway on remote network. Esto puede o no dejar una ruta 192.168.123.0/24dependiendo de la configuración del servidor VPN. Si no es así, deberá agregar manualmente la ruta cada vez, aunque podría ponerla en un archivo por lotes.

Para agregar manualmente la ruta, ejecute (como administrador):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

Este ejemplo hará una ruta persistente (no es necesario ejecutar el comando después de un reinicio) a la IP a 192.168.0.12través de la puerta de enlace VPN 10.100.100.254.

Más información sobre esto en http://technet.microsoft.com/en-us/library/bb878117.aspx

TRS-80
fuente
1
"Tendrás que agregar manualmente la ruta" ... ¿cómo? ¿Cómo obliga alguien, digamos, "192.168.10.123" a pasar por la VPN, pero nada más?
Timothy Khouri
16
Personalmente, descubrí que apagar la casilla era suficiente. No tuve que agregar ninguna ruta. Verifiqué que todo está yendo donde lo esperaría a través de numerosas trazas.
eidylon
1
Igual, esta casilla de verificación era todo lo que se necesitaba.
Luk
1
Por favor aclarar ¿Qué tráfico se enruta a través de la VPN? ¿Es solo el tráfico dirigido a la IP del servidor VPN? Por ejemplo, si la conexión VPN va a "my.domain.com", ¿eso significa que todo el tráfico en el cliente a "my.domain.com" pasa por la VPN, y todo lo demás va a la puerta de enlace predeterminada?
Triynko
1
Utilicé el comando "route print" y verifiqué que las rutas que Windows 7 generó estaban equivocadas. No estaba enviando tráfico dirigido a la IP de mi VPN a la VPN ... sino que lo estaba enviando a mi puerta de enlace local. También había algunas entradas circulares en la tabla. Eliminé la ruta que creó Windows, luego agregué manualmente la ruta correcta para que la entrada de la dirección IP de mi servidor VPN utilizara la puerta de enlace de la VPN y la IP local del cliente para la interfaz. El tráfico a mi servidor VPN fue enrutado con éxito a través del túnel VPN, y el resto del tráfico no se vio afectado como se esperaba. Funciona bien.
Triynko
20

Utilicé con éxito la técnica de @ TRS-80 para lograr esto.

Trabajo desde casa y tengo que usar VPN en la red corporativa para recibir mi correo electrónico (¡odio el correo web!).

Al mismo tiempo, necesito estar constantemente navegando por información y también necesito youtube para mi música de fondo ... ¡Ahora definitivamente no quieres transmitir youtube desde una VPN ya que eso suena como un canto de robot! :)

Todo lo que hice fue seguir a @ TRS-80:

propiedades de la VPN, pestaña Redes, propiedades "Protocolo de Internet (TCP / IP)", Avanzado, desmarque "Usar puerta de enlace predeterminada en la red remota"

y luego hice el mío:

en la pestaña DNS, marque "registrar estas direcciones de conexiones en DNS"

Todo funciona a la perfección!

bPratik
fuente
9

De acuerdo, esta respuesta no refleja su solicitud, pero uso una máquina virtual específicamente para este propósito. De esa manera, solo la red dentro de la VM está restringida por las rutas.

Puede encontrar algunas respuestas mejores por parte de otras personas, pero al menos esto puede darle algo que considerar, ya que es una solución fácil después de que se haya creado la VM.

Wayne
fuente
Esta es una buena solución siempre que su hardware pueda manejarla bien.
Enigma
Usé esta solución durante años, hasta que encontré este hilo. :)
OV
7

Descubrí que necesitaba apuntar directamente a la interfaz en el comando de ruta. Sin él, Windows usará la interfaz de la tarjeta de red principal, en lugar de VPN. En mi caso, parece que

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

tenga en cuenta el 'SI 26'.

Dmitry Petrov
fuente
Esto funcionó para mí también. Para averiguar qué interfaz necesita, simplemente ejecute el comando "ruta de impresión" y verifique las primeras líneas que muestran la lista de interfaces disponibles (encuentre su VPN allí y verifique su IF, estará en la primera columna).
Funbit
Hay un artículo brillante sobre esto: enlace . El uso de 0.0.0.0 como la puerta de enlace predeterminada IP también parece funcionar bien, por lo que no es necesario ajustarlo al cambiar. Sería genial incorporarlo en esta respuesta, ya que es mucho más útil que el primero.
lpd
5

Use el cmdlet Add-VpnConnectionRoute en Windows 8+.

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
Der_Meister
fuente
Esto funcionó perfectamente para mí en Windows 10.
rayos X
4

si tiene IPV4 e IPV6, debe desmarcar la opción "Usar puerta de enlace predeterminada en la red remota" en ambos lugares, incluso si solo usa IPV4

Dave
fuente
2

Quiero agregar mi solución a la mezcla. Se ejecuta en un shell UNIX con tecnología Cygwin en Windows 7 o posterior, pero también debería funcionar con MSYS2, Bash-on-Windows [WSL] después de la compilación 14986 u Busybox para Windows). Debe ejecutarse con privilegios de administrador.

Tiene algunas configuraciones e intenta detectar algunas de las cosas que no configuró explícitamente. También establece el número de interfaz (IF) explícitamente para contrarrestar algunos problemas que algunos usuarios (como yo) tuvieron con las otras soluciones aquí.

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

También vale la pena señalar que podría ser necesario establecer manualmente una métrica baja o, de lo contrario, la ruta predeterminada coincidirá antes del tráfico destinado a la VPN. Para ello, vaya a la configuración del adaptador donde abre el elemento de menú "... Propiedades" para el adaptador VPN → pestaña "Redes"" Propiedades de la versión 4 del protocolo de Internet (TCP / IP)""Avanzado" → y allí desmarca la casilla de verificación "Métrica automática" (además de "Usar puerta de enlace predeterminada ...", por supuesto) y establezca el valor en el campo "Métrica de interfaz:" en un valor inferior a la ruta predeterminada (ver ROUTE.EXE -4 printsalida).

phk
fuente
1

Un poco viejo pero encontré una manera de hacerlo usando otra máquina. Tengo una computadora portátil donde configuré la conexión VPN y allí configuré FreeProxy con Socks5 ..

Luego configuré firefox en mi máquina cliente para usar el servidor proxy de la computadora portátil ... el resultado es que si uso FireFox o cualquier cosa que esté configurada para usar ese proxy Socks5, usará la VPN, de lo contrario usará el enrutamiento estándar ...

Lonnie
fuente
1

Puedes usar algo como netcatcher : solo agrega todas las rutas que necesites una vez y olvídalo. Agregará y eliminará rutas automáticamente cuando conecte o desconecte su sesión VPN. Si su dirección IP de VPN se obtiene dinámicamente (DHCP), netcatcher la capturará y actualizará las rutas de la manera correcta.

Andy
fuente
2
si esto es algo que usted escribió que necesita para revelar que anseko.com/about.html ver FAQ
Jeff Atwood
1

del foro ruso: http://forum.ixbt.com/topic.cgi?id=14:43549

guardar como archivo (ej: vpn_route.vbs) y después de que vpn conectado ejecute el 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
shibormot
fuente
1

Esto no se puede hacer en Windows sin usar programas adicionales, archivos por lotes o la línea de comandos. Una alternativa es obtener una máquina virtual (o física) en la que pueda ejecutar la VPN.

Parece extraño que algo tan fácil de explicar como esto sea tan difícil de lograr. ¿Qué tan difícil podría ser simplemente enrutar el tráfico de un programa a la interfaz VPN y todos los demás programas a la interfaz NIC predeterminada? ¿Por qué necesitaríamos configurar una máquina virtual completa para eso? Y con Linux es posible, pero su solución tampoco es muy elegante.

También es muy buscado: me encontré con docenas de hilos sobre el mismo tema. Así que solo espero que alguien se dé cuenta de lo ridículo de esto y haga algo al respecto. (¡En Windows 8!)

Esta solución es de un archivo por lotes no atribuido . Ha sido ligeramente adaptado.

Instrucciones para Windows 7

La secuencia de comandos conectar y enrutar el tráfico a través de la VPN hasta un reinicio - se puede reemplazar route addcon route -p addel cambio de persistir, pero si usted no tiene una dirección IP persistente con su VPN, con el tiempo dejan de funcionar cuando cambia su IP VPN.

  1. Abra el Centro de redes y recursos compartidos
  2. Abra las propiedades para su conexión VPN
  3. Haz clic en la Networkingpestaña
  4. Para IPv4 y 6:
    1. Hacer clic Properties
    2. Hacer clic Advanced
    3. Desmarcar Use default gateway[...]
  5. Cierra todo lo abierto de los pasos anteriores
  6. Edite y guarde el script por lotes que se encuentra a continuación
  7. Ejecútelo como administrador

Debe reemplazar lo siguiente en el script:

  • <VPN> con el nombre de la conexión VPN que creaste
  • <USER> con el nombre de usuario VPN
  • <PASS> con la contraseña VPN
  • <TARGET> con la dirección IP que desea enrutar a través de la VPN (si desea enrutar más direcciones, simplemente duplique las tres líneas donde se usa el objetivo)

Nota: Si no desea guardar la contraseña en el archivo, reemplace <PASS>con %password%y añade lo siguiente tras la primera línea del script: set password= Input password:.

Guión

@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
fuente
0

Una guía 'corta' para novatos como yo, que no saben mucho sobre redes. No hay muchas novedades aquí, pero un resumen de todas las buenas opciones descritas en respuestas anteriores y en otros hilos relacionados. Todo el procedimiento consta de 3 pasos básicos:

1) Hacer que todo el tráfico NO pase por VPN. Para esto, debe desmarcar la Use default gateway on remote networkcasilla de verificación en la configuración de VPN. Asegúrese de desmarcar esta casilla de verificación para IPv4 e IPv6. Por lo general, simplemente deshabilito el protocolo IPv6 por completo para la conexión VPN.

(!) Es (a veces) posible que desmarcar esa casilla de verificación sea suficiente para el trabajo normal; en mi experiencia, las rutas necesarias (que dirigirán el tráfico necesario a través de VPN) se pueden agregar automáticamente después de establecer la conexión VPN. No sé exactamente dónde y cómo se configuran estas reglas, pero existe tal escenario, probablemente es algo mágico hecho por los administradores de redes VPN.

2) Realice solo el tráfico necesario a través de VPN. Para esto necesitas definir rutas. Aquí tienes 3 opciones:

2.1) Agregar ruta permanente a través de la puerta de enlace 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

where 'VPN gateway' = 'su IP en la red VPN' = w.x.y.zy dirección / red de destino = a.b.c.d. Puede encontrar w.x.y.zejecutando ipconfigy buscando su nombre de conexión VPN o, si usa PowerShell, puede obtener una salida compacta ejecutando ipconfig | grep -A5 PPP(que generará 5 líneas después de encontrar cada conexión PPP).

Contras: tendrá que volver a crear rutas si su IP VPN cambiará.

2.2) Agregar ruta permanente a través de la interfaz de red VPN:

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

donde a.b.c.destá la dirección / red objetivo y interface numberes el identificador de su conexión VPN. Este ID se puede encontrar mediante la ejecución de netstat -rn, o, para la salida más compacto, netstat -rn | grep -A10 'Interface List'.

Pros: no es necesario cambiar nada si su dirección VPN ( w.x.y.z) cambiará.

Contras: necesita volver a crear rutas con una nueva ID si elimina su conexión VPN.

2.3) Usar el cmdlet de PowerShell:

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

Pros: las rutas necesarias se agregan cada vez que se establece una conexión VPN y se eliminan cada vez que se desconecta.

Contras: no hay Get-VpnConnectionRoutescmdlet, por lo que puede ser difícil administrar estas reglas.

3) ¡Verifique y asegúrese de que el enrutamiento funcione como se espera!

Si agregó rutas persistentes, puede verificarlas ejecutando netstat -rn | grep -A10 'Persistent Routes'.

Y, finalmente, ejecute algunos tracertcomandos contra ambas direcciones IP a las que se debe acceder a través de VPN y contra aquellas que deberían funcionar sin VPN.

ov
fuente