Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 15 de febrero de 2013

Creación de VPN con openVPN

Una VPN(Virtual Private Network) se trata de una red virtual a la que sólo tienen acceso un número limitado de personas escogidas por el creador de ésta. Esta tecnología ha sido pensada para proteger la información de los numerosos peligros que pueden hacer en la red, tales cómo los hackers.

La red es un lugar peligroso, donde la información circula libremente, estando a disposición de usuarios maliciosos. La red que circula dentro de una red privada es confidencial, pero imaginemos que tenemos un equipo fuera de dicha red, que queramos que tenga acceso a la información del servidor, o de un equipo de la red. Esto es posible hacerlo, pero la información puede ser robada:



Con una VPN garantizamos la integridad de nuestros datos, aseguramos una red privada con IPs virtuales en la que simularíamos una transferencia de datos por un cable físico, siendo imposible que nadie vea el contenido de dicha transferencia. Es por ello que se llama red virtual privada, porque simula las características de una red privada física.




OpenVPN es una de las soluciones existentes para realizar dicha tarea. Su principal punto a favor, es que combina todas bondades de otras soluciones VPN, tales cómo L2Sec e IPSec, aunque tiene la desventaja de que sólo funciona al 100% en los servidores Linux. OpenVPN usa los standards SSL/TLS para cifrar y combinar todas sus características, siendo una buena opción para integrar tanto en entornos domésticos cómo para profesionales. Primero, ante todo debemos pensar la arquitectura de nuestra VPN: ¿Que ip tendrá nuestra VPN? ¿Cuántos clientes tendrá nuestro servidor VPN? El router que esté conectado a nuestro servidor DEBE tener NAT, ¿Tenemos un router que cumpla ese requisito? ¿Son capaces de verse entre sí todos los routers que actuarán en la VPN? Una vez tengamos claras nuestras ideas, lo mejor es hacer un esquema que nos guíe, cómo el que muestro yo cómo ejemplo, ejemplo que seguiré para la explicación de la VPN.



Para empezar hay que instalar openVPN en un servidor Linux, siendo tan fácil cómo instalar apt-get install openvpn. Con esto ya tendríamos la aplicación instalada pero, evidentemente, carece de configuración alguna. Para ello lo primero y más importante es crear los certificados que tendrán tanto nuestro servidor, cómo los clientes; sin esto no se podrá construir VPN alguna. Yo en este caso utilizaré certificados ssl, que no sólo se crean con facilidad, sino que además son muy seguros. Para ello, primero hay que instalar openssl con apt-get install openssl. Una vez instalado el software escribimos cd /usr/lib/ssl/misc, accediendo a la carpeta donde se almacenan los scripts de openssl que serán las herramientas que usaremos para la creación de las licencias. Lo primero y más importante es conceder los permisos necesarios para poder ejecutar dichos scripts. Lo ideal es que sólo nosotros los administradores root, tengamos la posibilidad de ejecutar estos, con lo que escribiremos: chmod 755 –R *. Ya teniendo los permisos, es el momento de crear un nuevo certificado CA, que es indispensable en todos los equipos que usen openVPN, ya sea cliente o servidor. Para ello escribimos ./Ca.sh –newca , con el cual haremos nuestro nuevo certificado. El nombre dejadlo por defecto y la contraseña usad la que os convenga, pero SIEMPRE usad la misma para todos los certificados o claves que generemos a partir de ahora. Con esto ya tendríamos el certificado almacenado en la carpeta demoCA, pero no necesitamos firmarlo para que sea valido, con lo que vamos a la carpeta demora y renombramos el archivo con el nombre “newca.pem” para luego firmarlo mediante esta sentencia:

openssl –x506 –in newca.pem –days 10000 –out cacert.pem –signkey private/cakey.pem

Gracias a esto ya tenemos un certificado CA con una validez de 10000 días; ahora es el turno de hacer los certificados personales para cada equipo, ya sea cliente o servidor. Comenzaremos con el de servidor, para el cual debemos escribir lo siguiente manteniendo el orden:

./CA.sh –newreq Aquí os irá pidiendo algunos datos relativos al equipo. La mayoría de ellos no tienen demasiada importancia pero el Common Name poner un nombre conciso, pues es el nombre que mostrará en cualquier informe de la VPN.
./CA.sh –sign Firmamos el certificado
mv newcert.pem Server-cert.pem Renombramos los certificados creados
mv newkey.pem Server-priv.pem Renombramos los certificados creados

Ahora cómo está. Cada vez que arranquemos el servicio vpn nos pedirá la clave del certificado. Lo cual es engorroso, así que con el siguiente comando haremos que no nos pidan nada:
openssl rsa –in Server-priv.pem –out Server-private.pem






Es recomendable crear una carpeta donde almacenar todo lo referente a claves, certificados, etc… relacionados con vpn. Por ello yo por ejemplo he creado la carpeta “keys” en el directorio de openvpn con el comando mkdir /etc/openvpn/keys y después copiado los ficheros creados ahora ha dicho directorio:
cp Server-cert.pem Server-private.pem /etc/openvpn/keys
cp demoCA/cacert.pem /etc/openvpn/keys

Ya tenemos las claves del servidor creadas y almacenadas adecuadamente para su posible futura gestión. Aún así todavía faltan por incluir dos cosas:

Uno es un tipo de certificado que sólo va en el servidor llamado Diffie Hellman. Para generarlo solo habría que ir a la carpeta keys y escribir: openssl dhparam-out dh1024.pem 1024, generando un archivo llamado dh1024.dh; Lo otro se trata de generar la clave secreta que sólo los miembros de la vpn tendrán mediante el comando:
openvpn –genkey –secret ta.key

Ahora sólo faltarían crear los certificados de los clientes, cuyo proceso no cambia, con lo que yo he hecho el siguiente script para automatizar el proceso:

  1. #!/bin/bash
  2. #Introducir el codigo nombre del cliente
  3. echo 'Introduzca el nombre del cliente'
  4. read cliente
  5. #Se mueve al directorio donde se ejecutan los scripts openssl
  6. cd /usr/lib/ssl/misc
  7. #Se crea el nuevo cliente con su nombre clave, etc...
  8. #Common name debe ser IGUAL al nombre del cliente que hemos introducido
  9. ./CA.sh -newreq
  10. ./CA.sh -sign
  11. #Se renombran los certificados con el nombre del cliente
  12. mv newcert.pem ${cliente}-cert.pem
  13. mv newkey.pem ${cliente}-priv.pem
  14. openssl rsa -in ${cliente}-priv.pem -out ${cliente}-private.pem
  15. #Se copian los certificados a la carpeta adecuada
  16. cp ${cliente}-cert.pem /etc/openvpn/keys/
  17. cp ${cliente}-private.pem /etc/openvpn/keys/
  18. #Mensaje Final
  19. echo 'Cliente introducido correctamente'

Creadas todas las licencias lo primero que hay que hacer siempre también(no importa que sea servidor o cliente), es coger el fichero de configuración de ejemplo y copiarlo en la carpeta openvpn con el comando:

cat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/openvpn.conf

Ya con la plantilla, la configuración se volvería mucho más fácil. Esta configuración en concreto la haré a partir de mi esquema, pero explicaré los puntos importantes para que podáis configurarlo con la misma facilidad, No escribiré de cabo a rabo todo lo que aparece en el fichero aunque si lo importante:

  1. local 172.24.100.50 #ip en la que escuchará el servidor
  2. port 443 #Puerto de escucha. Por defecto pone 1194 pero este es más eficiente
  3. proto tcp #Protocolo. Por defecto udp, recomendado tcp.
  4. dev tun #Tipo de dispositivo. Ni tocar
  5. ca /etc/openvpn/keys/cacert.pem #Certificado de la CA
  6. cert /etc/openvpn/keys/Server-cert.pem #Certificado del servidor
  7. key /etc/openvpn/keys/Server-key.pem #Clave privada del servidor
  8. dh /etc/openvpn/keys/dh1024.dh #parametros Diffie-Hellman
  9. server 10.0.1.0 255.255.255.0 #Subred de la VPN, poner rango diferente a la red fisica
  10. tls-auth ta.key 0 #Clave de autentificacion
  11. ifconfig-pool-persist /etc/openvpn/keys/ipp.txt #Registro del pool de direcciones
  12. cipher AES-256-CBC #Cifrado AES 256(por defecto Blowfish)
  13. auth SHA1 #Ni tocar
  14. verb 3 #Nivel de log

Esta es la configuración importante y necesaria del servidor VPN. Teniendo todo bien, escribiendo /etc/init.d/openvpn restart debería reiniciarse el servicio a la perfección. La prueba de fuego es escribir ifconfig: Si aparece una nueva interfaz de red llamada tun0 con una ip perteneciente al rango de ip asignado por openVPN, es que tenemos el servidor configurado correctamente.

El servidor está configurado a la perfección. Sólo nos falta que la gente que esté fuera de la red pueda acceder a él, pues sino será imposible crear VPN alguna. Para ello debemos configurar el router y en el apartado NAT, tenemos que hacer que todo lo que vaya al router por tcp, por el puerto 443, se redirija al servidor VPN por el mismo puerto. Aquí es imposible explicar explícitamente cómo hacerlo ya que depende del modelo y fabricante de cada uno, pero las interfaces de configuración son muy intuitivas con lo que sabiendo el concepto de lo que hay que hacer, sólo tenéis que adaptarlo a vuestro dispositivo.

Cómo ya se tiene el entorno servidor preparado, sólo hace falta que los clientes se conecten a dicho server. Para ello sólo hay que instalar openvpn y copiar la plantilla ejemplo cómo se ha hecho en el servidor, pero en la configuración hay unas pequeñas pero significativas variaciones. Al igual que en el apartado servidor, escribiré aquello importante que se debe escribir en el servidor. A cada cliente se le tiene que proporcionar cuatro ficheros que por ejemplo los puede guardar /etc/openvpn/keys: cacert.pem, el certificado del usuario, la clave privada del usuario y el ta.key (autentificación de cliente y servidor).

  1. client #Escribiendo esto especificamos que es un cliente
  2. dev tun #Tipo de dispositivo de rutado. Dejarlo cómo está.
  3. proto tcp #Protocolo tcp. Tiene que ser el mismo que el del servidor
  4. remote 192.168.1.1 443 #IMPORTANTE Hay que poner la dirección publica del ROUTER conectado al servidor. Luego con NAT el router te redirige automáticamente al servidor.
  5. ca /etc/openvpn/keys/cacert.pem #certificado de la CA
  6. cert /etc/openvpn/keys/cliente-cert.pem #Certificado del usuario inventado
  7. key /etc/openvpn/keys/cliente-key.pem #Clave privada del usuario inventado
  8. tls-auth /etc/openvpn/keys/ta.key 1 #Autenticacion
  9. cipher AES-256-CBC #Mismo que el servidor
  10. auth SHA1 #Mismo que el servidor

Para acabar hacemos openvpn /etc/openvpn/client.conf. En caso de lograr conectarse al servidor empezará a lanzar y recibir paquetes en la consola. Sólo hay que pulsar ctrl. + C para parar todos los mensajes que aparecen por pantalla y listo. Ahora escribiendo ifconfig, veréis una nueva interfaz en vuestro cliente llamada tun0 con una de las ips del rango asignado en el servidor VPN, teniendo así nuestro primer cliente conectado a ella. Si tenemos algún problema lo primero es revisar que la red está configurada correctamente, en caso de ir todo bien revisar el NAT del router, y sino revisar la configuración de iptables del servidor.

Y así, hemos logrado una VPN gratuita, potente y segura. Cómo podéis observar, el proceso de creación de una VPN no implica demasiada complejidad. Al principio puede resultar lioso pero es cuestión de dedicarle algo de tiempo y ganas. Cierto que puede resultar a ser laboriosa toda la elaboración de la red, pero es algo que merece la pena.  

Saludos.

No hay comentarios :

Publicar un comentario