Split Tunneling a nuestro gusto (o como manipular la tabla de ruteo en una conexión VPN automáticamente) II (Windows)

Esta vez vamos a ver como conectarnos por VPN y manejar nosotros el tráfico que queremos tunelizar y el que no, en una conexión realizada con el cliente de VPN de Windows.

Por default, la conexión que configuramos con el asistente de Windows, setea que todo el tráfico sea enviado por el túnel, lo que vamos a hacer es eliminar esta configuración y cargar nosotros las rutas en la tabla de ruteo.

Para eliminar la configuración por defecto, se debe ir a las propiedades de la conexión VPN y luego en la solapa Networking, a la opción properties de TCP/IPv4:

Luego, se debe ir a la opción advanced:

En la solapa advanced, es donde está la opción que ya viene tildada por defecto ("Use default gateway on remote network"), y que indica que se utilice como default gateway la interface que levanta el tunel, o sea, que envíe todo el tráfico por el túnel. Si dejamos tildada esa opción, no podremos decidir que tráfico queremos tunelizar, y que tráfico no.

Además también podemos decidir si agregar o no, la red en la que se conecta la placa del tunel, que vendría ser la directamente conectada a la misma. La opción es "Disable class based route addition", o sea, deshabilitar el agregado de red basado en la clase: si a la interface VPN recibe la numeración 172.16.0.11 con máscara 255.255.0.0 (/16), se agregará una ruta a toda la red 172.16.0.0/16 vía esa interface.

Para tener absoluto control de la conexión, vamos a deshabilitar la primera opción y habilitar la segunda, así:

Ahora nos queda agregar las rutas a los hosts que queramos acceder:

En windows para agregar una ruta, se debe ejecutar el siguiente comando:

	route add <red|host> mask <máscara> <gateway>

Si bien el comando permite especificar también métrica e interface, con los datos anteriores, es suficiente, los otros datos los setea automáticamente.

El gateway será la IP que se asignó a la interface que creó la VPN, para verla se puede utilizar el siguiente comando, reemplazando "VPN" por el nombre la conexión VPN.

	netsh interface ip show addresses "VPN"

	Configuration for interface "VPN"
	    DHCP enabled:                         No
	    IP Address:                           172.16.14.105
	    Subnet Prefix:                        172.16.14.105/32 (mask 255.255.255.255)
	    InterfaceMetric:                      20

O también se puede hacer un ipconfig, y buscar el "PPP adapter VPN"

	PPP adapter VPN:

	   Connection-specific DNS Suffix  . :
	   IPv4 Address. . . . . . . . . . . : 172.16.14.105
	   Subnet Mask . . . . . . . . . . . : 255.255.255.255
	   Default Gateway . . . . . . . . . :

Por ejemplo, para agregar el host 172.16.1.10 y la red 10.0.0.0/16 utilizaremos las siguientes dos líneas:

	route add 172.16.1.10 mask 255.255.255.255 172.16.14.105
	route add 10.0.0.0 mask 255.255.0.0 172.16.14.105

Esto lo podemos hacer manualmente, las veces que necesitemos y con el comando route delete, podemos eliminar rutas.

Para manejar ruteo en Windows, es necesario ejecutar como administrador.

Ahora, como hacemos para realizar la conexión a la VPN y luego cargar las rutas que definamos de manera automática ?

La primera complicación que puede surgir, es que la ip que se asigna es dinámica, por lo tanto, en el comando de route add, no tendremos el dato del gateway. Lo que vamos a realizar entonces es decirle a Windows que la agregué y que la rutee por una interface especifica (a traves de su número de interface), que en este caso será la que se levanta al iniciar la VPN. Para saber su número, deberemos conectarnos una vez y luego de conectados ejecutar el comando:

	netsh int ipv4 show interfaces

Para obtener la lista de interfaces, donde deberemos buscar la que tiene el nombre de la conexión VPN y anotar el número que figura en la primer columna, en nuestro caso "30" (este número no va a cambiar con las sucesivas conexiones y desconexiones, a menos que se agregue o quite alguna interface de red del sistema operativo, por lo tanto, nos permitirá la generación de un script automático).

Y el comando para agregar rutas, entonces lo vamos a construir así:

	route add <red|host> mask <máscara> <red del gateway> IF <Número de Interface>

En nuestro caso:

	route add 172.16.1.10 mask 255.255.255.255 172.16.14.0 IF 30
	route add 10.0.0.0 mask 255.255.0.0 172.16.14.0 IF 30

Ahora que podemos construir los comandos de ruteo sin depender de la IP que asigne la VPN, la forma más sencilla que encontré para automatizar todo es realizar un script en batch, con el comando para iniciar la conexión y luego los comandos para agregar las rutas, quedaría así, y basta guardarlo con extensión .bat para poder ejecutarlo automáticamente al hacer click (el "*" se puede reemplazar por la contraseña si no se quere que se pida la misma cada vez que se inicia la conexión, y "VPN" es el nombre de la conexión):

	rasdial "VPN" usuario *
	route add 172.16.1.10 mask 255.255.255.255 172.16.14.0 IF 30
	route add 10.0.0.0 mask 255.255.0.0 172.16.14.0 IF 30

(recuerden ejecutar como administrador).

Edit - 29/08/2016

Script completo para conectarse a la VPN, y agregar los ruteos automáticamente:

@echo off
rem DATOS DE CONEXION VPN (el nombre debe ser el nombre con el que se creó en: Control Panel\Network and Internet\Network Connections):
set VPN=empresa
set USER=user1
set PASSWORD=P@ssword

rem CONECTARSE A LA VPN
rasdial %VPN% %USER% %PASSWORD%

rem OBTENER IP
netsh interface ip show addresses %VPN% | find "IP Address" > %temp%\TEMPIP.txt
FOR /F "tokens=2 delims=:" %%a in (%temp%\TEMPIP.txt) do set IP=%%a
del %temp%\TEMPIP.txt
set IP=%IP:~1%
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%a in ("%IP%") do set IP=%%a
for /l %%a in (1,1,100) do if "!IP:~-1!"==" " set IP=!IP:~0,-1!

rem OBTENER IF
netsh int ipv4 show interfaces %VPN% | find "IfIndex" > %temp%\TEMPIF.txt
FOR /F "tokens=2 delims=:" %%a in (%temp%\TEMPIF.txt) do set IF=%%a
del %temp%\TEMPIF.txt
set IF=%IF:~1%
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%a in ("%IF%") do set IF=%%a
for /l %%a in (1,1,100) do if "!IF:~-1!"==" " set IF=!IF:~0,-1!

echo IP: %IP%
echo IF: %IF%

rem AGREGAR LOS RUTEOS:
route add 192.168.0.0 mask 255.255.255.0 %IP% if %IF%
route add 172.16.1.0 mask 255.255.255.0 %IP% if %IF%

Saludos,

Gabriel Soltz

Read more