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).
Existe una errata aqui :
>ip route add 172.22.1.0/24 via 172.22.1.40
Deberia ser :
>ip route add 192.168.2.0/24 via 172.22.1.40
¿No?
Me gustaMe gusta
Desde la Maquina X (donde el segmento de red es 192.168.2.0/24) el comando correcto es el que se ha indicado, es decir:
MAQUINA X 192.168.2.3:
ip route add 172.22.1.0/24 via 172.22.1.40
Luego, desde la Maquina Y (donde el segmento de red es 172.22.1.0/24) el comando que mencionas es correcto,
sin embargo, la intención era solamente establecer la comunicación desde una maquina en el segmento de red B (192.168.2.0/24)
hacia el segmento de red A (172.22.1.0/24).
En el sentido inverso el comando que pones en tu comentario tambien es valido,
con lo cual no se trata de una errata y tu aporte es también correcto desde la perspectiva de la maquina 172.22.1.40
Con la imagen que he incluido en el post he intentado que sea más facil de comprender, sin embargo si algo no te queda claro, puedes preguntar e intentaré contestar a tus preguntas.
Recibe un cordial saludo.
Me gustaMe gusta