Instalar una VPN en un VPS Linux: WireGuard vs OpenVPN
Convertir un VPS (servidor privado virtual) en una VPN (red privada virtual) permite proteger una conexión desde una red pública, acceder a servicios internos sin exponerlos a todo Internet, o hacer que el tráfico salga desde la IP dedicada de tu servidor. La VPN cifra la conexión entre tus dispositivos y el VPS, pero no te hace anónimo: el tráfico accede después a Internet desde la dirección IP del servidor.
En esta guía veremos dos opciones simples. WireGuard es la opción moderna: ligera, rápida, integrada en las versiones recientes del núcleo de Linux y muy cómoda para el uso diario. OpenVPN es la referencia histórica: algo más pesada, pero muy flexible, especialmente si necesitas TCP o un puerto común como 443.
¿Qué VPN elegir para tu VPS?
Para una instalación nueva, lo normal es empezar por WireGuard. La configuración es más corta, el rendimiento es excelente y los clientes para Windows y Linux son fáciles de usar.
Elige OpenVPN si tienes una necesidad concreta de compatibilidad: una red muy filtrada, obligación de usar TCP, un puerto impuesto, clientes ya desplegados en una organización, o una infraestructura que ya depende de OpenVPN.
En la práctica:
- WireGuard es recomendable para una VPN privada rápida y moderna.
- OpenVPN es recomendable cuando la compatibilidad de red es más importante que la simplicidad.
- Evita instalar los dos en el mismo VPS si no necesitas ambos.
Requisitos
Antes de empezar, necesitas:
- un VPS Linux con acceso root o sudo.
- Ubuntu 24.04 o una versión reciente de Debian.
- una dirección IPv4 pública o un nombre de dominio apuntando al VPS.
- acceso al firewall del servidor y, si tu proveedor lo ofrece, al firewall de red externo.
- una sesión SSH funcional antes de cambiar cualquier regla de firewall.
Los ejemplos siguientes usan 203.0.113.10 como dirección IP de documentación. Sustitúyela por la dirección pública real de tu VPS.
Los perfiles siguientes solo enrutan el tráfico IPv4. Si tu dispositivo utiliza IPv6, configúralo también en la VPN o desactívalo en esa conexión para evitar que el tráfico eluda el túnel.
Preparar el servidor
Conéctate al VPS por SSH. Comprueba que su reloj esté sincronizado, ya que los certificados de OpenVPN dependen de una fecha correcta. Después, activa el reenvío IPv4, indispensable para que el VPS transmita el tráfico de la VPN hacia Internet:
timedatectl status
sudo tee /etc/sysctl.d/99-vpn-forward.conf > /dev/null <<'EOF'
net.ipv4.ip_forward=1
EOF
sudo sysctl -p /etc/sysctl.d/99-vpn-forward.conf
El último comando debe mostrar net.ipv4.ip_forward = 1. A continuación, elige la VPN que quieras instalar y sigue únicamente la sección correspondiente. Los comandos utilizan los paquetes de Ubuntu 24.04 y de las versiones recientes de Debian. No se descarga ningún script de instalación remoto.
Instalar WireGuard
Instala WireGuard y los comandos de enrutamiento utilizados por la configuración:
sudo apt update
sudo apt install -y wireguard iptables
Crea un par de claves para el servidor y otro para el primer ordenador cliente, llamado client en este ejemplo:
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/client.key'
sudo sh -c 'wg pubkey < /etc/wireguard/client.key > /etc/wireguard/client.pub'
Crea la interfaz wg0. Las reglas PostUp y PostDown solo permiten reenviar el tráfico de la VPN y aplicar NAT mediante la interfaz de red principal. No modifican las reglas de entrada ni el acceso SSH.
WAN_IF=$(ip route show default | awk '{print $5; exit}')
CLIENT_PUBLIC_KEY=$(sudo cat /etc/wireguard/client.pub)
sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PostUp = wg set %i private-key /etc/wireguard/server.key
PostUp = iptables -I FORWARD 1 -i %i -o $WAN_IF -j ACCEPT; iptables -I FORWARD 1 -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE
PostDown = iptables -C FORWARD -i %i -o $WAN_IF -j ACCEPT 2>/dev/null && iptables -D FORWARD -i %i -o $WAN_IF -j ACCEPT || true; iptables -C FORWARD -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null && iptables -D FORWARD -i $WAN_IF -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT || true; iptables -t nat -C POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE 2>/dev/null && iptables -t nat -D POSTROUTING -s 10.66.66.0/24 -o $WAN_IF -j MASQUERADE || true
[Peer]
PublicKey = $CLIENT_PUBLIC_KEY
AllowedIPs = 10.66.66.2/32
EOF
sudo chmod 600 /etc/wireguard/wg0.conf
Inicia WireGuard y configura su arranque automático con el VPS:
sudo systemctl enable --now wg-quick@wg0
Crea el perfil del cliente Windows o Linux. El comando solicita la dirección IP pública o el nombre DNS del VPS para que no quede ningún valor de ejemplo en el archivo:
SERVER_PUBLIC_KEY=$(sudo cat /etc/wireguard/server.pub)
CLIENT_PRIVATE_KEY=$(sudo cat /etc/wireguard/client.key)
read -rp "Dirección IP pública o nombre DNS del VPS: " VPN_ENDPOINT
install -m 600 /dev/null "$HOME/client.conf"
tee "$HOME/client.conf" > /dev/null <<EOF
[Interface]
PrivateKey = $CLIENT_PRIVATE_KEY
Address = 10.66.66.2/32
DNS = 1.1.1.1, 1.0.0.1
[Peer]
PublicKey = $SERVER_PUBLIC_KEY
Endpoint = $VPN_ENDPOINT:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
unset CLIENT_PRIVATE_KEY
El perfil client.conf se encuentra ahora en tu directorio personal. Desde tu ordenador Windows o Linux, recupéralo por SSH e impórtalo en la aplicación WireGuard:
scp [email protected]:client.conf .
Ejecuta el comando scp desde tu ordenador. Sustituye usuario por tu cuenta SSH y 203.0.113.10 por la dirección del VPS.
En un cliente Ubuntu o Debian sin interfaz gráfica, instala también resolvconf para que wg-quick aplique la línea DNS del perfil:
sudo apt install wireguard resolvconf
sudo install -m 600 client.conf /etc/wireguard/client.conf
sudo wg-quick up client
Después de importar el perfil y guardar una copia de seguridad cifrada, elimina del VPS la clave privada del cliente y las copias del perfil:
sudo rm -f /etc/wireguard/client.key
rm -f "$HOME/client.conf"
Si tu proveedor aplica un firewall de red externo, permite 51820/udp hacia el VPS. Si UFW ya se utiliza localmente, comprueba su estado y añade el puerto:
sudo ufw status verbose
sudo ufw allow 51820/udp
Si UFW está inactivo, no lo actives automáticamente solo para seguir esta guía. Si decides activarlo, permite primero el puerto SSH que utilizas realmente. Con una política iptables existente, el equivalente temporal es:
sudo iptables -C INPUT -p udp --dport 51820 -j ACCEPT 2>/dev/null || sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT
Haz persistente esta regla mediante el mecanismo que ya utiliza tu servidor y no mezcles varios gestores de firewall.
Un ufw reload o un reinicio de las reglas puede eliminar las reglas directas de reenvío y NAT. En ese caso, reinicia wg-quick@wg0 para volver a aplicarlas.
Cuando el cliente esté conectado, comprueba el servicio y el último handshake:
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show
sudo sysctl net.ipv4.ip_forward
El peer client debe mostrar un handshake reciente. Desde el ordenador conectado, la dirección IP pública debe coincidir con la del VPS.
Crea siempre un nuevo par de claves y una nueva dirección, por ejemplo 10.66.66.3/32, para cada dispositivo adicional. Para revocar un dispositivo, elimina su bloque [Peer] de /etc/wireguard/wg0.conf y recarga la configuración con sudo systemctl restart wg-quick@wg0. Los demás dispositivos pueden tardar unos segundos en volver a conectarse después de este reinicio.
Instalar OpenVPN
Instala OpenVPN y Easy-RSA y prepara la autoridad de certificación, el certificado del servidor y el del primer cliente:
sudo apt update
sudo apt install -y openvpn easy-rsa iptables
getent group openvpn > /dev/null || sudo groupadd --system openvpn
getent passwd openvpn > /dev/null || sudo useradd --system --gid openvpn --home-dir /nonexistent --shell /usr/sbin/nologin openvpn
sudo install -d -o root -g openvpn -m 750 /etc/openvpn/server
sudo make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
sudo ./easyrsa init-pki
sudo env EASYRSA_REQ_CN=Private-VPN-CA ./easyrsa build-ca
sudo ./easyrsa build-server-full server nopass
sudo ./easyrsa build-client-full client nopass
sudo env EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
sudo openvpn --genkey tls-crypt /etc/openvpn/server/tc.key
sudo install -m 600 pki/ca.crt pki/private/server.key /etc/openvpn/server/
sudo install -m 644 pki/issued/server.crt /etc/openvpn/server/
sudo install -o root -g openvpn -m 640 pki/crl.pem /etc/openvpn/server/crl.pem
sudo chmod 600 /etc/openvpn/server/tc.key
Easy-RSA solicita una frase secreta para proteger la clave privada de la autoridad de certificación. Consérvala: será necesaria para crear o revocar perfiles. Las claves del servidor y del cliente permanecen sin frase secreta para que el servicio y la aplicación puedan iniciarse automáticamente. Por tanto, el archivo .ovpn debe protegerse como una clave privada.
La cuenta de sistema dedicada openvpn limita los privilegios del servicio. La lista de revocación sigue siendo legible para esta cuenta, a diferencia de las claves privadas. Su validez se fija en diez años para evitar la expiración predeterminada después de 180 días, que impediría las nuevas conexiones. Regenérala antes de esa fecha y después de cada revocación.
Easy-RSA 3.1.7 genera por defecto los certificados del servidor y del cliente con una validez de 825 días. Comprueba y anota sus fechas de expiración durante la instalación:
sudo openssl x509 -in /etc/openvpn/server/server.crt -noout -enddate
sudo openssl x509 -in /etc/openvpn/easy-rsa/pki/issued/client.crt -noout -enddate
Planifica su renovación antes de esa fecha: una CRL que todavía sea válida no prolonga un certificado expirado.
Añade un script local que solo gestione el enrutamiento y el NAT de OpenVPN. systemd lo ejecutará con los permisos necesarios al iniciar y detener el servicio:
sudo tee /etc/openvpn/server/network.sh > /dev/null <<'EOF'
#!/bin/sh
WAN_IF=$(ip route show default | awk '{print $5; exit}')
DEV=tun0
case "$1" in
up)
iptables -C FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT 2>/dev/null || iptables -I FORWARD 1 -i "$DEV" -o "$WAN_IF" -j ACCEPT
iptables -C FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || iptables -I FORWARD 1 -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -C POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE 2>/dev/null || iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE
;;
down)
iptables -C FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT 2>/dev/null && iptables -D FORWARD -i "$DEV" -o "$WAN_IF" -j ACCEPT || true
iptables -C FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 2>/dev/null && iptables -D FORWARD -i "$WAN_IF" -o "$DEV" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT || true
iptables -t nat -C POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE 2>/dev/null && iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o "$WAN_IF" -j MASQUERADE || true
;;
*)
exit 2
;;
esac
EOF
sudo chmod 700 /etc/openvpn/server/network.sh
Crea la configuración del servidor en 1194/udp:
sudo tee /etc/openvpn/server/server.conf > /dev/null <<'EOF'
port 1194
proto udp4
dev tun0
ca ca.crt
cert server.crt
key server.key
dh none
tls-crypt tc.key
crl-verify /etc/openvpn/server/crl.pem
server 10.8.0.0 255.255.255.0
topology subnet
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
keepalive 10 120
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
tls-version-min 1.2
user openvpn
group openvpn
persist-key
persist-tun
explicit-exit-notify 1
verb 3
EOF
sudo install -d /etc/systemd/system/[email protected]
sudo tee /etc/systemd/system/[email protected]/firewall.conf > /dev/null <<'EOF'
[Service]
ExecStartPost=/etc/openvpn/server/network.sh up
ExecStopPost=/etc/openvpn/server/network.sh down
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now openvpn-server@server
Por último, crea el perfil autónomo client.ovpn en tu directorio personal:
cd /etc/openvpn/easy-rsa
read -rp "Dirección IP pública o nombre DNS del VPS: " VPN_ENDPOINT
CA_CERT=$(sudo cat pki/ca.crt)
CLIENT_CERT=$(sudo sed -ne '/BEGIN CERTIFICATE/,$ p' pki/issued/client.crt)
CLIENT_KEY=$(sudo cat pki/private/client.key)
TLS_CRYPT_KEY=$(sudo cat /etc/openvpn/server/tc.key)
install -m 600 /dev/null "$HOME/client.ovpn"
tee "$HOME/client.ovpn" > /dev/null <<EOF
client
dev tun
proto udp4
remote $VPN_ENDPOINT 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server name
tls-version-min 1.2
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
verb 3
<ca>
$CA_CERT
</ca>
<cert>
$CLIENT_CERT
</cert>
<key>
$CLIENT_KEY
</key>
<tls-crypt>
$TLS_CRYPT_KEY
</tls-crypt>
EOF
unset CLIENT_KEY TLS_CRYPT_KEY
Copia este archivo en tu ordenador. En Windows o Linux, impórtalo en OpenVPN Connect mediante la opción de importación desde un archivo.
scp [email protected]:client.ovpn .
Ejecuta el comando scp desde tu ordenador. Sustituye usuario por tu cuenta SSH y 203.0.113.10 por la dirección del VPS.
Después de importar el perfil y guardar una copia de seguridad cifrada, elimina del VPS la clave privada del cliente y las copias del perfil. El certificado público permanece en la PKI para poder revocarlo:
sudo rm -f /etc/openvpn/easy-rsa/pki/private/client.key /etc/openvpn/easy-rsa/pki/inline/client.inline
rm -f "$HOME/client.ovpn"
Si tu proveedor aplica un firewall de red externo, permite 1194/udp. Si UFW ya se utiliza, comprueba su estado y añade el puerto:
sudo ufw status verbose
sudo ufw allow 1194/udp
Si UFW está inactivo, no lo actives automáticamente solo para seguir esta guía. Con una política iptables existente, el equivalente temporal es:
sudo iptables -C INPUT -p udp --dport 1194 -j ACCEPT 2>/dev/null || sudo iptables -I INPUT -p udp --dport 1194 -j ACCEPT
Haz persistente esta regla mediante el mecanismo que ya utiliza tu servidor.
Un ufw reload o un reinicio de las reglas puede eliminar las reglas directas de reenvío y NAT. En ese caso, reinicia openvpn-server@server para volver a aplicarlas.
Esta configuración utiliza 1194/udp, el modo recomendado. Si una red bloquea UDP y realmente necesitas TCP en el puerto 443, comprueba primero que ningún servidor web ocupe ese puerto. Sustituye después port 1194 por port 443 y proto udp4 por proto tcp-server en el servidor. En el perfil cliente, sustituye proto udp4 por proto tcp-client, utiliza remote $VPN_ENDPOINT 443 y elimina explicit-exit-notify 1 del servidor. Por último, permite 443/tcp en lugar de 1194/udp en los firewalls. TCP suele ser menos eficiente que UDP y debe seguir siendo una opción de compatibilidad.
Comprueba el servicio y confirma que el enrutamiento está activado:
sudo systemctl status openvpn-server@server --no-pager
sudo journalctl -u openvpn-server@server -n 50 --no-pager
sudo sysctl net.ipv4.ip_forward
Desde el ordenador conectado, la dirección IP pública debe coincidir con la del VPS.
Para revocar el perfil de un dispositivo perdido, regenera la lista de revocación y reinicia OpenVPN:
cd /etc/openvpn/easy-rsa
sudo env EASYRSA_BATCH=1 ./easyrsa revoke client
sudo env EASYRSA_BATCH=1 EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
sudo install -o root -g openvpn -m 640 pki/crl.pem /etc/openvpn/server/crl.pem
sudo systemctl restart openvpn-server@server
Instalar la aplicación cliente
El servidor VPN funciona en tu VPS, pero cada ordenador que se conecte también necesita una aplicación cliente.
Para WireGuard, instala la aplicación oficial desde la página de descargas de WireGuard:
- Windows y Linux: wireguard.com/install
Para OpenVPN, elige el cliente según tu dispositivo:
- Windows y Linux: instala gratuitamente OpenVPN Connect. Este cliente oficial acepta perfiles
.ovpngenerados por OpenVPN Community Edition y no requiere ninguna suscripción. - En un ordenador Linux con NetworkManager, también puedes instalar
network-manager-openvpne importar el perfil desde los ajustes de red. Esta integración gestiona mejor el DNS que iniciar OpenVPN directamente desde la línea de comandos.
En un ordenador, el principio es simple: copia el archivo de configuración generado por el VPS e impórtalo en la aplicación cliente. WireGuard usa un archivo .conf, OpenVPN usa un archivo .ovpn.
Buenas prácticas de seguridad
Una VPN da acceso a tu red privada. Trata cada perfil cliente como una clave sensible.
- Nunca compartas públicamente un archivo
.confde WireGuard o.ovpnde OpenVPN. - Crea un perfil distinto para cada dispositivo.
- Revoca inmediatamente el perfil de un dispositivo perdido.
- Elimina las copias sin cifrar de los perfiles que queden en el VPS y en tu ordenador después de importarlos, salvo que se conserven en un almacenamiento cifrado.
- Protege la frase secreta y una copia de seguridad cifrada de la autoridad de certificación de OpenVPN: su clave privada permite firmar nuevos perfiles.
- Para un despliegue sensible o con varios usuarios, conserva idealmente la autoridad de certificación de OpenVPN en un equipo separado y sin conexión.
- Un túnel completo no es automáticamente un cortafuegos de desconexión: activa la opción del cliente que bloquea el tráfico fuera de la VPN o el modo VPN siempre activa si ningún tráfico debe escapar cuando se interrumpe el túnel.
- Mantén SSH abierto solo para las direcciones IP necesarias cuando sea posible.
- Actualiza el VPS con regularidad.
- Conserva una copia de los perfiles cliente en un almacenamiento cifrado.
Para uso personal, WireGuard suele ser la opción más simple y cómoda. OpenVPN sigue siendo útil cuando necesitas atravesar redes restrictivas o mantener compatibilidad con una instalación existente. En ambos casos, un VPS te da la libertad de alojar tu propia pasarela privada, con tus reglas, puertos y accesos.
Si necesitas un servidor para desplegar este tipo de configuración, puedes empezar con un servidor VPS BoxToPlay con IP dedicada, acceso root, copias de seguridad y un firewall hardware configurable.
