Lo que nunca puede faltar es acceso a nuestra organización mediante VPN para cuando nos encontramos fuera y necesitamos conectarnos a ella.
Tendremos la posibilidad de instalarnos un ubuntu Server y configurarnos nuestro OpenVPN Community.
Instalación
Para nuestro servidor de OpenVPN, necesitaremos primeramente tener una PKI para generar los certificados necesarios.
Necesitaremos crear los certificados:
- CA
- Servidor OpenVPN
- Clientes
- Diffie-Hellman (Opcional)
- TLS
Crearemos un usuario “adduser usuario”

Instalar EasyRSA
Empezaremos por la PKI, necesitaremos instalar EasyRSA, buscamos cual es la ultima versión disponible.
Releases · OpenVPN/easy-rsa · GitHub
Crearemos un usuario, descargaremos y descomprimimos easy-rsa.
usermod -aG sudo # Permisos sudo
sudo su openvpn
cd /opt
sudo git clone https://github.com/OpenVPN/easy-rsa.git
sudo wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
sudo chmod 744 EasyRSA-3.0.8.tgz
sudo sudo tar -xvf EasyRSA-3.0.8.tgz
sudo mv EasyRSA-3.0.8 easy-rsa

Crear entidad Certificadora CA
A continuación, crearemos la entidad certificadora para generar nuestros certificados cliente/servidor
sudo ./easyrsa init-pki

Crearemos el fichero “vars” con la configuración de la entidad.
sudo vi vars
#Introducimos los parametros que necesitemos
#https://github.com/OpenVPN/easy-rsa/blob/master/easyrsa3/vars.example
set_var EASYRSA_REQ_COUNTRY "ES"
set_var EASYRSA_REQ_PROVINCE "Mordor"
set_var EASYRSA_REQ_CITY "Monte del Destino"
set_var EASYRSA_REQ_ORG "Mordor World"
set_var EASYRSA_REQ_EMAIL "Unico@mordor.world"
set_var EASYRSA_REQ_OU "Fuego"
set_var EASYRSA_ALGO "rsa"
set_var EASYRSA_DIGEST "sha256"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_COMMENT "Mordor World Eye Sauron Certificate"
set_var EASYRSA_REQ_CN "Mordor World Eye Sauron Certificate"
#Lanzamos la contrucción podremos utilizar la opción nopass para que no solicite la password cada vez que creamos un certificado.
sudo ./easyrsa build-ca
#O
sudo ./easyrsa build-ca nopass
#permisos carpeta pki
sudo chmod -R 764 ./pki/
sudo chown -R openvpn: ./pki/

Ya tendremos nuestra CA.
- ./pki/private/ca.key (Clave privada)
- ./pki/ca.crt (Clave publica)
Certificado Diffie-Hellman
El certificado Diffie-Hellman es opcional, no será necesario si utilizamos un cifrado ECDHE.
sudo ./easyrsa gen-dh

- ./pki/dh.pem
Certificado Servidor
Ahora generamos el certificado servidor para el servidor de OpenVPN.
sudo ./easyrsa gen-req NombreDelServidor nopass

sudo ./easyrsa sign-req server NombreDelServidor

- /opt/easy-rsa/pki/private/OPENVPN.key
- /opt/easy-rsa/pki/issued/OPENVPN.crt
Certificados Cliente
Por último, necesitaremos los certificados cliente necesitaremos uno por cliente que queramos que se conecte a nuestra organización.
sudo ./easyrsa gen-req Legolas nopass

sudo ./easyrsa sign-req client Legolas

- /opt/easy-rsa/pki/private/Legolas.key
- /opt/easy-rsa/pki/issued/Legolas.crt
Certificados Revocados
Para que nuestro OpenVPN sepa que certificados han sido revocados, cada vez que se revoque algún certificado generaremos un fichero crl.
sudo ./easyrsa gen-crl

- /opt/easy-rsa/pki/crl.pem
Fecha Expiración
Para ver las fechas de expiración de los certificados podremos utilizar el siguiente script para ver las fechas de expiración.
for cert in `ls *.crt`;
do
exp=`openssl x509 -noout -text -in $cert | grep "Not After" | cut -d: -f2-10`
echo $cert expires $exp
done

Instalación OpenVPN
Ahora instalaremos nuestro servicio de OpenVPN.
sudo apt update & sudo apt upgrade -f
sudo apt install openvpn

Clave TLS
Para finalizar nuestros certificados generaremos una clave TLS.
sudo openvpn --genkey --secret /opt/easy-rsa/pki/OpenVPN-tls.key
- /opt/easy-rsa/pki/OpenVPN-tls.key
Fichero .Conf
Necesitaremos generar el fichero de configuración de OpenVPN para el servicio.
Podremos copiar un fichero de ejemplo de configuración.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz
Crearemos una carpeta (/etc/openvpn/ssl/) con los certificados necesarios para OpenVPN:
- /opt/easy-rsa/pki/OpenVPN-tls.key
- /opt/easy-rsa/pki/private/OPENVPN.key
- /opt/easy-rsa/pki/issued/OPENVPN.crt
- /opt/easy-rsa/pki/dh.pem
- /opt/easy-rsa/pki/ca.crt
- /opt/easy-rsa/pki/crl.pem
sudo mkdir /etc/openvpn/ssl
sudo cp /opt/easy-rsa/pki/OpenVPN-tls.key /etc/openvpn/ssl/
sudo cp /opt/easy-rsa/pki/private/OPENVPN.key /etc/openvpn/ssl/
sudo cp /opt/easy-rsa/pki/issued/OPENVPN.crt /etc/openvpn/ssl/
sudo cp /opt/easy-rsa/pki/dh.pem /etc/openvpn/ssl/
sudo cp /opt/easy-rsa/pki/ca.crt /etc/openvpn/ssl/
sudo cp /opt/easy-rsa/pki/crl.pem /etc/openvpn/ssl/

Creamos nuestro fichero con los parámetros necesarios:
#Puerto de conexión
port 1194
#Protocolo
proto udp
#Red de asignación de IPs de VPN
server 192.168.110.0 255.255.255.0
client-to-client
persist-key
persist-tun
#Tunel tun0, tun1,...
dev tun
user nobody
group nogroup
#time-out
keepalive 10 120
#certificados
ca /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/OPENVPN.crt
key /etc/openvpn/ssl/OPENVPN.key
crl-verify /etc/openvpn/ssl/crl.pem
dh none
#TLS
tls-crypt /etc/openvpn/ssl/OpenVPN-tls.key
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256:TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
tls-version-max 1.3
tls-ciphersuites TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
auth SHA256
cipher AES-256-GCM
#Logs
ifconfig-pool-persist server-ipp.txt 0
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 0
Para generar el servicio deberemos tener en cuenta dos cosas el nombre de la carpeta del fichero de configuración y el nombre del fichero de configuración en mi caso “/etc/openvpn/server/Mordor.conf
En el nombre del servicio pondremos openvpn-(Nombre carpeta)@(Nombre Fichero sin .conf).service

sudo systemctl -f enable openvpn-server@Mordor.service
sudo systemctl start openvpn-server@Mordor.service

Fichero Cliente
Para generar el fichero cliente podremos utilizar el script que podeis encontrar en DigitalOcean para facilitar el trabajo Cómo instalar y configurar un servidor de OpenVPN en Ubuntu 20.04 | DigitalOcean
Creamos una carpeta para generar los ficheros.
mkdir -p ~/client-configs/files
mkdir -p ~/client-configs/keys
Creamos un fichero base desde el que crear los ficheros cliente.
vi ~/client-configs/base.conf
Agregamos los siguientes parámetros:
client
dev tun
proto udp
remote openvpn.dominio.com 1194 # nombre FQDN o IP
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
auth-nocache
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
Script creación de ficheros OVPN, lo que nos hará el script es introducir la keys dentro del fichero .ovpn
vi ~/client-configs/crear_ovpn_file.sh
Agregamos los siguiente:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/OpenVPN-tls.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn
Necesitaremos tener en la carpeta ~/client-configs/key/ los certificados ca.crt y tls.key
sudo cp /opt/easy-rsa/pki/OpenVPN-tls.key ~/client-configs/files/
sudo cp /opt/easy-rsa/pki/ca.crt ~/client-configs/files/
Copiamos los fichero del certificados cliente .key y .crt
sudo cp /opt/easy-rsa/pki/private/Legolas.key ~/client-configs/files/
sudo cp /opt/easy-rsa/pki/issued/Legolas.crt ~/client-configs/files/
Cambiamos los permisos del script.
sudo chmod -R 700 ~/client-configs/crear_ovpn_file.sh
sudo chown openvpn ~/client-configs/keys/*
Nota: Revisar que todos los nombres de certificados sean los correcto.
Para generar nuestro fichero ovf lanzamos el script con el nombre del certificado al final
./crear_ovpn_file.sh Legolas

Nos generara un fichero parecido a este.
client
dev tun
proto udp
remote 10.1.1.254 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
<ca>
-----BEGIN CERTIFICATE-----
Clave
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
Clave
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
Clave
-----END PRIVATE KEY-----
</key>
<tls-crypt>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
Clave
-----END OpenVPN Static key V1-----
</tls-crypt>
Conexión Cliente
Por último, instalaremos el cliente de OpenVPN y copiamos el fichero.ovpn

Podremos ver el fichero de log del servidor.

Routing
Una cosa muy importante es el enrutamiento de las redes cuando entran por el tunel, en este link pondemos ver dos como enrutar con Gateway externo o con el propio OpenVPN. BridgingAndRouting – OpenVPN Community
Para permitir el enrutamiento de todo el trafico hacia nuestra tarjeta fisica, habilitaremos el forward, editaremos el fichero /etc/sysctl.conf.
sudo vi /etc/sysctl.conf
Descomentamos la línea “#net.ipv4.ip_forward = 1”.
net.ipv4.ip_forward = 1
Recargamos los valores.
sudo sysctl -p
Editaremos el fichero .conf de OpenVPN
Si queremos enrutar todas las redes agregaremos lo siguiente
push "redirect-gateway def1"
Si solo queremos enrutar algunas, agregamos solo las redes a enrutar.
push "route 192.168.30.0 255.255.255.0
Para que todas las redes de la organización y la VPN sepa como encontrar las redes, tendremos que agregar en nuestro firewall una ruta estatica que le indique que la red/redes VPN el Gateway es el OPENVPN.
Esta es una ruta estatica de un Firewall PFsense, red VPN 192.168.11.0 y Gateway(Openvpn) 192.168.60.31.

Dashboard Conexiones
Para poder ver las conexiones existentes podremos utilizar el siguiente Dashboard How to Monitor OpenVPN Connections using openvpn-monitor tool – kifarunix.com
Editaremos nuestro fichero de configuración de OpenVPN y agregaremos la siguiente linea.
#Si instalamos el dashboard fuera del servidor OpenVPN podemos utilizar el rango 0.0.0.0, xxx.xxx.xxx.0 u otro.
#Podremos utilizar otro puerto que tengamos libre.
management 127.0.0.1 17562
Para la instalación necesitaremos agregar a la source.list el parámetro universe para que encuentre los paquetes, editamos el fichero “sources.list” y agregamos universe al final de las líneas.
sudo vi /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu focal main universe
deb http://archive.ubuntu.com/ubuntu focal-security main universe
deb http://archive.ubuntu.com/ubuntu focal-updates main universe
Instalaremos los paquetes necesarios.
sudo add-apt-repository ppa:maxmind/ppa
sudo apt update && sudo apt upgrade -f
sudo apt install git apache2 libapache2-mod-wsgi python3-geoip2 python3-ipaddr python3-humanize python3-bottle python3-semantic-version geoip-database geoipupdate
Descargamos el dashboard.
sudo git clone https://github.com/furlongm/openvpn-monitor.git /var/www/html/openvpn-monitor
Renombramos o copiamos el fichero de configuración.
sudo cp /var/www/html/openvpn-monitor/openvpn-monitor.conf.example /var/www/html/openvpn-monitor/openvpn-monitor.conf
Editamos el fichero de configuración y rellenamos lo parámetro que queramos, (site, name) son campos descriptivos, los importante el host y port.
[openvpn-monitor]
site=OpenVPN Dashboard Mordor
#logo=logo.jpg
#latitude=40.72
#longitude=-74
maps=True
maps_height=500
geoip_data=/var/lib/GeoIP/GeoLite2-City.mmdb
datetime_format=%d/%m/%Y %H:%M:%S
[Mordor1]
host=localhost
port=17562
name=OpenVPN Demo
password=
show_disconnect=False
Creamos un enlace simbólico a python3.
ln -s /usr/bin/python3 /usr/bin/python
Ahora configuramos el apache, creamos el fichero .conf.
sudo vi /etc/apache2/sites-available/openvpn-monitor.conf
Agregamos lo siguiente.
DocumentRoot /var/www/html/openvpn-monitor
<Directory /var/www/html/openvpn-monitor>
Options +ExecCGI
AddHandler cgi-script .py
DirectoryIndex openvpn-monitor.py
AllowOverride None
Require ip 192.168.0.0/16
</Directory>
Cambiamos los permisos.
sudo chown -R www-data: /var/www/html/openvpn-monitor/
sudo apachectl -t
sudo a2ensite openvpn-monitor.conf
sudo a2dissite 000-default.conf
sudo a2enmod cgid
sudo systemctl enable --now apache2
Por último, descargamos el fichero de GeoLite
sudo mkdir /var/lib/GeoIP
cd /var/lib/GeoIP
wget https://git.io/GeoLite2-City.mmdb
sudo chown -R www-data: GeoIP/
sudo systemctl restart apache2
Tambiem podemos registrarnos en Updating GeoIP and GeoLite Databases | MaxMind Developer Portal para descargar los fichero oficiales
Abrimos la Web http://IPoFQDN

Con esto tendremos una VPN operativa y funcionando, espero que os sea de ayuda.