Instalación de una VPN de acceso remoto con OpenVPN y certificados x509

¿Qué es una VPN? ¿Para qué sirve?

De las siglas de Virtual Private Network, una VPN o red privada virtual (RPV) es una tecnología que permite una conexión segura a otra red mediante una red pública como puede ser internet. Permite, además, enviar y recibir datos como si se formase parte de la red local o privada, obteniendo así las funcionalidades que dicha red ofrece como son sus servicios.


En ocasiones, también puede referirse a una red privada virtual como un túnel, pues realmente lo que hace es crear un canal para el tráfico entre el cliente y el servidor VPN en el que su contenido corre independientemente del resto y de manera cifrada. Existen cuatro tipos según su uso: VPN de acceso remoto, VPN punto a punto, tunneling o VPN over LAN, aunque la más común es la primera de ellas.

Esquema de la conexión a través de VPN a una red privada.

Esquema de conexión a través de VPN a una red privada.

Su uso es diverso, aunque casi siempre tienen en común el de mejorar la seguridad, ya sea de la conexión o de los servicios ofrecidos por la red a la que se conecta.

Por ejemplo, puede darse el caso de comerciales repartidos por distintas localidades los cuales necesitan acceder a los servicios ofrecidos por la red privada de la empresa. Ésta, con el fin de evitar ataques a través de un puerto abierto a internet, podrán facilitarlo a través de una VPN. De esta manera, el usuario se conecta a través de una conexión cifrada a la red local y a través de ella disfruta de los servicios ofrecidos por un servidor, previniendo así ataques o accesos indeseados a través de internet. Cómo la conexión es cifrada, también es utilizado para proteger las conexiones realizadas mediante redes inalámbricas, en su mayoría, públicas.




Otro uso es saltar bloqueos geográficos. Con una VPN es posible simular una ubicación geográfica distinta a la tuya, accediendo a servicios que solo están disponibles en un país o región o que están siendo bloqueados por gobiernos. Hasta el más inofensivo YouTube o Netflix puede bloquear contenido según la región en la que te encuentres. Normalmente, este tipo de servicios con una geolocalización específica suelen ser contratados.

Esquema de red y configuraciones específicas

Con la peculiaridad de que el escenario de pruebas para la realización de una VPN de acceso remoto está realizado sobre OpenStack, tendremos que realizar una serie de configuraciones que no serán necesarias en otros entornos como por ejemplo un escenario real.

Serán un total de tres equipos que recibirán los nombres: ServerVPN, que actuará como servidor VPN; bugsbunny, que hará de cliente y HostRemoto, al que accederemos mediante un túnel.

Entorno de prueba para la VPN.

Esquema de red para la configuración de VPN utilizando OpenStack.

bugsbunny formará parte de otra red de instancias como son piolín, silvestre o taz y las cuales podemos imaginar que forman parte de una red local de una empresa. A las instancias ServerVPN y bugsbunny pueden asociárseles IP flotantes para su administración mediante SSH.

En primer lugar, accedemos mediante la herramienta de consola web al equipo HostRemoto para asignar una contraseña y poder establecer conexiones SSH.

Como no podemos asignar una IP flotante a HostRemoto, utilizamos la consola web o accedemos con SSH a través del equipo ServerVPN. Por ello, una vez logueados en ServerVPN, comprobamos con ping 10.50.50.6 la conectividad entre ServerVPN y HostRemoto, luego accedemos mediante SSH a HostRemoto con la contraseña anteriormente establecida.

Editamos el fichero /etc/resolv.conf para cambiar el servidor DNS (parámetro nameserver) y el cual será 192.168.102.2.

Por último, actualizamos los repositorios y paquetes de las instancias ServerVPN y bugsbunny con apt-get update && apt-get upgrade para pasar a la instalación y configuración de OpenVPN.

Instalación con Debian Jessie y OpenVPN.

Configuración del servidor ServerVPN con OpenVPN

Comenzamos con la configuración del servidor VPN, el cual será montado sobre Debian Jessie con OpenVPN. En esta instancia, instalamos OpenVPN y easy-rsa: apt-get install openvpn easy-rsa

Descomprimimos el fichero de configuración de ejemplo en el directorio de OpenVPN y le cambiamos el nombre utilizado: gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Ahora, editamos el fichero de configuración del servidor, cambiando algunos de sus parámetros. En él buscamos la línea dh dh1024.pem por dh dh2048.pem, pues se utilizará una clave de 2048 bits generada.

Modificamos la línea server 10.8.0.1 255.255.255.0 por server 10.99.99.0 255.255.255.0. Descomentamos la línea ;push «route 192.168.10.0 255.255.255.0» y cambiamos la dirección IP por la de nuestra red (10.50.50.0).

También activamos el log en el directorio /var/log/openvpn.log, reemplazando la línea ;log openvpn.log. Si lo deseamos cambiamos el nivel de registro del log cambiando el ajuste verb 3 por verb 4, siendo 4 un nivel de uso general.

El archivo de configuración, sin las correspondientes líneas comentadas y deshabilitadas es el siguiente:

Habilitar el reenvío de paquetes

A continuación, habilitamos el reenvío o encaminamiento de paquetes. Esto hará que sea posible reenviar el tráfico del cliente a Internet.

Activamos el IP forwarding con la ejecución de echo 1 > /proc/sys/net/ipv4/ip_forward. De esta manera es temporal, por lo que deberá de realizarse cada vez que se reinicie la máquina.

Activación de IP fordwarding en ServerVPN.

Con el fin de evitar esto, editamos el fichero /etc/sysctl.conf para descomentar la línea net.ipv4.ip_forward=1, seguidamente guardamos y cerramos el archivo.

Regla de iptables en ServidorVPN

En el ServidorVPN añadimos una regla de encaminamiento mediante iptables en la tabla NAT, que enrutará el tráfico entrante de la red 10.99.99.0/24 para salir por la interfaz eth1, donde se encuentra la red 10.50.50.6.

Insertamos la regla con iptables -A POSTROUTING -t nat -s 10.99.99.0/24 -o eth1 -j MASQUERADE

La regla de iptables se borrará con el reinicio de la máquina, si deseamos que esta sea persistente debemos hacerlo mediante la carga de un script al inicio del sistema.

Crear y configurar la autoridad certificadora

El siguiente paso es configurar una autoridad certificadora o de certificación (CA). Esta es la responsable de emitir y revocar certificados digitales y servirá para la confianza entre el equipo o equipos clientes y el servidor, no siendo posible la conexión mediante VPN si se carece de certificado válido.

OpenVPN permite la autentificación bidireccional mediante certificados, de manera que el cliente debe autenticar el certificado del servidor y éste debe autenticar el certificado del cliente.

Copiamos los scripts para generar la autoridad certificadora (CA), los parámetros Diffie-Helman y los certificados cp -r /usr/share/easy-rsa/ /etc/openvpn

Editamos el fichero vars para establecer los parámetros de configuración de easy-rsa deseados. En él debemos cambiar los parámetros KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL, KEY_OU y KEY_NAME.

Este es el fichero sin comentarios:

Generamos la clave .pem de Diffie-Hemlman usando OpenSSL con dhparam a través del comando: openssl dhparam -out /etc/openvpn/dh2048.pem 2048 o la ejecución de .build-dh dh2048 en el directorio /etc/openvpn

Esto generará, tras unos minutos, una clave de 2048 bits la cual está referenciada en el archivo server.conf.
Proceso de creación de una clave Diffie-Hellman.

Ejecutamos . ./vars o source vars en el directorio easy-rsa para cargar las variables de entorno a la hora de crear el certificado. Borramos todas las claves que puedan estar anteriormente en el directorio keys ejecutando ./clean-all, que borrará el directorio definido en la variable $KEY_DIR, lo creará de nuevo y definirá los permisos.

Por último, construimos la CA mediante OpenSSL: ./build-ca. Esto generará una una clave privada (ca.key) y un certificado (ca.crt) con los parámetros introducidos durante la ejecución del comando. Pulsamos Enter para aceptar los valores por defecto.


Generar un certificado y clave para el servidor VPN

Continuando en el directorio /etc/openvpn/easy-rsa, crearemos el certificado y clave para el servidor VPN.

Tenemos que ejecutar el archivo build-key-server junto al nombre del servidor establecido en la variable $KEY_NAME. Teniendo en cuenta que en nuestro caso es ServerVPN, ejecutamos: ./build-key-server ServerVPN e igualmente dejamos los valores por defecto, que fueron definidos en el fichero vars.

Se permite asignar una contraseña y nombre de la compañía para la solicitud del certificado, campos que dejamos en blanco. Además, se pedirá la confirmación de los datos para firmar el certificado con validez para 3650 días (diez años).

Copiamos el ServerVPN.crt, ServerVPN.key y ca.crt a /etc/openvpn: cp /etc/openvpn/easy-rsa/keys/{ServerVPN.crt,ServerVPN.key,ca.crt} /etc/openvpn

Iniciamos el servicio de OpenVPN y comprobamos su estado: service openvpn start && service openvpn status

Generar certificados y claves de clientes

Ahora, desde el servidor VPN generamos y firmamos los certificados para los clientes. De manera general, son los clientes los que deben de enviarte una solicitud de firma (.csr) para que, la autoridad certificadora, sea quien firme ese certificado. Aún así, también se le puede facilitar desde la administración directamente ambos archivos (.key y .crt) al cliente, quien además deberá disponer del certificado de la autoridad certificadora.

Ejecutamos build-key junto al nombre de los archivos a generar, en este caso ClienteVPN. Recordamos que la máquina que actúa como cliente VPN es la instancia bugsbunny. También debes recordar ejecutar ./build-key ClienteVPN en el directorio /etc/openvpn/easy-rsa.

Creación del certificado para el cliente bugsbunny.

A continuación, copiamos la plantilla de configuración del cliente con el comando cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/client.conf

El siguiente paso es, mediante scp, copiar los ficheros ClienteVPN.key, ClienteVPN.crt, ca.crt y client.conf al equipo cliente bugsbunny, la cual tiene la dirección IP flotante 172.22.203.50.
Ejecutamos entonces: scp /etc/openvpn/easy-rsa/keys/{ClienteVPN.key,ClienteVPN.crt,ca.crt,client.conf} debian@172.22.203.50:/home/debian

Ahora, nos conectamos a la instancia bugsbunny y movemos los archivos anteriormente copiados al directorio /etc/openvpn.

Editamos el archivo de la configuración del cliente, siendo ésta la configuración usada sin comentarios. La línea ns-cert-type server debe ser comentada y añadimos el registro de log con nivel 4.

Iniciamos el servicio OpenVPN con service start openvpn y desactivamos el inicio automático con el arranque del sistema con systemctl disable openvpn.service

Comprobamos que las interfaces referentes al túnel han sido creadas tanto en ServerVPN como en bugsbunny con la ejecución de ifconfig

Por último, comprobamos que hay conectividad entre el cliente VPN bugsbunny con la red 10.50.50.0/24, en concreto con la instancia llamada HostRemoto y que tiene dirección IP 10.50.50.6/24 así como la ruta tomada.

ifconfig, ping y traceroute para hacer comprobaciones.

Comprobación de la conectividad entre la máquina bugsbunny y HostRemoto a través del túnel VPN.

En un principio, no conseguía levantar la interfaz del túnel y los logs no mostraban ningún error en el funcionamiento de OpenVPN. Se debía a que no estaba cargando el archivo de configuración server.conf, así que lo indiqué con openvpn --script-security 2 --config /etc/openvpn/server.conf en ServerVPN. La ejecución de este comando se quedaba en primer plano, cuando éste era cancelado con Ctrl+C la interfaz tun0 desaparecía nuevamente.

Como conclusión, podremos establecer una comunicación con la red local de nuestra empresa de manera segura. El tráfico entre el cliente y el servidor VPN irá cifrado a través de internet, por lo que es una buena medida para conexiones en redes inalámbricas o para acceder a servidores sin abrir puertos de cara a internet.

Referencias

Compartir es agradecer. Si te ha gustado... ¡compartélo!
Comparte con tus amigos










Enviar

4 Respuestas

  1. pepe dice:

    Gracias por el tutorial. Tengo una duda, ¿en Export_KEY_NAME=»» ponemos el nombre de nuestro servidor o se puede poner un nombre cualquiera?

  2. martin dice:

    Para que arranque el servicio directamente hay que instalar el paquete «uml-utilities»

    apt.-get install uml-utilities

    Así no hay que ejecutar «openvpn –script-security 2 –config /etc/openvpn/server.conf» para que arranque el servicio .

    con «netstat -natpu » se puede mirar que este el ejecutable openvpn escuchando en el puerto 1194 (o el que se haya configurado)

  3. David Gruzzi dice:

    Tengo un problema, al momento de escribir en la consola como root este comando me da error

    apt-get install openvpn easy-rsa

    Package easy-rsa is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or is only available from another source

    y lo estoy ejecutando en debian 8.0.6

  4. ignacio dice:

    existe alguna manera de que una vez conectados a la vpn. tengamos salida a internet por medio del isp servidor de la vpn en lugar del nuestro proveedor de internet?

    si entro en speedtest me muestra la dirección del ISP del servidor de VPN en lugar del mio

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.