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.
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.
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.
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
port 1194 proto udp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/ServerVPN.crt key /etc/openvpn/ServerVPN.key dh /etc/openvpn/dh2048.pem server 10.99.99.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 10.50.50.0 255.255.255.0" keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 4 |
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.
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" export CA_EXPIRE=3650 export KEY_EXPIRE=3650 export KEY_SIZE=2048 export KEY_COUNTRY="ES" export KEY_PROVINCE="Sevilla" export KEY_CITY="Dos Hermanas" export KEY_ORG="SAD" export KEY_EMAIL="***@gmail.com" export KEY_OU="EvaristoGZ" export KEY_NAME="ServerVPN" |
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.
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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
client dev tun proto udp remote 10.0.0.25 1194 resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.crt cert /etc/openvpn/ClienteVPN.crt key /etc/openvpn/ClienteVPN.key ;ns-cert-type server comp-lzo log /var/log/openvpn.log verb 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.
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
- How To Set Up an OpenVPN Server on Debian 8 | DigitalOcean
- Configurar una VPN de acceso remoto con OpenVPN
Gracias por el tutorial. Tengo una duda, ¿en Export_KEY_NAME=»» ponemos el nombre de nuestro servidor o se puede poner un nombre cualquiera?
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)
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
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