OpenVPN en Ubuntu 20.04

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
gen-req
sudo ./easyrsa sign-req server NombreDelServidor
sign-req
  • /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.

/var/log/openvpn/openvpn-status.log

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.

Dejar un comentario

Tu dirección de correo electrónico no será publicada.