Configurar un servidor OpenVPN en Ubuntu te proporciona una solución VPN probada y robusta respaldada por una PKI madura — ideal para trabajadores remotos, enlaces entre sitios y para asegurar el tráfico en redes no confiables. Esta guía te lleva paso a paso por todo el proceso: construir una autoridad de certificación con Easy-RSA, escribir un server.conf listo para producción, generar perfiles .ovpn para clientes, configurar reglas de firewall UFW y habilitar el NAT masquerade para que los clientes VPN accedan a internet.
Requisitos Previos
- Servidor Ubuntu 22.04 LTS o 24.04 LTS con una dirección IP pública
- Acceso con sudo o root
- Un nombre de dominio o IP estática apuntando a tu servidor (recomendado)
- Familiaridad básica con la línea de comandos de Linux
- UFW instalado (predeterminado en Ubuntu; instala con
sudo apt install ufwsi no está presente)
Instalación de OpenVPN y Easy-RSA
Comienza actualizando la lista de paquetes e instalando tanto OpenVPN como el kit de herramientas Easy-RSA:
sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y
Copia el directorio de plantillas de Easy-RSA a una ubicación persistente dentro del directorio de OpenVPN:
sudo mkdir -p /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
Construir la PKI con Easy-RSA
Una PKI de OpenVPN completa consta de una Autoridad de Certificación (CA), un par certificado/clave del servidor, parámetros Diffie-Hellman y una clave HMAC para la autenticación TLS.
Inicializar la PKI y crear la CA
sudo ./easyrsa init-pki
sudo ./easyrsa build-ca nopass
Acepta el nombre común predeterminado (Easy-RSA CA) o define el tuyo propio. El flag nopass omite la contraseña de la CA — aceptable para servidores automatizados, pero agrega una frase de contraseña en entornos de alta seguridad.
Generar el certificado del servidor
sudo ./easyrsa gen-req server nopass
sudo ./easyrsa sign-req server server
Escribe yes para confirmar la firma. Esto produce pki/issued/server.crt y pki/private/server.key.
Generar los parámetros Diffie-Hellman y la clave TLS auth
La generación de los parámetros DH tarda varios minutos:
sudo ./easyrsa gen-dh
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
Copia todas las claves requeridas al directorio del servidor OpenVPN:
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key \
pki/dh.pem pki/ta.key /etc/openvpn/server/
Escribir server.conf
Crea /etc/openvpn/server/server.conf con la siguiente configuración:
# /etc/openvpn/server/server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
# Subred VPN — los clientes reciben direcciones de este pool
server 10.8.0.0 255.255.255.0
# Enviar ruta predeterminada (todo el tráfico del cliente a través de la VPN)
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
# Refuerzo TLS
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun
# Registro
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
Crea el directorio de registro e inicia el servicio:
sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server
Reglas de Firewall y Enrutamiento NAT
Habilitar el reenvío IP
Edita /etc/sysctl.conf y descomenta (o agrega) la siguiente línea:
net.ipv4.ip_forward=1
Aplica el cambio inmediatamente sin reiniciar:
sudo sysctl -p
Agregar reglas NAT masquerade a UFW
Encuentra tu interfaz de red pública (comúnmente eth0 o ens3):
ip route | grep default
Edita /etc/ufw/before.rules e inserta el siguiente bloque antes de la sección *filter:
# OpenVPN NAT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
Reemplaza eth0 con el nombre real de tu interfaz.
A continuación, permite el reenvío de paquetes en /etc/default/ufw:
DEFAULT_FORWARD_POLICY="ACCEPT"
Abre el puerto de OpenVPN y recarga UFW:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw reload
Generar Certificados de Cliente y Archivos .ovpn
Crear un certificado de cliente
cd /etc/openvpn/easy-rsa
sudo ./easyrsa gen-req client1 nopass
sudo ./easyrsa sign-req client client1
Construir el archivo client1.ovpn
Un archivo .ovpn autocontenido incrusta todos los certificados de forma inline para que el usuario necesite solo un archivo. Crea /root/clients/client1.ovpn:
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
<ca>
# pega el contenido de /etc/openvpn/server/ca.crt aquí
</ca>
<cert>
# pega el contenido de /etc/openvpn/easy-rsa/pki/issued/client1.crt aquí
</cert>
<key>
# pega el contenido de /etc/openvpn/easy-rsa/pki/private/client1.key aquí
</key>
<tls-auth>
# pega el contenido de /etc/openvpn/server/ta.key aquí
</tls-auth>
Puedes automatizar la incrustación con un script de shell:
#!/bin/bash
# gen-client.sh
CLIENT=$1
OVPN_DIR=/root/clients
KEYS=/etc/openvpn/easy-rsa/pki
cat > "$OVPN_DIR/$CLIENT.ovpn" <<EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
<ca>
$(cat "$KEYS/ca.crt")
</ca>
<cert>
$(openssl x509 -in "$KEYS/issued/$CLIENT.crt")
</cert>
<key>
$(cat "$KEYS/private/$CLIENT.key")
</key>
<tls-auth>
$(cat /etc/openvpn/server/ta.key)
</tls-auth>
EOF
echo "Generado $OVPN_DIR/$CLIENT.ovpn"
Uso: sudo bash gen-client.sh client1
Comparación OpenVPN vs WireGuard
| Característica | OpenVPN | WireGuard |
|---|---|---|
| Protocolo | TLS sobre UDP/TCP | Solo UDP (protocolo WireGuard) |
| Flexibilidad de puertos | UDP 1194 o TCP 443 | Solo UDP (predeterminado 51820) |
| Soporte de clientes | Todas las plataformas + dispositivos heredados | Plataformas modernas (Linux 5.6+, iOS, Android, Windows) |
| Complejidad de configuración | Alta (PKI, múltiples archivos) | Baja (par de claves, configuración única) |
| Rendimiento | Bueno | Excelente (espacio del kernel) |
| Traversal de firewall | Excelente (modo TCP 443) | Limitado (solo UDP) |
| Historial de auditorías | Extenso (desde 2001) | Reducido, verificado formalmente |
| Soporte sitio a sitio | Nativo | Nativo |
| IPs dinámicas | Mediante el flag --float | Roaming automático |
| Ideal para | Amplia compatibilidad, clientes heredados, redes solo TCP | Alto rendimiento, despliegues modernos, simplicidad |
Recomendación: Elige WireGuard para nuevos despliegues donde todos los clientes ejecuten sistemas operativos modernos. Elige OpenVPN cuando debas soportar Windows 7/8, versiones antiguas de iOS, o redes que bloqueen UDP por completo.
Escenario Real
Gestionas un pequeño equipo de desarrollo de software donde tres desarrolladores remotos acceden a una instancia interna de GitLab y a un servidor de base de datos de staging. Tu servidor GitLab se encuentra en 192.168.10.10 dentro de tu red de oficina, detrás de un firewall que solo expone SSH y HTTPS a internet.
Después de configurar OpenVPN con los pasos anteriores, cada desarrollador ejecuta su perfil dev-nombre.ovpn en el cliente OpenVPN. Una vez conectado, su estación de trabajo recibe una dirección en el rango 10.8.0.0/24. Agrega una ruta estática en el servidor OpenVPN para enviar 192.168.10.0/24 a los clientes:
push "route 192.168.10.0 255.255.255.0"
Ahora los desarrolladores acceden a 192.168.10.10 directamente a través del túnel cifrado sin exponer GitLab a internet público. Revocas el acceso al instante ejecutando ./easyrsa revoke dev-nombre seguido de ./easyrsa gen-crl, y luego agregando crl-verify /etc/openvpn/server/crl.pem a server.conf — sin necesidad de cambiar contraseñas.
Errores Comunes y Casos Especiales
Conflictos de enrutamiento con 10.8.0.0/24: Si tu LAN ya usa esta subred, cambia la directiva server a un rango sin usar como 10.9.0.0 255.255.255.0 y actualiza la regla NAT masquerade en consecuencia.
Split tunneling vs túnel completo: La directiva push redirect-gateway def1 enruta todo el tráfico del cliente a través de la VPN. Para split tunneling (solo subredes específicas), elimina esa línea y envía rutas explícitas en su lugar.
Modo TCP para firewalls restrictivos: Si UDP 1194 está bloqueado, cambia proto udp a proto tcp y port 1194 a port 443 tanto en la configuración del servidor como del cliente. El rendimiento será menor debido a la ineficiencia de TCP sobre TCP, pero la traversal mejora considerablemente.
Revocación de certificados: Siempre genera y sirve una CRL al revocar clientes. Sin crl-verify en server.conf, los certificados revocados seguirán funcionando.
Fragmentación MTU: Si los clientes experimentan rendimiento lento o paquetes perdidos, agrega tun-mtu 1400 y mssfix 1360 a server.conf.
Asignaciones de IP persistentes: Usa un client-config-dir (CCD) con directivas ifconfig-push por cliente para asignar la misma IP cada vez que un cliente se conecte.
Solución de Problemas
El servicio no inicia: Ejecuta sudo journalctl -u openvpn-server@server -e para leer el registro completo. Las causas más comunes son rutas de archivos incorrectas en server.conf o una dirección ta.key incorrecta.
Los clientes se conectan pero no pueden acceder a internet: Confirma que el reenvío IP esté activo (cat /proc/sys/net/ipv4/ip_forward debe devolver 1), que la regla MASQUERADE esté presente (sudo iptables -t nat -L) y que DEFAULT_FORWARD_POLICY=ACCEPT esté configurado en /etc/default/ufw.
Fallo en el handshake TLS: Asegúrate de que el valor de key-direction coincida: 0 en el servidor, 1 en el cliente (o usa tls-crypt en lugar de tls-auth, que es independiente de la dirección).
Fugas de DNS: Verifica que las directivas push dhcp-option DNS sean recibidas por el cliente con openvpn --show-status client.log. Usa dnsleak.com para confirmar que las consultas DNS salgan a través de la VPN.
Certificado de cliente caducado: Easy-RSA genera certificados de cliente con validez de 825 días por defecto. Regenera antes del vencimiento con ./easyrsa renew client1 nopass y redistribuye el archivo .ovpn actualizado.
Resumen
- Instala
openvpnyeasy-rsa, luego inicializa una PKI con una CA, certificado del servidor, parámetros DH yta.key - Escribe
server.confcon el cifrado AES-256-GCM, refuerzo de autenticación TLS y la subred VPN10.8.0.0/24 - Habilita el reenvío IP y agrega una regla UFW MASQUERADE para que los clientes VPN puedan acceder a internet
- Usa un script de shell para incrustar certificados de forma inline en perfiles
.ovpnautocontenidos para los clientes - OpenVPN es la elección correcta para clientes heredados y traversal de firewalls solo TCP; WireGuard gana en rendimiento y simplicidad para despliegues modernos
- Revoca clientes al instante mediante la CRL de Easy-RSA sin necesidad de restablecer secretos compartidos
- Monitoriza
/var/log/openvpn/openvpn.logy usajournalctlpara diagnósticos a nivel de servicio