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 ufw si 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ísticaOpenVPNWireGuard
ProtocoloTLS sobre UDP/TCPSolo UDP (protocolo WireGuard)
Flexibilidad de puertosUDP 1194 o TCP 443Solo UDP (predeterminado 51820)
Soporte de clientesTodas las plataformas + dispositivos heredadosPlataformas modernas (Linux 5.6+, iOS, Android, Windows)
Complejidad de configuraciónAlta (PKI, múltiples archivos)Baja (par de claves, configuración única)
RendimientoBuenoExcelente (espacio del kernel)
Traversal de firewallExcelente (modo TCP 443)Limitado (solo UDP)
Historial de auditoríasExtenso (desde 2001)Reducido, verificado formalmente
Soporte sitio a sitioNativoNativo
IPs dinámicasMediante el flag --floatRoaming automático
Ideal paraAmplia compatibilidad, clientes heredados, redes solo TCPAlto 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 openvpn y easy-rsa, luego inicializa una PKI con una CA, certificado del servidor, parámetros DH y ta.key
  • Escribe server.conf con el cifrado AES-256-GCM, refuerzo de autenticación TLS y la subred VPN 10.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 .ovpn autocontenidos 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.log y usa journalctl para diagnósticos a nivel de servicio

Artículos Relacionados