WireGuard: monta tu propia VPN en minutos

Guía paso a paso para configurar un servidor VPN con WireGuard en Linux y conectar clientes de forma segura.

WireGuard: monta tu propia VPN en minutos

Por que WireGuard y no OpenVPN

OpenVPN lleva anos siendo el estandar, pero WireGuard lo supera en varios aspectos:

  • Codigo minimo: unas 4000 lineas frente a las mas de 100000 de OpenVPN. Menos codigo significa menos superficie de ataque y auditorias mas faciles.
  • Rendimiento: WireGuard opera en el kernel de Linux y usa criptografia moderna (ChaCha20, Curve25519, BLAKE2s). El rendimiento y la latencia son notablemente mejores.
  • Configuracion simple: un archivo de configuracion corto en cada extremo, sin gestionar certificados PKI complejos.
  • Conexion instantanea: el handshake se completa en milisegundos. Ideal para dispositivos moviles que cambian entre WiFi y datos.

Requisitos

  • Servidor Linux con IP publica (VPS o servidor dedicado)
  • Puerto UDP abierto en el firewall (por defecto 51820)
  • Acceso root en servidor y cliente
  • Kernel 5.6+ (WireGuard incluido) o el modulo DKMS para kernels anteriores

Instalar WireGuard

En el servidor

# Ubuntu/Debian
sudo apt update && sudo apt install wireguard -y

# RHEL / Rocky / Alma
sudo dnf install epel-release -y
sudo dnf install wireguard-tools -y

En el cliente

Instala el mismo paquete wireguard o wireguard-tools en la maquina cliente. WireGuard tambien tiene aplicaciones oficiales para Windows, macOS, Android e iOS.

Generar pares de claves

Cada extremo (servidor y cliente) necesita su propio par de claves. Genera las del servidor:

wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key

Y las del cliente:

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key
chmod 600 /etc/wireguard/client_private.key

Guarda las claves publicas de ambos extremos. Las necesitaras para la configuracion cruzada.

Configurar el servidor

Crea el archivo de configuracion de la interfaz WireGuard:

sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <clave_privada_del_servidor>

PostUp = nft add table ip wireguard; nft add chain ip wireguard forward { type filter hook forward priority 0 \; }; nft add rule ip wireguard forward iifname wg0 accept; nft add rule ip wireguard forward oifname wg0 accept; nft add table ip nat; nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }; nft add rule ip nat postrouting oifname eth0 masquerade
PostDown = nft delete table ip wireguard; nft delete table ip nat

[Peer]
# Cliente 1
PublicKey = <clave_publica_del_cliente>
AllowedIPs = 10.0.0.2/32

Sustituye eth0 por la interfaz de red publica de tu servidor. Verificala con ip route show default.

Alternativa con iptables

Si tu servidor usa iptables en lugar de nftables:

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Habilitar el reenvio de paquetes

WireGuard necesita IP forwarding para enrutar trafico entre la VPN e internet:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

Verifica que esta activo:

sysctl net.ipv4.ip_forward

La salida debe ser net.ipv4.ip_forward = 1.

Configurar el cliente

En la maquina cliente, crea su archivo de configuracion:

sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = <clave_privada_del_cliente>
DNS = 1.1.1.1

[Peer]
PublicKey = <clave_publica_del_servidor>
Endpoint = IP_PUBLICA_SERVIDOR:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
  • AllowedIPs = 0.0.0.0/0: enruta todo el trafico a traves de la VPN (full tunnel). Si solo quieres acceder a la red del servidor, usa 10.0.0.0/24.
  • PersistentKeepalive: mantiene el tunel activo cuando el cliente esta detras de NAT.

Levantar y bajar el tunel

Con wg-quick

# Levantar la interfaz
sudo wg-quick up wg0

# Verificar el estado
sudo wg show

# Bajar la interfaz
sudo wg-quick down wg0

Con systemd

Para que el tunel se levante automaticamente al arrancar:

sudo systemctl enable --now wg-quick@wg0

Comprueba el estado del servicio:

sudo systemctl status wg-quick@wg0

Verificar la conexion

Desde el cliente, haz ping al servidor a traves del tunel:

ping -c 4 10.0.0.1

Para confirmar que todo el trafico sale por la VPN:

curl ifconfig.me

La IP devuelta debe ser la IP publica del servidor, no la del cliente.

Anadir mas clientes

Para cada nuevo cliente, genera un par de claves y anade un bloque [Peer] en la configuracion del servidor:

[Peer]
# Cliente 2
PublicKey = <clave_publica_cliente_2>
AllowedIPs = 10.0.0.3/32

Recarga la configuracion sin interrumpir las conexiones existentes:

sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

Cada cliente debe tener una IP unica dentro de la subred 10.0.0.0/24.

Abrir el puerto en el firewall

Asegurate de que el puerto UDP de WireGuard esta accesible:

# Con nftables
sudo nft add rule inet filter input udp dport 51820 accept

# Con firewalld
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --reload

# Con ufw
sudo ufw allow 51820/udp

Resumen

Con WireGuard tienes una VPN moderna, rapida y facil de mantener. La configuracion es minima comparada con OpenVPN, el rendimiento es superior y anadir nuevos clientes se reduce a generar claves y agregar un bloque [Peer]. Todo tu trafico viaja cifrado entre tus dispositivos y tu servidor, sin depender de servicios VPN de terceros.

## Nota

✍️ Transparencia: Este artículo ha sido creado con el apoyo de herramientas de inteligencia artificial. Toda la información técnica ha sido revisada y validada por el autor antes de su publicación.

$ curl tengoping.com/rss.xml | subscribe [suscribirse por RSS →]