... no sé distinguir lo complicado de lo simple...

Pues desde ayer me di a la tarea de volver a meter VPN's en mi casa. Los que las hayan hecho, saben bien que es un verdadero relajo hecharlas a andar, aparte que hay que parchar el kernel y circo, maroma y teatro.. pero me surgió la duda, ¿se podrá crear una VPN sobre una conexión SSH?, fácil, apunté mi Firefox a google y busqué vpn+ssh, el resultado fue exitoso!.

Una vez con toda la información necesaria me di cuenta de lo sencillo que era hacerlo con una ssh, ya que simplemente se crea un tunel con una conexión ssh entre dos máquinas (bueno, luego se pueden ir enlazando), total, en menos de tres horas ya tenía mi conexión VPN con dos servidores que frecuento mucho. Hoy he creado una nueva conexión VPN entre mi casa y el servidor de la escuela, lo fantastico es que a cada conexión le voy dando permisos con iptables.

Pero bueno, no solamente estoy escribiendo para 'alardear' de lo chingón que soy (mi ego, por Dios!!!), no!, he creado un pequeño script para establecer la conexión, hay muchos en google, pero todos suponen MUCHAS cosas y que MUCHAS veces no funcionan, el script lo van a poder encontrar aquí: vpnoverssh.

Bueno, antes quiero aclarar unos puntos del archivo y una breve explicación de lo que hace.

SSH_HOSTNAME=pablo.com.mx SSH_USER=vpn SSH_OPTS="-P"

En el archivo hay que escribir el hostname al que vamos a hacer la conexión ssh, en mi caso (bueno en el ejemplo y en el archivo) es pablo.com.mx, esta maquina.. va a ser el SERVIDOR.

Con respecto al usuario, es algo importante, tenemos que crear un usuario en el servidor, al cual le vamos a llamar: vpn, este usuario debe tener acceso SSH, y tenemos que instalar el paquete sudo para editar luego con visudo y darle permisos al usuario de ejecutar iptables, route, pppd, ps, killall, un ejemplo a escribir en visudo:

Cmnd_Alias VPN=/usr/sbin/pppd Cmnd_Alias IFCONFIG=/sbin/ifconfig Cmnd_Alias IPTABLES=/sbin/iptables Cmnd_Alias PS=/bin/ps Cmnd_Alias KILLALL=/usr/bin/killall vpn ALL=NOPASSWD: VPN vpn ALL=NOPASSWD: IFCONFIG vpn ALL=NOPASSWD: IPTABLES vpn ALL=NOPASSWD: PS vpn ALL=NOPASSWD: KILLALL

Bueno, ya que tenemos al usuario, tenemos que crear una llave ssh SIN password, ya sea como usuario normal en el cliente (pero dandole permisos de ejecutar los MISMOS comandos) o bien como root, ya saben como crear una llave:

# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: .....

Si queremos, le podemos dar una shell falsa al usuario vpn que corre en el servidor.

Con esto vamos a tener un archivo /root/.ssh/id_rsa.pub, el contenido de este lo debemos tener en el servidor en la cuenta del usuario vpn, en el archivo: /home/vpn/.ssh/authorized_keys. Si no tenemos el directorio .ssh, lo creamos al igual que el archivo y le damos permisos de root.vpn a /home/vpn/.ssh.

Ahora, para establecer una conexión VPN necesitamos DOS ip's, de preferencia en otra subred, diferente a la del cliente que a la del servidor, entonces, supongamos que a la red de VPN le vamos a asignar las ip's de 192.168.3.x, así que:

VPN_SERVERIP=192.168.3.1 VPN_CLIENTIP=192.168.3.2

De tal manera que el servidor VPN va a tener la ip 192.168.3.1 y mi cliente (la máquina en la que voy a ejecutar el script) la 192.168.3.2.

Ahora, simplemente hay que declrar los valores de cada red (muchos manuales no dicen que hay que hacerlo, pero luego se complica, así que e smejor definir las rutas correctas).

NETWORK_SERVERNET=192.168.1.0 NETWORK_SERVERNETIP=192.169.1.1 NETWORK_SERVERNETMASK=255.255.255.0

¿Qué quiero decir con esto?, que el servidor tiene la ip local (la red, la de eth_loqeusea, que nos interesa usar en la VPN), tiene 192.168.1.1, de tal forma que NET va a ser 192.168.1.0 y el NETMASK 255.255.255.0, vamos bien?, esto lo podemos sacar del archivo /etc/network/interfaces de cada máquina, respectivamente, o bien con ipcalc.

NETWORK_CLIENTNET=192.168.0.0 NETWORK_CLIENTNETIP=192.168.0.77 NETWORK_CLIENTNETMASK=255.255.255.0

Lo anterior, es parecido al SERVER, simplemente que ahora es el cliente, es decir, DONDE ESTAMOS ejecutando el script.

Tanto del lado del servidor como en el cliente necesitamos: pppd, ssh, sudo (en server es OBLIGATORIO), route e ifconfig.

Ahora, lo primero que hace el script es hacer una conexión por medio de un tunel ssh (en el man de pppd viene como hacer esto). Lo siguiente es conectamos por SSH al servidor y mandarle un comando, el cual es agregar la ruta, que sería:

# route add -net 192.168.1.0 gw 192.168.3.2 netmask 255.255.255.0

Que quiere decir que TODO lo vaya para el segmento de 192.168.1.0 va a tener que ser 'entubado' a la ip 192.168.3.2 (la VPN del cliente, recordemos que una VPN es por lo general una conexión punto a punto, asíq ue la 192.168.3.2 es el 'otro' punto) y le agregamos el netmask.

Luego, pues agregamos al ruta ene l cliente, que sería similar, con la diferencia que todos los paquetes que vayan a 192.168.0.0, sean entubados a la 192.168.3.1 (la conexión del otro punto).

Y Listo!!!

Para matarla es sencillo, con stop, lo que hace es conectarse al servidor, busca que pppX hay que dar de baja y la da de baja, en nuestro caso, pues mata la conexión ssh que se tiene con ese servidor.

Bueno, pues ha sido un placer face-smile.png , sé a lo que me abstengo, que en los próximos meses 'aparezcan' repentinamente muchos 'gurus' que subitamente saben montar una VPN (tal como paso con mi artículo de montar un servidor .COM) y vayan a empresas o amigos a presumir (que estúpidos, pero en fin)... Mi granito de arena

Hasta Luego!