Archive for May 17th, 2004

… no sé distinguir lo complicado de lo simple…

Monday, May 17th, 2004

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 :-) , 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!

… Así en esta banda decimos adiós

Monday, May 17th, 2004

Cinco meses esperando el día 17 de Mayo y ya es!!. Sí, la razón por la que me da tanto gusto es que he terminado el semestre, fue el semestre en el que metí las materias que no me gustan nada y ya he terminado… por fin descanso :-)

Bueno.. eso de descanso no es del todo cierto, ya que tengo muchas cosas que hacer en vacacioens, proyectitos que tengo a medias y otros que quiero empezar, aparte de.. pues hacer algo ’social’ con mi vida :-) .

¿Qué proyectos?

Pues sí, se que a muchos les viene valiendo lo mismo que a mi me vale si el peje dice hoy una babosada del gobierno federal.

Entre las cosas que quiero terminar y tengo pendientes se encuentran:

  • Jaws: Los paquetes de Debian (como les he ido prometiendo desde hace mucho tiempo, los paquetes de jaws, jaws-common, webservices, utils, etc), más soporte para mi sección (plugins), utilidades para jaws (como systema de backup en el cron), un RSS Reader, entre otros.
  • mBloggy: mi pequeño hijo que ya muchos han de conocer, un pequeño cliente que se comunica por SOAP con distintos Blogs
  • Jaws Client App: Es el mismo de mantener blogs por un cliente (en C#) que administra un blog por medio de SOAP, pero me he dado cuenta que los otros CMS ni me interesan, asi va a ser dedicado a Jaws :-)
  • Demonio de Correo: pues del trabajo, seguir desarrollando el famoso demonio para mandar mails.
  • Configurador de lineas: pues un proyecto que voy a hacer para el Tec, me lo ha encargado Jerónimo (Coordinador de Redes), proyecto MUY interesante.
  • Debian Mono: pues seguir cuidando a mis otros dos crios: mono-xsp y mono-server, así como mis nietos (aplicaciones en asp.net para Debian).

…son los principales.. creo

Y pues bueno, no todo el tiempo voy a estar conectado tirando código como animal, sino que voy a seguir con mis actividades diarias (entrenar) y tres libros que tengo pendientes, así como el de Big Fish que [friend]j0rd1[/friend] me regaló en mi cumpleaños :-) , aparte quiero aprender un idioma, ando entre: italiano, francés y portugués.

Pero bueno.. ya iremos viendo ;D.

saludos a todos!!!