OpenVPN en Linux

Aunque WireGuard se ha ganado buena parte de la atención durante los últimos años, OpenVPN sigue siendo una de las soluciones más utilizadas cuando se necesita una VPN estable, flexible y compatible con prácticamente cualquier sistema operativo.

Windows, Linux, macOS, Android, iPhone… todos tienen un cliente oficial y todos pueden autenticarse utilizando certificados digitales, una característica que sigue siendo una enorme ventaja en entornos corporativos.

En esta guía vamos a instalar un servidor OpenVPN sobre Linux, preparado para acceso de usuarios remoto (Road Warrior) y para VPN Sitio a Sitio.

La gran mayoría de las guías que he visto de OpenVPN vienen arrastrando configuraciones muy antiguas, voy a tratar de hacer esto con todo lo más actual, desde la paquetería, hasta como se intercambian las llaves y se aseguran las conexiones.


Antes de comenzar

Si el servidor todavía no está instalado, te recomiendo partir por una instalación mínima y segura del sistema operativo.

Hace un tiempo publiqué un video donde muestro cómo instalar un servidor Linux siguiendo buenas prácticas desde el primer minuto, eliminando servicios innecesarios y dejando una base mucho más limpia para cualquier proyecto.

Cuando termines, vuelve a este artículo.

Asumiremos que ya tienes un servidor recién instalado, actualizado y con acceso como root.


Requisitos

Para seguir esta guía necesitarás:

  • Red Hat Enterprise Linux 10, AlmaLinux 10 o Rocky Linux 10.
  • Acceso como root.
  • Una dirección IP pública o un nombre DNS para el servidor.
  • El puerto 1194/UDP accesible desde la WAN hacia el servidor VPN (DNAT)

Manos a la obra

Antes de instalar cualquier paquete, actualiza completamente el sistema.

dnf update -y

reboot

Instalar OpenVPN

habilitamos EPEL e instalamos OpenVPN.

dnf install -y epel-release

dnf install -y openvpn easy-rsa

Verifica la versión instalada.

openvpn --version

Idealmente deberías utilizar OpenVPN 2.6 o superior.


Habilitar el reenvío de paquetes

Como el servidor actuará como router entre la VPN y la red interna, el kernel debe permitir el reenvío de paquetes.

Edita el archivo:

vim /etc/sysctl.conf

Agrega esto al final:

net.ipv4.ip_forward = 1

Aplicar la configuración.

sysctl -p

Para comprobar si cargó los cambios ejecutamos:

sysctl net.ipv4.ip_forward

Crear la PKI

OpenVPN utiliza certificados X.509 para autenticar tanto al servidor como a los clientes.

La forma más sencilla de administrarlos es usando Easy-RSA (el que instalamos junto con OpenVPN)

Necesitamos crear el directorio y copiar los archivos de Easy-RSA para crear los certificados.

mkdir -p /etc/openvpn/easy-rsa

cp -R /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

cd /etc/openvpn/easy-rsa

Inicializar la estructura de los certificados.

./easyrsa init-pki

Crear la Autoridad Certificadora.

./easyrsa build-ca

Crear el CRL, muy importante, esta es la lista de Certificados Revocados (Certificate Revocation List)

./easyrsa gen-crl                                                                                                                                                   

A continuación genera el certificado del servidor.

./easyrsa build-server-full server nopass

A diferencia de muchas guías antiguas, no vamos a generar un Diffie-Hellman (dh.pem). OpenVPN 2.6 utiliza intercambio de claves con ECDHE, por lo que ese archivo ya no es necesario.

En cambio, protegeremos el canal TLS utilizando tls-crypt.

Crear la clave:

cd /etc/openvpn/easy-rsa
openvpn --genkey secret tls-crypt.key

Ahora creamos el directorio donde vamos a copiar los certificados y configuraciones para el servidor VPN

mkdir -p /etc/openvpn/server

Copiamos los certificados necesarios.

cp tls-crypt.key /etc/openvpn/server/
cp pki/ca.crt /etc/openvpn/server/

cp pki/issued/server.crt /etc/openvpn/server/

cp pki/private/server.key /etc/openvpn/server/

Cambiamos los permisos a las llaves privadas.

chmod 600 /etc/openvpn/server/server.key

chmod 600 /etc/openvpn/server/tls-crypt.key

Y con esto ya tenemos listos los certificados. Ahora vamos a crear la configuración para el servidor OpenVPN.

Configurar el servidor

Creamos el archivo de configuración

vim /etc/openvpn/server/server.conf

Contenido:

port 1194
proto udp
dev tun

user nobody
group nobody

topology subnet

server 10.100.0.0 255.255.255.0

push "route 192.168.10.0 255.255.255.0"  # la direccion de red de la oficina

ifconfig-pool-persist ipp.txt

ca ca.crt
cert server.crt
key server.key

tls-crypt tls-crypt.key

data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
data-ciphers-fallback AES-256-GCM

auth SHA256

tls-version-min 1.2

persist-key
persist-tun

keepalive 10 120

explicit-exit-notify

verb 3

status openvpn-status.log
log-append openvpn.log

crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
Parámetro Descripción
port 1194 Puerto donde OpenVPN escuchará las conexiones entrantes.
proto udp Utiliza UDP como protocolo de transporte, recomendado por su mejor rendimiento.
dev tun Crea una interfaz TUN para transportar tráfico IP de capa 3.
user nobody Reduce privilegios ejecutando OpenVPN como el usuario nobody después del inicio.
group nobody Ejecuta OpenVPN con el grupo nobody para limitar permisos.
topology subnet Utiliza una topología moderna donde todos los clientes comparten la misma subred VPN.
server 10.100.0.0 255.255.255.0 Define la red virtual que utilizarán los clientes VPN.
ifconfig-pool-persist ipp.txt Conserva la asignación de direcciones IP entre reconexiones de los clientes.
ca ca.crt Certificado de la Autoridad Certificadora (CA) utilizada para validar los clientes.
cert server.crt Certificado digital del servidor OpenVPN.
key server.key Clave privada asociada al certificado del servidor.
tls-crypt tls-crypt.key Cifra y autentica el canal de control antes del handshake TLS, ocultando el servicio y bloqueando conexiones no autorizadas.
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305 Lista de algoritmos de cifrado permitidos para el canal de datos.
data-ciphers-fallback AES-256-GCM Algoritmo utilizado como respaldo para clientes que no soportan negociación de cifrados.
auth SHA256 Algoritmo HMAC utilizado para garantizar la integridad de los paquetes.
tls-version-min 1.2 Obliga a utilizar TLS 1.2 o superior durante la negociación.
persist-key Conserva la clave privada entre reinicios del túnel, evitando volver a cargarla.
persist-tun Mantiene la interfaz TUN activa cuando la conexión se reinicia.
keepalive 10 120 Envía un ping cada 10 segundos y reinicia la conexión tras 120 segundos sin respuesta.
explicit-exit-notify Informa al cliente cuando el servidor cierra la conexión UDP de forma controlada.
verb 3 Define un nivel de registro equilibrado para operación normal y diagnóstico básico.
status openvpn-status.log Genera un archivo con el estado de los clientes conectados y estadísticas de la VPN.
log-append openvpn.log Registra los eventos de OpenVPN agregándolos al archivo de log sin sobrescribirlo.
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem Verifica la Lista de Revocación de Certificados (CRL) para impedir el acceso a certificados revocados.

Firewall

Abrir sólo el puerto utilizado por OpenVPN.

firewall-cmd --permanent --add-port=1194/udp

firewall-cmd --reload

Puedes comprobar la configuración con:

firewall-cmd --list-ports

SELinux

OpenVPN funciona correctamente con SELinux en modo Enforcing, siempre que utilices las rutas habituales (/etc/openvpn) y no inventes ubicaciones para certificados o archivos de configuración.

Si en algún momento SELinux bloquea alguna operación específica, primero revisa los eventos antes de asumir que debes desactivarlo.

ausearch -m AVC

O bien:

journalctl -t setroubleshoot

Iniciar el servicio

Habilita OpenVPN para que inicie automáticamente junto con el sistema.

systemctl enable --now openvpn-server@server

Comprueba que todo haya iniciado correctamente.

systemctl status openvpn-server@server

Si aparece un mensaje similar a:

Initialization Sequence Completed

el servidor ya está listo para aceptar conexiones.

También podemos verificar si levantó la interface de red tun0

ifconfig tun0

o 

ip add show tun0

Configurar un cliente Road Warrior

Tremendo nombre, guerrero del camino… pero sólo es otro gordo que trabaja en informática (si, si soy).
Este modo es el clásico usuario de VPN que se conecta desde cualquier parte para tener acceso a la red Interna de la empresa.

Cada cliente necesita:

  • Un certificado.
  • Su clave privada.
  • El certificado de la CA.
  • La clave tls-crypt.

Lo más cómodo es crear un único archivo con la extensión .ovpn con todos esos elementos adentro.

Creamos un certificado para cada dispositivo que vaya a conectarse.

Por ejemplo:

./easyrsa build-client-full notebook-froman nopass

OJO: NO uses el mismo certificado para varias personas o varios dispositivos. Se puede, pero es una pésima idea. Cada notebook, teléfono o sucursal debe tener un certificado propio. Esto ayuda a la depuración de problemas y la administración del sistema. Si usas el mismo certificado para todos los usuarios, cuando necesites bloquear un usuario, vas a tener que generar un nuevo certificado y cambiarlo en TODOS los usuarios.

Una vez que tengamos todos los certificados vamos a crear el archivo de configuración para el usuario, por ejemplo:

notebook-froman.ovpn
client

dev tun
proto udp

remote vpn.orangebox.cl 1194 #(reemplazar con la IP pública o nombre de tu servidor VPN)

nobind

persist-key
persist-tun

remote-cert-tls server

data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305

auth SHA256

verb 3

<ca>
...
</ca>

<cert>
...
</cert>

<key>
...
</key>

<tls-crypt>
...
</tls-crypt>

Y debes copiar el contenido de cada certificado entre sus respectivas etiquetas.

por ejemplo:

client                                                                                                                                                             
dev tun
proto udp

remote vpn.orangebox.cl 1194 #(reemplazar con la IP pública o nombre de tu servidor VPN)
nobind

persist-key
persist-tun

remote-cert-tls server

data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305

auth SHA256

verb 3

<ca>
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIULsy3OaaF6buOyxvABAFaHQ6E0l8wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjYwMjI2MTgzMDU0WhcNNDYw
MjIxMTgzMDU0WjAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAOsVlh7GLfc/BLVmQ1O9Ch3s7yViDyMX98z/PWCp
L2WAm4cfAOIEx1TEe0/a2SNmxteh5TjzV6F8+mM+WKMb56ewnWb4WRo7E4WQaxf8
y9RuOUn/F46eOFbzRFg2ISfKKIKbUTNHY1rEWW0XfRjliFMVRbq3CXM3HLFgYyI9
ZWuoKzqKo+xPrYDsGThE+XVkFMAju9R+5OM9z0zh933qqWHtXibfCGZkvOu8n8Ns
bUtCZDEm3T61jhuTRPNUT4NyPYcFhXw/FPIayWJg6YNaN2ECAwEAAaOBkDCBjTAM
BgNVHRMEBTADAQH/MB0GA1UdDgQWBBRo9YdyJlO30g98SSryOc6eDX9U8jBRBgNV
HSMESjBIgBRo9YdyJlO30g98SSryOc6eDX9U8qEapBgwFjEUMBIGA1UEAwwLRWFz
eS1SU0EgQ0GCFC7Mtzmmhem7jssbwAQBWh0OhNJfMAsGA1UdDwQEAwIBBjANBgkq
hkiG9w0BAQsFAAOCAQEAtOJLzmnpv9+iaXexsTQXc00C8gDD20TVmoKDjeHfTLa5
si9F/WEv8q2/eB/zKE9Y48n7bmjanqT6TeQMPRX0pPgQZfzEZq/qqC8bnlVXDMr5
9e07J3RFJY0tG6L1UUaQ5d/HOOKZJ4nvT6BLBepl2SpBaqFbRyaOWFbKVEYJRWMW
lSe6fkJIUZWUTO60BjLBI56wlB1DbHYr8KQX3bK5Vzexe4z0bZP+mcAMULVCpoLK
HXt2FapOkmn00tKEEha7HuRZr71BGhdMVT03g/y2f7wsB3KQYSNem8M7hGc3hhQ+
CA83Z2UeVkEUkcLr7TnR91Jwn+iGRwYJQIaKYDJ1wA==
-----END CERTIFICATE-----
</ca>

<cert>
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            05:5d:37:78:cb:5f:86:5c:76:aa:5e:04:a4:97:ef:a1
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Easy-RSA CA
        Validity
            Not Before: Feb 26 18:33:14 2026 GMT
            Not After : Feb 26 18:33:14 2027 GMT
        Subject: CN=narf
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a8:19:ef:46:ef:fa:51:dc:44:9a:cd:bf:89:cf:
                    a9:5b:48:dd:ef:1e:f2:fc:b6:e8:cd:00:6d:fa:d9:
                    c8:70:2b:41:a9:65:95:65:17:23:29:25:2d:8c:22:
                    14:93:34:a1:34:82:f6:18:cd:18:3a:f1:97:c4:3f:
                    7f:60:33:52:a1:21:b7:07:9d:46:01:01:b2:dd:bf:
                    b0:31:5e:c8:ef:2e:84:79:5f:99:ee:07:40:40:74:
                    68:e0:e2:5b:2a:22:cd:8f:58:c6:d6:a3:6e:a8:c3:
                    b2:8e:1d:80:24:16:d7:c8:4f:69:ea:98:35:fb:14:
                    7f:bc:b4:35:d3:da:ff:3d:df:11:29:e2:3a:a4:62:
                    1e:fe:77:a7:90:66:8f:de:89:01:4b:10:a7:94:12:
                    6d:57:08:c4:3f:b7:43:73:1b:9b:7d:2e:bf:a0:15:
                    b8:99:2f:c3:8a:42:8c:e3:d2:62:48:e0:ee:e6:be:
                    ec:b7:23:5a:19:2b:01:67:c8:3e:7e:94:80:7d:c6:
                    4b:c9:1c:e7:90:b8:3d:6b:18:90:01:05:c5:d4:1c:
                    19:c9:34:2c:a2:3d:c6:0f:ec:89:3d:6f:5a:38:e9:
                    0e:b0:6a:7f:e3:e3:93:23:75:15:ce:3d:86:23:4e:
                    4e:fa:4a:db:8d:fa:87:f8:c9:8c:ef:53:be:49:fb:
                    1c:f1
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Subject Key Identifier: 
                9E:77:69:F7:F5:BD:19:8E:E2:B4:1D:2B:08:84:37:92:BA:BA:76:6C
            X509v3 Authority Key Identifier: 
                keyid:68:F5:87:72:26:53:B7:D2:0F:7C:49:2A:F2:39:CE:9E:0D:7F:54:F2
                DirName:/CN=Easy-RSA CA
                serial:2E:CC:B7:39:A6:85:E9:BB:8E:CB:1B:C0:04:01:5A:1D:0E:84:D2:5F
            X509v3 Extended Key Usage: 
                TLS Web Client Authentication
            X509v3 Key Usage: 
                Digital Signature
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        d2:22:a3:e3:86:5b:12:66:75:3d:2d:2b:c3:0b:82:c9:7b:6f:
        3c:37:7e:de:ba:6e:2b:38:b7:fa:bc:89:cc:99:ac:04:c3:ec:
        ce:5d:1b:60:da:b0:43:12:be:be:0c:3b:c6:ea:b0:de:09:f7:
        36:72:8c:97:c3:77:cc:6b:ba:0e:d7:4b:7c:c1:78:52:e4:eb:
        17:52:e8:1f:15:8b:2f:7a:b5:a0:c7:43:4c:5d:e8:a7:f8:53:
        d0:5b:20:e8:96:f8:d3:e7:ec:97:46:36:84:4d:47:7e:83:ad:
        b0:0f:3d:0e:de:f2:18:10:08:f9:f9:5e:d2:7a:1a:3e:30:41:
        5f:5b:ff:c8:d7:7d:ab:e9:b9:1b:81:51:27:d9:ed:c7:6f:5e:
        97:9b:39:12:18:bd:42:94:6e:a4:0f:7f:20:0d:af:f5:18:c2:
        bf:6c:6b:4c:11:a3:27:24:78:0a:6b:b4:85:f1:0f:c8:07:00:
        50:b3:81:a3:b5:35:b3:4f:2e:64:30:94:46:92:d8:85:16:3a:
        07:6d:5a:4d:1c:b7:00:54:c5:a5:a1:a8:f8:cd:4d:45:b0:bd:
        20:57:f5:9c:86:64:05:5d:1c:a9:2b:10:9b:1b:f8:43:fc:30:
        ee:84:c8:e9:2a:3c:11:ca:6c:7b:73:48:c4:1f:f0:d7:9f:c4:
        f0:bd:c7:7e
-----BEGIN CERTIFICATE-----
MIIDUjCCAjqgAwIBAgIQBV03eMtfhlx2ql4EpJfvoTANBgkqhkiG9w0BAQsFADAW
MRQwEgYDVQQDDAtFYXN5LVJTQSBDQTAeFw0yNjAyMjYxODMzMTRaFw0yNzAyMjYx
ODMzMTRaMA8xDTALBgNVBAMMBG5hcmYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCoGe9G7/pR3ESazb+Jz6lbSN3vHvL8tujNAG362chwK0GpZZVlFyMp
dGjg4lsqIs2PWMbWo26ow7KOHYAkFtfIT2nqmDX7FH+8tDXT2v893xEp4jqkYh7+
d6eQZo/eiQFLEKeUEm1XCMQ/t0NzG5t9Lr+gFbiZL8OKQozj0mJI4O7mvuy3I1oZ
KwFnyD5+lIB9xkvJHOeQuD1rGJABBcXUHBnJNCyiPcYP7Ik9b1o46Q6wan/j45Mj
dRXOPYYjTk76StuN+of4yYzvU75J+xzxAgMBAAGjgaIwgZ8wCQYDVR0TBAIwADAd
BgNVHQ4EFgQUnndp9/W9GY7itB0rCIQ3krq6dmwwUQYDVR0jBEowSIAUaPWHciZT
t9IPfEkq8jnOng1/VPKhGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBghQuzLc5
poXpu47LG8AEAVodDoTSXzATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMC
B4AwDQYJKoZIhvcNAQELBQADggEBANIio+OGWxJmdT0tK8MLgsl7bzw3ft66bis4
t/q8icyZrATD7M5dG2DasEMSvr4MO8bqsN4J9zZyjJfDd8xrug7XS3zBeFLk6xdS
6B8Viy96taDHQ0xd6Kf4U9BbIOiW+NPn7JdGNoRNR36DrbAPPQ7e8hgQCPn5XtJ6
Gj4wQV9b/8jXfavpuRuBUSfZ7cdvXpebORIYvUKUbqQPfyANr/UYwr9sa0wRoyck
eAprtIXxD8gHAFCzgaO1NbNPLmQwlEaS2IUWOgdtWk0ctwBUxaWhqPjNTUWwvSBX
9ZyGZAVdHKkrEJsb+EP8MO6EyOkqPBHKbHtzSMQf8NefxPC9x34=
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCoGe9G7/pR3ESa
zb+Jz6lbSN3vHvL8tujNAG362chwK0GpZZVlFyMpJS2MIhSTNKE0gvYYzRg68ZfE
P39gM1KhIbcHnUYBAbLdv7AxXsjvLoR5X5nuB0BAdGjg4lsqIs2PWMbWo26ow7KO
HYAkFtfIT2nqmDX7FH+8tDXT2v893xEp4jqkYh7+d6eQZo/eiQFLEKeUEm1XCMQ/
t0NzG5t9Lr+gFbiZL8OKQozj0mJI4O7mvuy3I1oZKwFnyD5+lIB9xkvJHOeQuD1r
U75J+xzxAgMBAAECggEAFT897qXrakhghX6G/Ki6O7cAkjZDuSx3TV4GCKRZQNA+
2uXjlaTwhUVVNfaiyh5nV8dLysO1kdGygJQUCflCsuobg8Nds0ffL0cIwpy74ftr
tBmgz6Sr+tmb3fzOUAuZFsq+SyfaF0uw+GSDK0yV1pQvC39Up1kmchgHC7GM/GlO
C2o+XboiJtvJqjSW2o6HGPEbNXi2WMn/KjlaXMJmSNig0V8EK/VC/2CJhZ7hptuK
IGYSKt+DcTjAvoU6wfXgqQBfCRMppxIPrnj9eIEHNzeRVuDp3gRIljGQixu46UyL
AlM5Rrdg7RTmqQvMRgB8jQ1rjjMZ3CsUeq3UJyRUdwKBgQDtZrKns+QMTAomre7T
p+kWtsGQsJ0e2ttO5TkCiMCdnfacccNMQOpXbL0ni9oMRVx0QNkuD4bc8hkI6G32
eg/uHuS4Z2WEY529d0av1UpKj/r7lp/wN8X544OMC63XquKt2R7fw651pf9a2289
+Wt57SgwVwhea3Qo+rd6xDbvMwKBgQC1RV0Krlc6vAKWaPkZ1cHYVLtAaB6b1vsR
zWGaJk18JDOW34UTK3YVVI+8lUHdlfQ7O7fFlEJgS7OqbGiorpkqhMzmNVDCzc1K
s8+HVcs4gRCc8JrbhBlNiq45VGxCKfjVG+WbB0M0ETibyFgHu7fDxjmonWvk/zRF
ebFEzlTTSwKBgQDNz2qy2NGrl4B1Z/TUqYz5lBbbSUHtre7SxwZVnBjgjEFv/3BA
e0at5CdYUXYHjVpJrq6Zr/xLL9dkUZyDQe7tkPrYo0rvKy1lRDKT3WU6nvgHhN3D
c5a+vO8eSkG75vn9nW2WsB5fADoQmowmPkVevqtIvSsUMDPUEwdd9x1o4QKBgQCB
5uxPPDLMp3EfQqjIp9ObaNUrybGtsjkIP+ti4XIDtZm21AV0gF/F12yOE1Q5LD3y
uM/walfK1FUzmy7BOyYOP07q5mgywfMNRqBA9u2EV5GFNjNzfk33sJs8AFD4dUWZ
yr0XBPRW+sRbdw4GtLJzPLmTKQTp/S0DYLr1ePt20wKBgESRkFv1l/9SKdDjMAi5
WaW2MO41prEaGeP7uVbWEPqPBIRppGn6w7CVqJzfouX8xI/AnWROltnmLTzrKz6X
hEFl/djlkwUK2ob7ZY30jB7KAzBclSOjzM1vtUdKXd2jUo/poBHsw8R+eiZyarwq
6nS4Y6NBsAth8fTVc+7LFHlo
-----END PRIVATE KEY-----
</key>

<tls-crypt>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
2f8f8468ef8b0c6f24a9ec4c21ffa7ef
4e0b25f5c2dc90b86f34859f47d06f43
b31d0853ae9cdd9eefa4a44fb32c3a18
8ded45e574a979d9a1f682fd1b82c22a
0bbcf7c8f9f2d2faebb3dcf19b76a503
a18a37bccbd9ed13d3001c2631e71aff
ca6787f914fa1452eef85300bd36d948
affebdb03489bc43f1b317da6d593245
05301d8553924fbee8c708e92d035902
40550f900ea527b372382218542532fc
e805a042c9b8516086ae98eaf7038966
a2018812dbd5996282873fc9e417af93
e1b99030de5005fab9cea1ac5614f471
11683a445c0f2c457dcaa644af9c9be1
b52991ed0fd32aaedfeeaccadde5329e
-----END OpenVPN Static key V1-----
</tls-crypt>

El usuario recibirá un único archivo de texto, y debe copiarlo al directorio de su cliente OpenVPN y podrá conectarse sin preocuparse de copiar certificados por separado.

Si el cliente de VPN es linux, pueden copiar el arhivo de configuración que creamos en /etc/openvpn/client/ e iniciar el servicio de OpenVPN (se instala el mismo paquete que para el servidor). Otra opción, si usan Linux con ambiente gráfico, pueden importar el archivo .ovpn desde el panel de control de redes VPN.

Si el cliente de VPN es Windows, el archivo de configuración debe copiarse en el directorio: C:\Program Files\OpenVPN\config\

NOTA: El cliente de windows necesita ejecutarse como administrador para poder agregar las tablas de rutas correspondientes cuando se conecta a la VPN


Split Tunnel o Full Tunnel

Una decisión importante es como vamos a configurar el trafico de datos del cliente desde y hacia internet.

Split Tunnel

En este modo el cliente sólo enviará por la VPN el tráfico destinado a la red corporativa.

Todo lo demás que no tiene ni origen ni destino la red de la empresa, seguirá utilizando su conexión local a Internet.

Es la opción que yo les recomiendo porque reduce el consumo de ancho de banda y evita convertir el servidor VPN en un cuello de botella.

Para que un cliente pueda llegar a una red o a un host a través de la VPN basta con agregar la dirección de red al server.conf:

push "route 192.168.10.0 255.255.255.0"

O si es un host

push "route 192.168.90.7 255.255.255.255"

Puedes poner tantas redes o hosts como necesites, el único requisito es que el servidor de VPN debe poder llegar sin problema a esas redes que quieres permitir.

Full Tunnel

Usa este modo si quieres que todo el tráfico del cliente pase por la VPN.

Para activarlo agrega esto al server.conf:

push "redirect-gateway def1 bypass-dhcp"

En este caso el servidor VPN pasa a ser la puerta de enlace predeterminada del cliente y TODO el trafico del cliente va a pasar por la VPN, repito TODO EL TRAFICO, esto significa que si alguien trabaja remoto usando la VPN y al mismo tiempo pone música en su notebook, esa música se va a descargar desde la red de la empresa, si el usuario ve porn un video tutorial, ese video también va a consumir ancho de banda de la red de la empresa.

Tiene sentido cuando administras equipos corporativos y tienes filtros y quieres que toda la navegación pase por la infraestructura de la empresa.

Pero si el objetivo es únicamente acceder a servidores o equipos internos, normalmente Split Tunnel es una mejor elección.

VPN Sitio a Sitio

El modo Road Warrior conecta usuarios.

El modo Sitio a Sitio (ó Lan-to-Lan ó Site-to-Site) conecta redes.

El objetivo es que una sucursal pueda acceder a los recursos de la casa matriz como si existiera un enlace privado entre ambas. (como un MPLS)

Ejemplo:

Casa Matriz tiene la red interna 192.168.10.0/24 y la Sucursal SUR la red interna 192.168.20.0/24

Para este escenario cada extremo de la VPN debe tener su propio certificado. (bueno, el server en la casa Matriz ya tiene sus certificados, sólo nos falta el de la sucursal)

creamos el certificado para la sucursal Sur.

./easyrsa build-client-full sucursal-sur nopass

Si, se crea exactamente igual que el certificado de un usuario normal, la diferencia está en como vamos a agregar las rutas de red que hay detrás de ese cliente.


Habilitar el soporte para rutas de clientes

Primero habilita el directorio de configuración personalizada por cliente.

Editar:

vim /etc/openvpn/server/server.conf

Agregar:

client-config-dir ccd

Crear el directorio:

mkdir /etc/openvpn/server/ccd

Crear el cliente de la sucursal

Generar el certificado:

cd /etc/openvpn/easy-rsa

./easyrsa build-client-full sucursal-sur nopass

El nombre aquí es importante, debe ser exactamente igual a como se creó el certificado.

OpenVPN identificará a este cliente mediante el Common Name del certificado.

En este caso:

sucursal-sur

Declarar las redes detrás del cliente

Crear el archivo:

vim /etc/openvpn/server/ccd/sucursal-sur

Contenido:

iroute 192.168.20.0 255.255.255.0

Esta línea le dice a OpenVPN:

La red 192.168.20.0/24 está detrás de este cliente.

Pero todavía falta una parte.


Agregar la ruta en el servidor

En server.conf agrega:

route 192.168.20.0 255.255.255.0

La diferencia entre ambas instrucciones puede ser un poco confusa, suena redundante, pero es muy sencillo.

route modifica el routing del servidor, para saber como llegar a esa red.

iroute le indica a OpenVPN qué esta red está detrás de ese cliente.

Necesitas ambas, así, cuando se conecte el cliente sucursal-sur, el servidor creará la tabla de ruta necesaria para llegar a la red de sucursal-sur usando como gateway la IP que el cliente sucursal-sur obtuvo cuando se conectó a la VPN.


Informar la red de la casa matriz

Ahora el cliente de la sucursal necesita saber cómo llegar a la red principal, para eso el servidor VPN debe enviar esa ruta que acabamos de configurar a sus clientes.

En el servidor agrega:

push "route 192.168.20.0 255.255.255.0"

Cuando la sucursal se conecte, OpenVPN instalará automáticamente esa ruta.


Reiniciar OpenVPN

Aplicar los cambios:

systemctl restart openvpn-server@server

¿Cuándo usar NAT?

A veces no tienes acceso al router remoto.

Por ejemplo:

  • una sucursal administrada por terceros;
  • un laboratorio;
  • una red doméstica.

En esos casos puedes hacer NAT desde el servidor VPN.

Ejemplo:

firewall-cmd --permanent \
--add-masquerade

firewall-cmd --reload

Pero úsalo como último recurso.

Con NAT pierdes visibilidad y la administración se vuelve menos transparente.


Varias sucursales

El diseño escala de la misma forma:

Casa Matriz

192.168.10.0/24


Sucursal Norte

192.168.30.0/24


Sucursal Sur

192.168.20.0/24


Datacenter

192.168.40.0/24

Cada una tendrá:

  • certificado propio;
  • archivo CCD propio;
  • ruta propia;
  • permisos definidos.

Si una sucursal desaparece del mapa, revocas únicamente su certificado.

El resto sigue funcionando.

Eso es todo, ya tenemos las sucursales y usuarios conectados!.

**¡Ojo! OpenVPN sólo establece el túnel; no controla por sí solo a qué recursos de la red puede acceder cada usuario. De forma predeterminada, un cliente autenticado podrá alcanzar las redes que el servidor le publique mediante las rutas configuradas.

En muchos casos esto no es suficiente por temas de seguridad y es habitual necesitar que algunos usuarios sólo puedan acceder a determinados servidores o segmentos de red, mientras que otros tengan permisos más amplios.

Para implementar ese tipo de restricciones puedes utilizar mecanismos como learn-address, integrarlo con el firewall o aplicar políticas de acceso más específicas. Ese tema merece una guía aparte, así que lo dejaremos para un próximo artículo para no extender demasiado este.**


Revocar accesos

Una VPN bien implementada debe permitir retirar accesos rápidamente.

Si un equipo se pierde o es robado o si alguien con accesos delicados es desvinculado, tenermos que revocar su acceso a la VPN.

cd /etc/openvpn/easy-rsa

./easyrsa revoke notebook-froman

./easyrsa gen-crl

NOTA: no es necesario copiar el crl.pem generado, ya que en el server.conf apuntamos el CRL directo al lugar donde se crea con easy-rsa

Reiniciar:

systemctl restart openvpn-server@server

El certificado queda inutilizado inmediatamente.

No necesitas cambiar claves.

No necesitas recrear la VPN.

No necesitas avisar a todos los usuarios.

Hardening y operación

Tener una VPN funcionando no significa necesariamente tener una VPN bien implementada.

OpenVPN es un servicio expuesto directamente a Internet, por lo que algunas buenas prácticas son obligatorias.


Mantener certificados separados

Cada usuario y cada dispositivo debe tener su propio certificado.

Evita:

  • certificados compartidos;
  • usuarios genéricos;
  • claves privadas copiadas entre equipos.

Un certificado individual permite:

  • identificar quién está conectado;
  • revocar accesos específicos;
  • mantener una auditoría correcta.

No habilitar compresión

Si encuentras configuraciones antiguas con:

compress

o:

comp-lzo

elimínalas.

La compresión en VPN no debe ser usada!, es una falla de seguridad conocida como VORACLE.

VORACLE: es un fallo de seguridad que permite a un atacante robar datos de una conexión VPN que usa compresión, observando cómo cambia el tamaño de los paquetes para adivinar su contenido.

Actualmente los algoritmos modernos de cifrado entregan muy buen rendimiento sin necesidad de comprimir tráfico.


Respaldar la PKI

La carpeta:

/etc/openvpn/easy-rsa/pki

es crítica.

Ahí se encuentra:

  • la Autoridad Certificadora;
  • certificados emitidos;
  • claves privadas;
  • información necesaria para revocar accesos.

Si pierdes la CA privada no podrás emitir nuevos certificados ni administrar correctamente la infraestructura.

Realiza respaldos periódicos y almacénalos fuera del servidor VPN.


Revisar logs

Cuando algo falle, el primer lugar donde mirar es el propio servidor.

journalctl -u openvpn-server@server

Para seguimiento en tiempo real:

journalctl -u openvpn-server@server -f

Algunos problemas habituales:

Problema Causa frecuente
Cliente no conecta Firewall, DNS o certificado
Conecta pero no accede a redes internas Rutas o firewall
Una sede ve a otra pero no responde Gateway incorrecto
Usuarios pierden conexión MTU o problemas de red
Certificado rechazado CRL o fecha incorrecta

Actualizaciones

Como cualquier servicio expuesto a Internet, OpenVPN debe mantenerse actualizado.

Revisa periódicamente:

dnf update

Además de OpenVPN, mantén actualizado:

  • kernel;
  • OpenSSL;
  • firewalld;
  • paquetes del sistema.

Conclusión

OpenVPN no es una tecnología nueva.

Y justamente esa es una de sus mayores fortalezas.

Lleva años siendo utilizado en ambientes donde la estabilidad, la compatibilidad y el control de acceso importan más que seguir la última moda.

La diferencia entre una VPN funcionando y una VPN bien implementada está en los detalles:

  • no compartir certificados;
  • no desactivar controles de seguridad;
  • no copiar configuraciones antiguas;
  • entender qué hace cada parámetro.

Porque instalar una VPN es relativamente fácil.

Administrarla correctamente durante años es donde está el trabajo real.


¿Necesitas ayuda con tu infraestructura?

Implementar una VPN es sólo una parte de mantener una plataforma segura.

Después vienen las actualizaciones, monitoreo, hardening, administración de certificados, revisión de accesos y operación diaria.

En OrangeBox ayudamos a empresas a implementar y administrar infraestructura Linux empresarial, incluyendo:

  • Red Hat Enterprise Linux;
  • AlmaLinux y Rocky Linux;
  • OpenVPN;
  • Wazuh;
  • Zabbix;
  • VMware;
  • seguridad y continuidad operacional.

Si necesitas apoyo para implementar una solución nueva o tomar el control de una infraestructura existente, revisa nuestros servicios administrados:

https://www.orangebox.cl/servicios/administracion-linux/#planes