Cómo establecer un túnel IPsec site-to-site mediante software en un extremo a un cortafuegos o router. Establecer el túnel en el cortafuegos y en el equipo Linux Ubuntu con Docker.
- Estudio de caso, datos iniciales.
- Requisitos para montar un túnel IPsec.
- Sede local de trabajo: configurar túnel IPsec y reglas de acceso en cortafuegos.
- Sede remota de casa: configurar túnel IPsec por software con Docker en Linux Ubuntu.
- Desplegar contenedor Docker y levantar túnel software IPsec.
- Detener el contenedor y limpiar restos, desconectar el túnel IPsec.
Estudio de caso, datos iniciales
Partimos de una situación hipotética de necesidad de conexión entre dos sedes, la de trabajo y la de casa. La sede de trabajo cuenta con un cortafuegos con soporte para crear túneles IPsec. La sede de casa, al tener un router simple que no tiene opción de establecer túnel IPsec, se opta por montar una máquina virtual Linux Ubuntu y establecer el túnel por software.
La red de la sede de casa tiene el siguiente direccionamiento:192.168.1.0/24. Con la IP pública de salida a internet 145.145.112.112. Esta IP pública debe ser fija/estática, si varía, habría que reconfigurar el túnel.
La red de la sede de trabajo tiene el siguiente direccionamiento:192.168.100.0/24. Con la IP pública de salida a internet 175.175.120.120. Al igual que en la sede de casa, esta IP pública debe ser fija/estática, si varía, habría que reconfigurar el túnel.
Pretendemos levantar un túnel IPsec entre ambas sedes, de forma que los equipos de la red de trabajo «vean» a los de la red de casa y viceversa, con el mismo direccionamiento, como si todos estuvieran en la misma red.
Requisitos para montar un túnel IPsec
En la sede de casa necesitaremos:
- Una máquina virtual o física con Linux Ubuntu Server 24. Este equipo será el que establezca el túnel. En este caso tendrá la IP 192.168.1.115. En el siguiente enlace explicamos cómo montar un equipo virtual Linux Ubuntu:
- El equipo Linux debe tener instalado Docker Desktop y Docker Compose, en el siguiente enlace explicamos cómo instalarlos:
En la sede de trabajo necesitaremos:
- Acceso al cortafuegos perimetral o router para crear el túnel IPsec.
- Acceso a un PC de la red para comprobar las comunicaciones.
Sede local de trabajo: configurar túnel IPsec y reglas de acceso en cortafuegos
En la sede de trabajo accederemos al cortafuegos o router perimetral para establecer el túnel y las políticas de seguridad. A modo de ejemplo, explicamos cómo crear un túnel IPsec en un cortafuegos Fortigate. El procedimiento es similar para cualquier otro cortafuegos: Palo Alto, Check Point, Huawei, Cisco, Juniper, Sophos, Barracuda, SonicWall, etc. Algunos routers admiten establecer túneles IPsec, por lo que no tiene por qué ser un cortafuegos.
Establecer túnel en el cortafuegos de la sede de trabajo
En primer lugar, crearemos el túnel IPsec en el cortafuegos, para ello, desde la consola de gestión, accederemos a VPN – IPsec y pulsaremos en «Create new» – «IPsec Tunnel»:

Podremos crear el túnel usando el asistente, marcando «Site to Site»:

Indicaremos la IP remota (la IP pública de salida a Internet de la sede de casa), la interfaz de salida y la clave (contraseña segura). La clave debe ser de fortaleza alta y será la misma que establezcamos en la parte del túnel de la sede de casa:

Indicaremos la red local (de la sede de trabajo) que queramos que sea accesible desde la sede de casa e indicaremos el direccionamiento de red de la sede local (la sede de trabajo), en este caso 192.168.100.0/24 y de la sede remota (la sede de casa), en este caso 192.168.1.0/24:

Si queremos crear el túnel sin asistente, podemos establecer todas las configuraciones directamente, eligiendo «Custom»:

En este caso, deberemos indicar todas las opciones del túnel IPsec (puerto, IP remota, IP local, clave, tipo de cifrado, etc.):

Y también las fases de conexión, donde estableceremos el direccionamiento local y el remoto:

Reglas de acceso en cortafuegos de la sede de trabajo
Tras crear el túnel en el cortafuegos, definiremos las políticas de cortafuegos (reglas de acceso), crearemos dos reglas, una para el tráfico desde la sede de casa (remota) a la de trabajo (local) y viceversa.
Estas reglas ya estarán creadas si hemos usado el asistente para desplegar el túnel IPsec.
Para la regla del tráfico de la sede remota de casa a la sede local de trabajo:

Y la inversa, para el tráfico desde la sede local de trabajo a la sede remota de casa:

En estas reglas delimitaremos qué objetos (dispositivos, equipos o redes) tendrán conectividad y visibilidad entre una sede y la otra. Para nuestro caso, permitiremos el acceso solo al equipo Ubuntu Server de la sede de casa con la IP 192.168.1.115, que es el que levantará el túnel. En este ejemplo, el equipo Linux Ubuntu podrá «ver» todos los equipos de la red LAN de la sede de trabajo y por cualquier puerto/servicio.
Rutas en cortafuegos de la sede de trabajo
Si hemos usado el asistente para crear el túnel IPsec nos habrá creado las rutas necesarias, si no lo hemos hecho, deberemos crear las rutas estáticas correspondientes:

Sede remota de casa: configurar túnel IPsec por software con Docker en Linux Ubuntu
En la sede remota de casa accederemos al equipo Linux Ubuntu Server y crearemos los siguientes ficheros en una carpeta: ipsec.conf, ipsec.secrets, Dockerfile y docker-compose.yml. A continuación indicamos el contenido de cada uno de estos ficheros.
Fichero ipsec.conf
Desde una carpeta, por ejemplo desde /home/ipsec, crearemos el fichero ipsec.conf, con el comando:
|
1 |
nano ipsec.conf |
Pegaremos el siguiente contenido, cambiando la IP pública de la sede de casa, la de la sede de trabajo y los direccionamientos por lo que tengamos en cada caso:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
config setup charondebug="ike 2, knl 2, cfg 2" uniqueids=no strictcrlpolicy=no conn trabajo-to-casa # Lado local (casa) left=%defaultroute leftid=145.145.112.112 leftsubnet=192.168.1.0/24 leftfirewall=yes # Lado remoto (trabajo) right=175.175.120.120 rightid=175.175.120.120 rightsubnet=192.168.100.0/24 # Autenticación y cifrado authby=secret keyexchange=ikev1 ike=aes256-sha256-modp2048 esp=aes256-sha256-modp2048 # Configuración del túnel type=tunnel auto=start keyingtries=%forever ikelifetime=28800s lifetime=3600s dpddelay=30s dpdtimeout=150s dpdaction=restart closeaction=restart forceencaps=yes |
Guardaremos los cambios pulsando Control + O y cerraremos la edición pulsando Control + X.

Fichero ipsec.secrets
En la misma carpeta que para el fichero anterior, crearemos el fichero ipsec.secrets, con el comando:
|
1 |
nano ipsec.secrets |
Este fichero contendrá una línea con la IP pública de la sede de casa, la ip pública de la sede de trabajo y la clave secreta establecida al crear el túnel IPsec en el cortafuegos de la sede de trabajo:
|
1 |
145.145.112.122 175.175.120.120 : PSK "Clave_Secreta_Tunel" |

Fichero docker-compose.yml
En la misma carpeta que para el fichero anterior, crearemos el fichero docker-compose.yml, con el comando:
|
1 |
nano docker-compose.yml |
Con el siguiente contenido:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
services: ipsec-gateway: build: . container_name: ipsec-gateway restart: unless-stopped network_mode: "host" cap_add: - NET_ADMIN - NET_RAW - SYS_ADMIN privileged: true volumes: - /lib/modules:/lib/modules:ro |

Fichero Dockerfile
En la misma carpeta que para el fichero anterior, crearemos el fichero Dockerfile, con el comando:
|
1 |
nano Dockerfile |
Con el siguiente contenido (cambiando lógicamente los direccionamientos por los de cada caso):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
FROM alpine:3.18 RUN apk update && apk add --no-cache strongswan iptables net-tools iproute2 RUN mkdir -p /etc/strongswan.d/charon COPY ipsec.conf /etc/ipsec.conf COPY ipsec.secrets /etc/ipsec.secrets # Script de inicio RUN cat > /start.sh << 'EOF' #!/bin/sh # Habilitar forwarding en el host echo 1 > /proc/sys/net/ipv4/ip_forward # Deshabilitar redirects echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Limpiar reglas anteriores iptables -t nat -F iptables -t filter -F # NAT para TODO el tráfico de la red de casa hacia el túnel iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.100.0/24 -j MASQUERADE # Permitir forward entre todas las redes iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.100.0/24 -j ACCEPT iptables -A FORWARD -s 192.168.100.0/24 -d 192.168.1.0/24 -j ACCEPT # Iniciar StrongSwan exec ipsec start --nofork EOF RUN chmod +x /start.sh CMD ["/start.sh"] |

Fichero configurar_red.sh
El fichero configurar_red.sh no suele ser necesario, lo incluimos como ejemplo para una posible configuración de red en el equipo Linux Ubuntu:
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # Habilitar IP forwarding en el host echo 1 > /proc/sys/net/ipv4/ip_forward # Configurar rutas estáticas (si es necesario) ip route add 192.168.100.0/24 dev eth0 # Configurar iptables para NAT iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE |

Estableceremos este fichero como ejecutable, con el comando:
|
1 |
chmod +r configurar_red.sh |
Los ficheros que debemos tener en la carpeta:

Desplegar contenedor Docker y levantar túnel software IPsec
Desde la carpeta con todos los ficheros, ejecutaremos el siguiente comando para componer el contenedor Docker:
|
1 |
docker-compose build --no-cache |

Si no hay errores, ejecutaremos el siguiente comando para iniciar el contenedor y levantar el túnel IPsec:
|
1 |
docker-compose up -d |

Para comprobar que el túnel se ha levantado podemos ejecutar el comando:
|
1 |
docker exec ipsec-site-tunnel ipsec statusall |
Si el túnel se ha establecido, nos mostrara «ESTABLISHED» y «INSTALLED»:

Desde el cortafuegos de la sede de trabajo también podemos consultar el estado del túnel (en «VPN» – «IPsec Tunnels»):

Comprobaremos conectividad desde equipo de casa a trabajo haciendo un ping desde el equipo Linux Ubuntu a algún equipo de la red del trabajo:

Y al revés, desde algún equipo de la red de trabajo al equipo Linux Ubuntu de la sede de casa:

De esta forma, mientras el túnel esté levantado, tendremos los equipos de la sede remota de casa como si estuvieran en la misma red de los equipos de trabajo.
Detener el contenedor y limpiar restos, desconectar el túnel IPsec
Si necesitamos «eliminar» el contenedor y detener el túnel, por ejemplo para cuando tengamos que hacer algún cambio en la configuración del túnel, podemos usar los comandos:
|
1 2 |
docker-compose down docker system prune -f |
Cuando hayamos cambiado la configuración en los ficheros anteriores, podremos recomponer el túnel lanzando:
|
1 2 |
docker-compose build --no-cache docker-compose up -d |
Se puede detener el túnel sin necesidad de detener el contenedor, ejecutando:
|
1 |
docker exec ipsec-gateway ipsec stop |
O detener una conexión concreta, ejecutando:
|
1 |
docker exec ipsec-gateway ipsec down trabajo-to-casa |
Si quisiéramos iniciarlo, podemos ejecutar:
|
1 |
docker exec ipsec-gateway ipsec start |
O bien, una conexión específica:
|
1 |
docker exec ipsec-gateway ipsec up trabajo-to-casa |
También se puede reiniciar el túnel completo (detener e iniciar), con:
|
1 |
docker exec ipsec-gateway ipsec restart |
Incluso podemos detener el contenedor, manteniéndolo, con:
|
1 |
docker stop ipsec-gateway |
Del lado de la sede de trabajo, por supuesto, también se puede detener el túnel, desde el cortafuegos, seleccionando el túnel levantado y pulsando en «Bring Down» – «Entire Tunnel»:
