Introducción
Una Red Privada Virtual (VPN por sus siglas en inglés) sirve para crear una conexión encriptada entre 2 o más puntos a través de Internet. Un caso de uso típico puede ser permitir al acceso a servicios de una intranet de forma segura desde Internet. Otro caso típico de uso es interconectar redes locales de 2 ó más sucrusales a través de Internet. En este artículo haremos la primera opción y en un futuro cercano publicaré cómo interconectar 2 redes.
Existen varias implementaciones de VPN y en el mundo de software libre una de las más populares es OpenVPN. Una de sus grandes ventajas, es que se pueden tener clientes en distintos sistemas operativos com GNU/Linux, Windows, Mac y seguro que en todas las versiones BSD.
Instalación
OpenVPN viene por defecto en la mayoría de las distribuciones GNU/Linux. En mi caso suelo utilizar Debian o Ubuntu. La instalación la hice con aptitude:
aptitude install openvpn
En distros basadas en RPM la instalación se la hace con yum:
yum install openvpn
Listo , así de fácil y de sencillo.
Crear los certificados digitales
OpenVPN autentica sus clientes a través de llaves públicas y privadas. De esta manera cada cliente tiene su llave privada y debe enviar su llave pública al servidor. Estas llaves son creadas con un certificado conocido como «Certificado de Autoridad«. De esta forma cuando el servidor recibe una llave pública este revisa si esta firmado con el certificado de autoridad. Sino esta no aceptará la conexión.
La forma más fácil de crear estos certificados es utilizando la utilidad easy-rsa que viene en el paquete de OpenVPN. En el caso de debian esta aplicación se encuentra en: /usr/share/doc/openvpn/examples/easy-rsa/2.0/ easy-rsa. Otras distribuciones tendrán una ruta similar.
Copiamos la aplicación a una ruta más fácil de recordar. Personalmente opté por un subdirectorio dentro de /etc/openvpn. Para tener las cosas ordenadas:
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa
Ahora ingresamos al directorio para crear las claves:
cd /etc/openvpn/easy-rsa/
Dentro de esta carpeta tenemos un archivo que almacena algunas variables importantes. Recomiendo revisar este archivo y de ser el caso modificar algunas variables.
vim vars
En mi caso personalice la siguiente parte para que cuando cree los certificados los valores por defecto tengan que ver con mi realidad:
export KEY_COUNTRY="EC"
export KEY_PROVINCE="Pichicha"
export KEY_CITY="Cayambe"
export KEY_ORG="Mi empresa"
export KEY_EMAIL="yo@midominio.com"
Guardamos y cerramos el archivo. Si no queremos no modificamos el archivo, es algo netamente opcional.
Cargamos las variables de este archivo al shell que estamos utilizando:
. vars
Borramos las claves previamete creados en caso de existir. Hacer esto solo si es la primera vez que vamos a crear los certificados y las claves.
./clean-all
Creamos el certificado de autoridad:
./build-ca
Si modificaron las variables, se darán cuenta que ahora las estaremos utilizando.
Certificado y clave privada para el servidor
/build-key-server servidor
Esto generara los archivos servidor.crt y servidor.key. donde el archivo .key es la llave privada y .crt es la pública.
Generamos los parámetros Diffie Helman
Generamos las claves de los clientes.
./build-key cliente1
./build-key cliente2
./build-key cliente3
De manera similar al servidor se crearán las claves *.key y *.crt que serán las claves privadas y públicas respectivamente. Las 2 claves las deberemos copiar al cliente.
Listo, hemos creado todos los certificados necesarios y estamos listos para configurar los clientes y el servidor. Es importante sacar un respaldo del directorio /etc/openvpn/easy-rsa ya que ahí están todas las claves, incluido el certificado de autoridad que nos permitirá crear nuevas claves a futuro.
Resumen de las claves y certificados creados:
Archivo | Utilizado en | Descripción | Secreto |
---|---|---|---|
ca.ca | Servidor y todos los clientes | Certificado de Autoridad | no |
ca.crt | Máquina donde se crean los certificados | Llave del certificado CA principal | sí |
dh{n}.pem | Servidor | Parámetros Diffie Hellman | no |
servidor.crt | Servidor | Certificado del servidor | no |
servidor.key | Servidor | Llave privada del certificado del servidor | sí |
clienteX.crt | Solo en el cliente X | Certificado del Cliente X | no |
clienteX.key | Solo en el cliente X | Llave privado del certificado del cliente X | no |
Nota: en clienteX, X quiere decir el número del cliente. En este ejemplo estamos trabajamos con 3 clientes para la VPN pr lo que deberíámos tener 3 pares de claves .crt y .key.
Configurar el Servidor
Copiamos los archivos que corresponden al servidor en una carpeta dentro del mismo. En mi caso copie la configuración en /etc/openvpn/claves. Si generamos las claves en una máquina que no es el servidor debemos usar scp u otra aplicación para subirlas a nuestro servidor.
Copiamos un archivo de ejemplo de configuración del servidor y la adaptamos a nuestras necesidades.
cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gunzip server.conf.gz
vim server.conf
Dentro del archivo modificamos algunas variables para que funcione. Aquí expico algunas:
Protocolo a utilizar:
# TCP or UDP server?
proto udp
Vamos a configurar la vpn utilizando el protocolo UDP ya que esto nos dará un mejor rendimiento. No tiene sentido trabajar en TCP ya que dentro de nuestra vpn se correra el protocolo IP donde de ser necesario se volver a utilizar el protocolo TCP y no tiene sentido utilizar 2 veces este protocolo. En otras palabras, utilizar TCP solo cuando no lo puedan hacer con UDP.
Definimos las rutas a los certifiados. Recordar que en este ejemplo estamos utilizando /etc/openvpn/claves
ca claves/ca.crt
cert claves/servidor.crt
key claves/servidor.key
dh dh1024.pem
Por último, en el mismo archivo, decimos a que redes queremos que los clientes vpn puedan acceder.
push "route 192.168.45.0 255.255.255.0"
Listo podremos iniciar el servidor:
/etc/init.d/openvpn start
En caso de necesitar corregir errores se puede iniciar el servicio así:
openvpn <archivo de configuración>
Nota: El servidor VPN debería poder trabajar como ruteador por lo que debemos activar esto a nivel del kernel:
echo 1 > /proc/sys/net/ipv4/ip_forward
Para que la configuración quede grabada y no se pierda al reiniciar la máquina se debe editar el archivo /etc/sysctl.conf y poner el valor de 1 a la variable correspondiente:
net.ipv4.ip_forward=1
Configuración de un Cliente
Instalar OpenVPN en el cliente. En el caso de usar Linux, la instalación es igual a como se instala el servidor.
Copiamos los archivos correspondientes al cliente dentro de la máquina del mismo (Ver la tabla de arriba). En mi caso los copie en /etc/openvpn/claves
Una vez que tenemos las claves, copiamos un archivo de configuración de ejemplo para cliente y lo configuramos para nuestras necesidades:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
vim client.conf
Definimos el protocolo como UDP igual que en el servidor:
proto udp
De manera similar al servidor, editamos las varialbes ca, cr y key:
ca claves/ca.crt
cert claves/clienteX.crt
key claves/clientX.key
El cliente debe saber a que servidor se debe conectar. Para esto debemos utilizar un nombre de dominio o el IP público y el puerto a conectarse. Por defecto OpeVPN corre en el puerto 1194.
remote miservidor.com 1194
Iniciamos OpenVPN en el cliente
/etc/init.d/openvpn start
En caso de tener errores podemos probar con
openvpn <archivo de configuracion>
Para probar la conectividad podemos hacer ping al ip 10.8.0.1 que es el ip de nuestro servidor. Si lo hacemos ya estamos con la VPN arriba. en caso de haber puesto la sentencia push podríamos hacer ping a ips dentro de la red LAN donde se encuentra la VPN. Ojo que las máquinas de la red LAN deberían saber como llegar a la red 10.8.0.0/24, para esto deberíamos ver la configuración del servidor.
Profe como vamos .. gracias por el how to .. sin embargo tenìa algunas preguntas .. si quiero enlazar 2 elastix via OpenVPN o teléfonos IP con mi elastix via OpenVPN .. como debo manejar las IPs??
Si te fijas en la línea:
push «route 192.168.45.0 255.255.255.0»
Ahí le digo que haga accesible esa red local a mi cliente de la vpn. De esa forma si tu elastix esta en la red 192.168.45.0/24 podrías acceder al mismo.
Es importante tener en el ruteador la ruta a la red 10.8.0.0/24 apunte a nuestra vpn. Si el servidor vpn esta en el ruteador, esto no sería necesario.
Saludos,
Rafael
Gracias profe por la info .. estoy haciendo algunos laboratorios con Elastix .. ahí le cuento como me va .. por cierto me escribe a mi correo por lo que quedo pendiente ..
Profe ya funciono la VPN y puedo hacer ping desde mi equipo remoto a mi servidor a traves de la VPN, sin embargo el momento que quiero registrar el Softphone en mi Elastix este no se puede registrar, reviso en cli> y no me da ningun mensaje .. Por fa su ayuda .. Gracias de antemano ..
Quiero configurar mi iPhone para integrarlo a red de oficina, el celular viene con un client para L2TP/IPsec y creo que si tiene aplicado el jailbreak se puede bajar un openVPN client (no lo he hecho)
Que será lo más recomendable hacer?
Espero puedas ayudarme, la conexión mediante openVPN se realiza con éxito, alcanzó los equipos de la LAN, sin embargo requiero que el trafico del cliente VPN no salga por el default gw que genera la conexión VPN (ISP), si no por un router cisco que se encuentra en la LAN destinado para alcanzar cierta IP de Inet. Creo que tengo problemas de rutas. ¿Podrías orientarme?