El objetivo de esta tarea es el de establecer una conexión de acceso remoto entre nuestro equipo de casa y sputnik, una máquina virtual contratada en OVH, a través de la cuál se va a crear una doble conexión VPN para poder acceder desde el exterior a las máquinas del departamento de informática del IES Gonzalo Nazareno, haciendo uso del puerto 1194/TCP.
Para llevar a cabo dicha tarea, necesitaremos disponer de un certificado X.509 para nuestro equipo, que haya sido previamente firmado por la autoridad certificadora (CA) del IES Gonzalo Nazareno, por lo tanto, lo primero que tendremos que hacer será crear una solicitud de firma de certificado (CSR o Certificate Signing Request). En este caso, vamos a hacerlo con openssl, pero se podría hacer con otras múltiples opciones de software:
El primer paso será generar una clave privada RSA de 4096 bits, que será almacenada en /etc/ssl/private/ (con permisos de administrador, ejecutando el comando su -
):
En mi caso, mi máquina tiene nombre debian, por lo que el nombre del fichero final será debian.key:
Una vez generado, cambiaremos los permisos de la clave privada que acabamos de generar a 400, de manera que únicamente el propietario pueda leer el contenido, pues se trata de una clave privada. Este paso no es obligatorio pero sí recomendable por seguridad. Para ello, haremos uso de chmod
:
Para verificar que los permisos han sido correctamente modificados, listaremos el contenido de dicho directorio haciendo uso de ls -l
:
Efectivamente, los permisos han sido correctamente modificados a sólo lectura por parte del propietario.
Tras ello, crearemos un fichero .csr de solicitud de firma de certificado para que sea firmado por la autoridad certificadora (CA) del IES Gonzalo Nazareno, que estará asociado a la clave privada que acabamos de generar. Dicho fichero deberá ser almacenado en una ruta accesible por el usuario común, ya que posteriormente habrá que subirlo para su correspondiente proceso de firmado:
En mi caso, mi máquina tiene el nombre debian, por lo que el nombre del fichero final será debian.csr, que se encontrará almacenado en una ruta accesible por el usuario común, como por ejemplo, el directorio personal (/home/alvaro/):
Durante la ejecución, nos pedirá una serie de valores para identificar al certificado, que tendremos que rellenar de la siguiente manera:
Todos los valores son genéricos excepto los dos últimos:
- Common Name (CN): Indica el nombre del equipo, que ha de ser único. Para evitar problemas, vamos a poner el nombre de la máquina (debian), seguido del nombre de usuario del IES Gonzalo Nazareno (alvaro.vaca) mediante un guión, quedando finalmente debian-alvaro.vaca.
- Email Address: La dirección de correo electrónico personal. En este caso, avacaferreras@gmail.com.
Tras ello, se pedirán una serie de valores cuya introducción es opcional. En mi caso, no los rellené:
Para verificar que el fichero de solicitud de firma ha sido correctamente generado, listaremos el contenido del directorio donde ha sido almacenado y usaremos un filtro de nombre:
Como se puede apreciar, el fichero se encuentra generado en dicho directorio, con nombre debian.csr.
El siguiente paso será subir el fichero de solicitud de firma mediante la aplicación Gestiona, para que sea firmado y así obtengamos el certificado que necesitamos, con extensión .crt o .pem. El fichero debe subirse en el apartado “Certificados de Equipos”:
Una vez subido, tendremos que esperar unas horas (pues la firma del mismo se lleva a cabo manualmente) y tras ello, nos aparecerá de la siguiente forma:
Como se puede apreciar, nos aparece para descargar o revocar el certificado firmado, con extensión .crt. En este caso, lo descargaremos.
Tras ello, tendremos que descargar además el certificado de la propia autoridad certificadora del IES Gonzalo Nazareno dentro de /etc/ssl/certs/, de manera que se pueda llevar a cabo la comprobación de la firma y así poder verificar que quién nos lo ha firmado es quien realmente dice ser. Para ello, nos moveremos dentro de dicho directorio, ejecutando para ello el comando:
Una vez dentro del mismo, haremos uso de la utilidad wget
para descargar el fichero pasándole una URL de descarga:
Para verificar que el certificado de la CA Gonzalo Nazareno ha sido correctamente descargado, vamos a listar el contenido del directorio actual, estableciendo de nuevo, un filtro por nombre:
Como se puede apreciar, el certificado se encuentra descargado en el directorio actual, con nombre gonzalonazareno.crt.
A continuación, como es lógico, necesitaremos un cliente que nos permita llevar a cabo dicha conexión de acceso remoto, así que recurriremos a OpenVPN. Dicho paquete no viene instalado por defecto, así que tendremos que hacerlo manualmente, ejecutando para ello el comando:
Como consecuencia de la instalación, se habrá generado un nuevo directorio dentro de /etc/, de nombre openvpn/, en el que tendremos que alojar la configuración del mismo. Para ello, nos moveremos a dicho directorio, ejecutando para ello el comando:
Lo primero que haremos será mover nuestro certificado firmado desde el directorio Descargas/ al directorio actual (realmente, se podría dejar allí, pero siempre es mejor mantener una organización), haciendo uso del comando mv
:
Tener el certificado firmado no es el único requisito para que OpenVPN funcione. Además, necesitaremos un fichero de configuración con extensión .conf (exigencia de OpenVPN) en el que se encuentren indicadas todas las directivas necesarias para su funcionamiento. En mi caso, he decidido que el nombre de dicho fichero sea vpn.conf, aunque se podría haber usado cualquier otro. Para crear y modificar el contenido de dicho fichero, ejecutaremos el comando:
El contenido del mismo será:
En este caso, los parámetros que debo usar son:
- rutacertificadoCA: /etc/ssl/certs/gonzalonazareno.crt
- rutacertificadoFirmado: /etc/openvpn/debian.crt
- rutaclaveprivada: /etc/ssl/private/debian.key
El resultado final del fichero sería el siguiente:
Tras ello, guardaremos los cambios ejecutando la combinación de teclas CTRL + X, seguido de Y y de ENTER.
Para verificar que el certificado firmado fue movido de directorio con éxito y que el fichero de configuración vpn.conf ha sido correctamente generado, listaremos el contenido del directorio actual, haciendo uso del comando ls -l
:
Como se puede apreciar, el certificado firmado (debian.crt) se encuentra correctamente alojado en el directorio actual, al igual que el fichero de configuración de OpenVPN (vpn.conf).
Dado que hemos modificado un fichero de configuración de un servicio, tendremos que reiniciarlo para que haga uso de la nueva configuración existente. Para ello, haremos uso del comando:
Llegados a este punto se pueden plantear dos posibilidades distintas:
- Que queramos usar el túnel VPN desde el arranque de la máquina:
Como consecuencia del reinicio del servicio, el servicio se habrá iniciado (active) y por defecto, viene habilitado para que se inicie durante el arranque de la propia máquina (enabled).
En OpenVPN existe un servicio principal o maestro (openvpn.service) que es el que se encuentra actualmente activo y habilitado para su inicio durante el arranque y varios “subservicios”, uno por cada uno de los túneles VPN que gestionemos (openvpn@[nombre].service).
Por defecto, los subservicios vienen desactivados (inactive), de manera que en cuanto lo arranquemos por primera vez (start), se levantará y tendremos conectividad en todo momento, incluso tras un reinicio, de manera automatizada, ya que el servicio principal o maestro se encuentra enabled. Para arrancar el subservicio, tendremos que introducir el nombre del fichero de configuración como nombre (sin la extensión), quedando de la siguiente manera:
El túnel VPN ya se habrá levantado, de manera que si listamos nuestras reglas de enrutamiento veremos que han sido añadidas:
Efectivamente, las correspondientes reglas de encaminamiento han sido añadidas, de manera que aunque se efectúe un reinicio, volverán a añadirse automáticamente, como consecuencia de tener el servicio principal (openvpn.service) habilitado durante el arranque, y haber arrancado manualmente por primera vez dicho túnel VPN (openvpn@vpn.service).
- Que queramos levantar el túnel VPN manualmente (es mi caso):
Tal y como he mencionado en la posibilidad anterior, como consecuencia del reinicio del servicio maestro, el servicio se habrá iniciado (active) y por defecto, viene habilitado para que se inicie durante el arranque de la propia máquina (enabled), pero esto no es lo que buscamos, pues nosotros queremos que únicamente esté activo cuando nos sea necesario, y que por tanto, tampoco se inicie durante el arranque de la máquina.
Es por ello, que vamos a apagar el servicio (stop) y lo deshabilitaremos para que no inicie durante el arranque (disable):
El servicio maestro se encuentra apagado y deshabilitado durante el arranque, de manera que cuando queramos hacer uso del túnel VPN, iniciaremos el subservicio (start) y cuando no queramos seguir usándolo, lo apagaremos (stop), de la siguiente manera:
El túnel VPN ya se habrá levantado, de manera que si listamos nuestras reglas de enrutamiento veremos que han sido añadidas:
Como era de esperar, las reglas correspondientes se han añadido, de manera que ya tenemos conectividad con las máquinas del departamento de informática del IES Gonzalo Nazareno. De igual forma, vamos a verificar el contenido del fichero de log ubicado en /var/log/openvpn-sputnik.log, para así asegurarnos de que se ha establecido la conexión, haciendo uso de cat
:
Como se puede apreciar en la salida del fichero, se ha establecido correctamente una conexión TCP con sputnik (92.222.86.77) en el puerto 1194. Además, el túnel VPN se ha levantado haciendo uso de la interfaz tun0, así que vamos a ver la información correspondiente a dicha interfaz, ejecutando para ello el comando:
Efectivamente, la interfaz anteriormente mencionada se encuentra correctamente configurada, pero de nada nos sirve si todavía no hemos verificado si realmente funciona.
Antes de llevar a cabo las pruebas, voy a modificar mi fichero /etc/hosts para llevar a cabo la resolución estática de nombres de las máquinas más utilizadas en el centro (pues no existe ningún servidor DNS en Internet que almacene las direcciones IP correspondientes, al ser direcciones privadas), quedando de la siguiente manera:
Por lo tanto, si ahora mismo hiciésemos ping
a la dirección 172.22.0.1 (o lo que es lo mismo, a macaco), éste debería responder:
Efectivamente, la resolución estática de nombres se ha llevado a cabo correctamente. Además, hemos recibido respuesta a los paquetes ICMP enviados, por lo que podemos concluir que el túnel VPN funciona correctamente.
Supongamos que ya no necesitamos seguir haciendo uso de dicho túnel, así que para ello, sería tan sencillo como parar el subservicio correspondiente, ejecutando para ello el comando:
Si volvemos a listar de nuevo las reglas de encaminamiento existentes en nuestra máquina, veremos que han sido eliminadas:
Como era de esperar, las reglas correspondientes se han eliminado y por tanto, podemos concluir que el túnel VPN se ha apagado y que ya no tenemos conectividad con las máquinas del departamento de informática.