Creando Redes VPN utilizando SSH

Con OpenSSH es posible establecer redes virtuales privadas de una forma fácil y segura, una característica que pocas veces se menciona, pero sin embargo es bastante útil en un escenario típico de entornos con firewalls restrictivos. El concepto de red VPN indica que cuando se establece una red privada, el sistema operativo monta una interfaz de red “virtual” que se encuentra completamente abstraída de la(s) interface(s) de red que existan en la maquina, no obstante cuenta con una dirección IP valida que puede efectuar una conexión con una maquina remota.

Para conseguir esto con OpenSSH frecuentemente se siguen los siguientes pasos:

1. Se parte del supuesto que existen dos maquinas que no se encuentran en el mismo segmento de red, sin embargo cuentan con salida a internet o acceso a otros segmentos de red por medio de una dirección “ruteable” como un gateway NAT. Con esto en mente es posible establecer una conexión virtual entre una de las maquinas de un segmento de red con el gateway NAT del otro segmento de red (por ejemplo, el primer segmento de red puede ser una red casera y el otro segmento de red puede ser la red corporativa de una empresa) . Dado este escenario, se asume lo siguiente:

NOTA: Antes de comenzar, es necesario comprender que el gateway (192.168.1.33) debe permitir el FORWARD de los paquetes que pasan por él y que tienen diferente destino, para esto es necesario establecer el valor de “1” al fichero /proc/sys/net/ipv4/ip_forward

Para crear una VPN con SSH se utiliza la opción “-w” del comando “ssh” desde el cliente así:

>ssh -NTCf -w 2:2 192.168.1.33

Las opciones indican que:

-N: no ejecutar ningún tipo de comando remoto.

-T: Desactiva la localización de una TTY

-C: Compresión de los datos en el canal de comunicación

-f: Ejecutar como un proceso de background (demonio)

La maquina desde donde se invoca la conexión es la “192.168.2.3” y pertenece a un segmento de red distinto, sin embargo la maquina “192.168.1.33” actúa como un gateway NAT para el segmento de red interna 172.22.1.0/24, en este orden de ideas cuando se establece una conexión VPN sobre el gateway NAT es posible acceder a las maquinas del segmento de red interna por medio de dicha conexión y gateway (por supuesto es necesario que el gateway lo permita).

Después de la ejecución del comando anterior, en ambas maquinas se ha creado una interfaz “tun2” que aunque se encuentra correctamente creada aun no se encuentra configurada como se puede ver en cada una de las maquinas:

192.168.1.33

>ip addr show tun2

9: tun2: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 500

link/none

192.168.2.3

>ip addr show tun2

8: tun2: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 500

link/none

Cada una de las maquinas tiene su interfaz establecida, ahora es necesario realizar la configuración correspondiente para establecer una comunicación completa.

NOTA: El comando SSH anterior requiere permisos de root en el servidor para que pueda llevarse a cabo, además es necesario que en el fichero de configuración sshd_config del servidor se encuentre activada la opción PermitTunnel: PermitTunnel yes

Si las condiciones anteriores no se cumplen o si la interfaz tunX (donde X es el numero que se indica en la opción “-w”) ya se encuentra asignada, el mensaje de error que se producirá será el siguiente:

>ssh -NTCf -w 1:1 192.168.1.33

Tunnel device open failed.

Could not request tunnel forwarding.

2. Ahora se procede a configurar las interfaces virtuales, para ello es necesario ejecutar los siguientes comandos en cada una de las maquinas:

192.168.2.3 (Cliente, Maquina X)

>ifconfig tun2 172.22.1.50 pointopoint 172.22.1.40

>ifconfig tun2

tun2 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:172.22.1.50 P-t-P:172.22.1.40 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:15 errors:0 dropped:0 overruns:0 frame:0

TX packets:26 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:500

RX bytes:1260 (1.2 KiB) TX bytes:2184 (2.1 KiB)

192.168.1.33 (Servidor Gateway)

>ifconfig tun2 172.22.1.40 pointopoint 172.22.1.50

>ifconfig tun2

tun2 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:172.22.1.40 P-t-P:172.22.1.50 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:26 errors:0 dropped:0 overruns:0 frame:0

TX packets:15 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:500

RX bytes:2184 (2.1 KiB) TX bytes:1260 (1.2 KiB)

Para verificar que los comandos anteriores han tenido el efecto esperado, se verifica si son visibles estas maquinas entre ellas:

192.168.2.3 (Cliente, Maquina X)

>ping 172.22.1.40

PING 172.22.1.40 (172.22.1.40) 56(84) bytes of data.

64 bytes from 172.22.1.40: icmp_req=1 ttl=64 time=2.47 ms

64 bytes from 172.22.1.40: icmp_req=2 ttl=64 time=2.89 ms

^C

— 172.22.1.40 ping statistics —

2 packets transmitted, 2 received, 0% packet loss, time 1003ms

rtt min/avg/max/mdev = 2.479/2.688/2.897/0.209 ms

192.168.1.33 (Servidor, Maquina GateWay)

>ping 172.22.1.50

PING 172.22.1.50 (172.22.1.50) 56(84) bytes of data.

64 bytes from 172.22.1.50: icmp_req=1 ttl=64 time=2.13 ms

64 bytes from 172.22.1.50: icmp_req=2 ttl=64 time=2.65 ms

64 bytes from 172.22.1.50: icmp_req=3 ttl=64 time=2.64 ms

^C

— 172.22.1.50 ping statistics —

3 packets transmitted, 3 received, 0% packet loss, time 2003ms

rtt min/avg/max/mdev = 2.135/2.476/2.651/0.241 ms

Una vez que ambas maquinas tienen conexión, es necesario definir las opciones de ruta “routing” principalmente para que los paquetes que viajen desde la maquina cliente (Maquina Y) puedan ser enviados a cualquier maquina del segmento de red A

Desde la maquina del cliente (Maquina X)

>ip route add 172.22.1.0/24 via 172.22.1.40

De esta forma los paquetes desde la maquina del cliente pueden ser enviados a cualquier maquina o dispositivo que se encuentre conectado al segmento de red A pasando en primer lugar por el gateway (como se ha indicado anteriormente es necesario que dicha maquina tenga habilitado el forwarding de paquetes).