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