--- title: "VPN IPsec sitio a sitio con strongSwan en Ubuntu 24.04" description: "Configura una VPN IPsec IKEv2 sitio a sitio con strongSwan y swanctl en Ubuntu 24.04, con clave precompartida o certificados, reglas UFW y verificación." category: "Seguridad de Red Avanzada" language: es source: https://cubepath.com/es/docs/seguridad-de-red-avanzada/configuracion-de-vpn-ipsec-con-strongswan updated: 2026-09-25 --- # VPN IPsec sitio a sitio con strongSwan en Ubuntu 24.04 strongSwan es la implementación de IPsec de referencia en Linux. Negocia las claves con IKEv2 y deja el cifrado del tráfico al propio kernel (ESP), lo que lo hace compatible con routers y firewalls de casi cualquier fabricante. En este tutorial conectarás dos redes privadas con un túnel IPsec sitio a sitio entre dos gateways con Ubuntu 24.04, usando la interfaz moderna `swanctl`, primero con clave precompartida y después con certificados. ## Requisitos previos - Dos servidores con Ubuntu 24.04 LTS que actuarán como gateways, uno en cada sitio, cada uno con IP pública y acceso a su red local. - Un usuario no root con privilegios `sudo` en ambos. - Redes locales que no se solapen. Esta guía usa el siguiente plan de direcciones: | Dato | Sitio A | Sitio B | |---|---|---| | IP pública del gateway | `203.0.113.10` | `198.51.100.20` | | Red local | `10.10.0.0/24` | `10.20.0.0/24` | | IP LAN del gateway (`eth1`) | `10.10.0.1` | `10.20.0.1` | | Identidad IKE | `site-a.example.com` | `site-b.example.com` | > Nota: Si solo necesitas unir dos servidores Linux y no hay un equipo de terceros que obligue a usar IPsec, WireGuard es más sencillo de configurar. IPsec es la opción adecuada cuando el otro extremo es un firewall comercial (Fortinet, Cisco, Palo Alto, un router en la nube) que solo habla IKEv2. ## Paso 1: Instalar strongSwan con swanctl Ubuntu ofrece dos formas de ejecutar strongSwan: la antigua, basada en `ipsec.conf` y el servicio `strongswan-starter`, y la actual, basada en `swanctl.conf` y el demonio `charon-systemd`. Esta guía usa la segunda. Instálala en los dos gateways: ```bash sudo apt update sudo apt install charon-systemd strongswan-swanctl strongswan-pki ``` `strongswan-pki` solo hace falta en el equipo donde generes los certificados (paso 6), pero no estorba en el resto. Comprueba que el servicio está en marcha: ```bash systemctl status strongswan ``` ```output ● strongswan.service - strongSwan IPsec IKEv1/IKEv2 daemon using swanctl Loaded: loaded (/usr/lib/systemd/system/strongswan.service; enabled; preset: enabled) Active: active (running) ``` Si `strongswan-starter` estuviera también instalado y activo, desactívalo para que no compitan dos demonios por los puertos IKE: ```bash sudo systemctl disable --now strongswan-starter ``` ## Paso 2: Activar el reenvío de paquetes Cada gateway reenvía tráfico entre su LAN y el túnel. Activa el reenvío IPv4 en **ambos**: ```bash sudo nano /etc/sysctl.d/99-ipsec.conf ``` ```ini net.ipv4.ip_forward = 1 ``` ```bash sudo sysctl --system sysctl net.ipv4.ip_forward ``` ```output net.ipv4.ip_forward = 1 ``` ## Paso 3: Configurar el túnel en el sitio A con clave precompartida Los archivos de `swanctl` viven en `/etc/swanctl/`, y cualquier `.conf` dentro de `/etc/swanctl/conf.d/` se carga automáticamente. Genera primero una clave precompartida larga y aleatoria: ```bash openssl rand -base64 32 ``` Crea la configuración en el gateway A: ```bash sudo nano /etc/swanctl/conf.d/site-b.conf ``` ```text connections { site-b { version = 2 local_addrs = 203.0.113.10 remote_addrs = 198.51.100.20 proposals = aes256gcm16-prfsha384-ecp384 dpd_delay = 30s local { auth = psk id = site-a.example.com } remote { auth = psk id = site-b.example.com } children { lan-a-lan-b { local_ts = 10.10.0.0/24 remote_ts = 10.20.0.0/24 esp_proposals = aes256gcm16-ecp384 start_action = start dpd_action = restart } } } } secrets { ike-site-b { id-a = site-a.example.com id-b = site-b.example.com secret = "TU_CLAVE_PRECOMPARTIDA" } } ``` Sustituye `TU_CLAVE_PRECOMPARTIDA` por el valor generado. Los parámetros importantes: - `proposals` y `esp_proposals`: algoritmos de la fase IKE y del tráfico ESP. Deben coincidir en ambos extremos. AES-GCM con curvas ECP de 384 bits es una combinación actual y soportada por la mayoría de equipos. - `local_ts` y `remote_ts`: los selectores de tráfico, es decir, qué redes se cifran. Son la base de la política IPsec. - `start_action = start`: inicia el túnel en cuanto se carga la configuración. `dpd_delay` con `dpd_action = restart` detecta un extremo caído y renegocia. Protege el archivo, porque contiene el secreto: ```bash sudo chmod 600 /etc/swanctl/conf.d/site-b.conf ``` ## Paso 4: Configurar el sitio B En el gateway B, crea el archivo equivalente con los papeles invertidos y **la misma** clave precompartida: ```bash sudo nano /etc/swanctl/conf.d/site-a.conf ``` ```text connections { site-a { version = 2 local_addrs = 198.51.100.20 remote_addrs = 203.0.113.10 proposals = aes256gcm16-prfsha384-ecp384 dpd_delay = 30s local { auth = psk id = site-b.example.com } remote { auth = psk id = site-a.example.com } children { lan-b-lan-a { local_ts = 10.20.0.0/24 remote_ts = 10.10.0.0/24 esp_proposals = aes256gcm16-ecp384 start_action = start dpd_action = restart } } } } secrets { ike-site-a { id-a = site-a.example.com id-b = site-b.example.com secret = "TU_CLAVE_PRECOMPARTIDA" } } ``` ```bash sudo chmod 600 /etc/swanctl/conf.d/site-a.conf ``` ## Paso 5: Abrir el firewall y levantar el túnel IKE usa UDP 500, y UDP 4500 cuando hay NAT de por medio (NAT-T). Sin NAT, el tráfico cifrado viaja como protocolo ESP (IP 50). En el gateway A, permite todo ello solo desde el gateway B: ```bash sudo ufw allow from 198.51.100.20 to any port 500,4500 proto udp sudo ufw allow proto esp from 198.51.100.20 ``` UFW bloquea el tráfico reenviado por defecto, así que permite también el paso entre las dos LAN: ```bash sudo ufw route allow from 10.20.0.0/24 to 10.10.0.0/24 sudo ufw route allow from 10.10.0.0/24 to 10.20.0.0/24 ``` Repite en el gateway B cambiando la IP de origen por `203.0.113.10` (las reglas `route` son las mismas). Carga la configuración y las claves en los dos gateways: ```bash sudo swanctl --load-all ``` ```output loaded ike secret 'ike-site-b' no authorities found, 0 unloaded no pools found, 0 unloaded loaded connection 'site-b' successfully loaded 1 connections, 0 unloaded ``` Comprueba las asociaciones de seguridad (SA): ```bash sudo swanctl --list-sas ``` ```output site-b: #1, ESTABLISHED, IKEv2, 1a2b3c4d5e6f7a8b_i* 9c8d7e6f5a4b3c2d_r local 'site-a.example.com' @ 203.0.113.10[500] remote 'site-b.example.com' @ 198.51.100.20[500] AES_GCM_16-256/PRF_HMAC_SHA2_384/ECP_384 established 42s ago, rekeying in 13950s lan-a-lan-b: #1, reqid 1, INSTALLED, TUNNEL, ESP:AES_GCM_16-256 installed 42s ago, rekeying in 3294s, expires in 3918s in c1f2e3d4, 0 bytes, 0 packets out c5b6a7d8, 0 bytes, 0 packets local 10.10.0.0/24 remote 10.20.0.0/24 ``` `ESTABLISHED` indica que la fase IKE ha terminado y `INSTALLED` que el kernel tiene la política IPsec para las dos redes. Si el túnel no se ha iniciado solo, fuérzalo: ```bash sudo swanctl --initiate --child lan-a-lan-b ``` ## Paso 6: Comprobar el tráfico entre las redes IPsec no crea una interfaz de red: el kernel cifra los paquetes que coinciden con la política. Por eso la prueba debe hacerse con direcciones que estén dentro de los selectores. Desde el gateway A, usa su IP LAN como origen: ```bash ping -c 3 -I 10.10.0.1 10.20.0.1 ``` Desde un equipo de la LAN A, haz ping a uno de la LAN B: ```bash ping -c 3 10.20.0.50 ``` Vuelve a mirar las SA: los contadores de bytes y paquetes deben haber subido. ```bash sudo swanctl --list-sas ``` También puedes ver las políticas instaladas en el kernel: ```bash sudo ip xfrm policy ``` Los equipos de cada LAN tienen que enviar el tráfico destinado a la red remota al gateway IPsec. Si el gateway no es su puerta de enlace predeterminada, añade en el router de la LAN una ruta estática (en el sitio A, `10.20.0.0/24` vía `10.10.0.1`). ## Paso 7: Usar certificados en lugar de clave precompartida Con más de dos sitios, o si el otro extremo lo exige, los certificados son más seguros y fáciles de rotar que una clave compartida. Genera una pequeña CA en un equipo de confianza (puede ser uno de los gateways) con la herramienta `pki` de strongSwan: ```bash mkdir -p ~/vpn-pki && cd ~/vpn-pki umask 077 pki --gen --type ed25519 --outform pem > ca.key pki --self --ca --lifetime 3652 --in ca.key --dn "CN=VPN CA" --outform pem > ca.crt ``` Crea una clave y un certificado para cada gateway. Para el sitio A: ```bash pki --gen --type ed25519 --outform pem > site-a.key pki --req --type priv --in site-a.key --dn "CN=site-a.example.com" --san site-a.example.com --outform pem > site-a.csr pki --issue --cacert ca.crt --cakey ca.key --type pkcs10 --in site-a.csr --lifetime 1826 --outform pem > site-a.crt ``` Repite con `site-b` para el otro gateway. Comprueba el resultado: ```bash pki --print --in site-a.crt ``` Copia los archivos a su sitio en cada gateway (en el A, `ca.crt`, `site-a.crt` y `site-a.key`): ```bash sudo cp ca.crt /etc/swanctl/x509ca/ sudo cp site-a.crt /etc/swanctl/x509/ sudo cp site-a.key /etc/swanctl/private/ sudo chmod 600 /etc/swanctl/private/site-a.key ``` La clave de la CA (`ca.key`) no debe copiarse a los gateways. Guárdala fuera de línea. Cambia los bloques `local` y `remote` de `/etc/swanctl/conf.d/site-b.conf` en el gateway A y elimina el bloque `secrets`: ```text local { auth = pubkey certs = site-a.crt id = site-a.example.com } remote { auth = pubkey id = site-b.example.com } ``` Haz el cambio equivalente en el gateway B (con `site-b.crt` en `local`) y recarga en ambos: ```bash sudo swanctl --load-all sudo swanctl --list-certs ``` La identidad remota debe coincidir con un SAN del certificado del otro extremo, y ese certificado debe estar firmado por la CA de `/etc/swanctl/x509ca/`. Vuelve a comprobar con `sudo swanctl --list-sas` que la SA se establece. ## Solución de problemas Los registros del demonio son la principal herramienta de diagnóstico: ```bash sudo journalctl -u strongswan -f ``` **`NO_PROPOSAL_CHOSEN`.** Los algoritmos de `proposals` o `esp_proposals` no coinciden entre los dos extremos. Deja exactamente la misma cadena en ambos. **`TS_UNACCEPTABLE`.** Los selectores no son simétricos: el `local_ts` de un lado debe ser el `remote_ts` del otro. **`AUTHENTICATION_FAILED`.** Con PSK, el secreto o las identidades (`id`) no coinciden. Con certificados, la identidad no está en el SAN o falta la CA en `x509ca`. **La SA se establece pero no pasa tráfico.** Revisa `net.ipv4.ip_forward`, las reglas `ufw route` y las rutas de los equipos de la LAN. Si el gateway hace NAT (masquerade) hacia Internet, esa regla puede estar traduciendo el tráfico entre LAN antes de que coincida con la política IPsec; excluye las redes remotas de la regla de NAT. ## Conclusión Tienes dos redes unidas por un túnel IPsec IKEv2 gestionado con `swanctl`, con autenticación por clave precompartida o por certificados de una CA propia. Como siguientes pasos, puedes añadir más `children` para publicar otras subredes, conectar un tercer sitio con su propio archivo en `conf.d/` o sustituir el extremo remoto por un firewall comercial usando los mismos algoritmos.