Configuración De Cliente Openvpn Con Certificados X509

Configuración de cliente OpenVPN con certificados X.509

Descripción

Para poder acceder a la red local desde el exterior, existe una red privada configurada con OpenVPN que utiliza certificados x509 para autenticar los usuarios y el servidor.

En este post voy a tratar el tema de como crear una VPN utilizando OpenVPN con certificados X.509.

Lo primero sería crear nuestra clave privada de 4096 bits, para ello vamos a utilizar openssl. Vamos a guardar esta clave en el directorio /etc/ssl/private/. Para crear esta clave privada empleamos el siguiente comando:

root@debian:~# openssl genrsa 4096 > /etc/ssl/private/msi-debian-javierperezhidalgo.key
Generating RSA private key, 4096 bit long modulus (2 primes)
................................................................................++++
.................++++
e is 65537 (0x010001)

Lo siguiente sería generar una solicitud de firma de certificado, es decir, un fichero csr, que posteriormente enviaremos a la entidad del Gonzalo Nazareno para que nos lo firmen.

Para generar nuestro archivo .csr:

root@debian:~# openssl req -new -key /etc/ssl/private/msi-debian-javierperezhidalgo.key -out /root/msi-debian-javierperezhidalgo.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Sevilla
Locality Name (eg, city) []:Dos Hermanas
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Gonzalo Nazareno
Organizational Unit Name (eg, section) []:Informatica
Common Name (e.g. server FQDN or YOUR name) []:msi-debian-javierperezhidalgo
Email Address []:javierperezhidalgo01@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

root@debian:~# ls
msi-debian-javierperezhidalgo.csr

Vemos que ya hemos generado nuestro certificado, así que ahora tenemos que enviárselo al Gonzalo Nazareno para que nos lo firme. Lo enviamos desde este enlace.

Una vez tenemos descargado el certificado firmado, normalmente lo habremos descargado en Descargas, por tanto lo vamos a mover a la carpeta /etc/openvpn de nuestro usuario root.

root@debian:~# mv ../home/javier/Descargas/msi-debian-javierperezhidalgo.crt /etc/openvpn/

También hemos tenido que descargar el certificado de la entidad Gonzalo Nazareno. Por tanto lo vamos a mover a la ruta /etc/ssl/certs/:

root@debian:~# mv ../home/javier/Descargas/gonzalonazareno.csr /etc/ssl/certs/

Solo nos quedaría crear un fichero que configure OpenVPN. Este fichero tiene que tener una extensión .conf, y tiene que encontrarse en el directorio /etc/openvpn.

root@debian:/etc/openvpn# nano vpniesgn.conf

Dentro de él copiamos y pegamos las siguientes líneas:

dev tun
remote sputnik.gonzalonazareno.org
ifconfig 172.23.0.0 255.255.255.0
pull
proto tcp-client
tls-client
remote-cert-tls server
ca /etc/ssl/certs/gonzalonazareno.crt <- Cambiar por la ruta al certificado de la CA Gonzalo Nazareno (el mismo que utilizamos para la moodle, redmine, etc.)
cert /etc/openvpn/msi-debian-javierperezhidalgo.crt <- Cambiar por la ruta al certificado CRT firmado que nos han devuelto
key /etc/ssl/private/msi-debian-javierperezhidalgo.key <- Cambiar por la ruta a la clave privada, aunque en ese directorio es donde debe estar y con permisos 600
comp-lzo
keepalive 10 60
log /var/log/openvpn-sputnik.log
verb 1

Reiniciamos el servicio y lo iniciamos:

systemctl restart openvpn.service
systemctl start openvpn.service

Comprobamos que nos ha creado el túnel y que se nos ha añadido una IP y una regla de encaminamiento para acceder a la red 172.22.0.0/16:

root@debian:~# ip a show tun0
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none
    inet 172.23.0.46 peer 172.23.0.45/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::3ed2:aec4:b737:ab2c/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

root@debian:/etc/ssl/certs# ip r
...
172.22.0.0/16 via 172.23.0.45 dev tun0
...

Comprobamos los mensajes del fichero /var/log/openvpn-sputnik.log:

root@debian:/etc/ssl/certs# cat /var/log/openvpn-sputnik.log
Fri Oct 30 17:14:33 2020 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019
Fri Oct 30 17:14:33 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Fri Oct 30 17:14:33 2020 WARNING: using --pull/--client and --ifconfig together is probably not what you want
Fri Oct 30 17:14:33 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]92.222.86.77:1194
Fri Oct 30 17:14:33 2020 Attempting to establish TCP connection with [AF_INET]92.222.86.77:1194 [nonblock]
Fri Oct 30 17:14:34 2020 TCP connection established with [AF_INET]92.222.86.77:1194
Fri Oct 30 17:14:34 2020 TCP_CLIENT link local: (not bound)
Fri Oct 30 17:14:34 2020 TCP_CLIENT link remote: [AF_INET]92.222.86.77:1194
Fri Oct 30 17:14:34 2020 [sputnik.gonzalonazareno.org] Peer Connection Initiated with [AF_INET]92.222.86.77:1194
Fri Oct 30 17:14:36 2020 TUN/TAP device tun0 opened
Fri Oct 30 17:14:36 2020 /sbin/ip link set dev tun0 up mtu 1500
Fri Oct 30 17:14:36 2020 /sbin/ip addr add dev tun0 local 172.23.0.46 peer 172.23.0.45
Fri Oct 30 17:14:36 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Oct 30 17:14:36 2020 Initialization Sequence Completed

Importante: Si no queremos que se levante el túnel VPN cada vez que encendemos el ordenador deshabilitamos el servicio:

systemctl disable openvpn.service

Para habilitar el túnel VPN cuando lo necesitemos:

systemctl start openvpn.service

Si queremos utilizar resolución estática de nombres de las máquinas del centro, jupiter y macaco, añadimos en nuestro fichero /etc/hosts las siguientes líneas:

172.22.222.1    jupiter
172.22.0.1      macaco

Ya hemos terminado la configuración de nuestra VPN.