Cómo configurar una VPN IKEv2 con Strongswan y Let’s encrypt en CentOS 7

Strongswan es una implementación de IPSec multiplataforma de código abierto. Es una solución VPN basada en IPSec que se centra en mecanismos de autenticación fuertes. Strongswan ofrece soporte para los protocolos de intercambio de claves IKEv1 e IKEv2, autenticación basada en certificados X.509 o claves precompartidas, y autenticación de usuario segura IKEv2 EAP.

En este tutorial, te mostraré cómo instalar un servidor VPN IPSec con Strongswan. Crearemos un servidor VPN IKEv2 con la autenticación ‘EAP-MSCHAPv2’ y utilizaremos certificados Letsencrypt en un servidor CentOS 7.

Requisitos previos

  • Servidor CentOS 7
  • Privilegios de root

¿Qué vamos a hacer?

  1. Instalar Strongswan en CentOS 7
  2. Generar SSL Letsencrypt
  3. Configurar Strongswan
  4. Habilitar el cortafuegos NAT
  5. Activar el reenvío de puertos
  6. Probar

Paso 1 – Instalar Strongswan en CentOS 7

En este primer paso, instalaremos el software de implementación de IPsec strongswan y todos los paquetes necesarios desde el repositorio EPEL.

Instala el repositorio EPEL e instala el paquete strongswan utilizando los siguientes comandos yum.

yum -y install epel-release
yum -y install strongswan

Espera a que se instale el paquete strongswan.

Instalar Strongswan en CentOS 7

Paso 2 – Generar el certificado SSL con Let’s encrypt

Crearemos el servidor VPN IKEv2 utilizando un nombre de dominio ‘ikev2.hakase-labs.io’ y utilizaremos certificados generados desde letsencrypt.

En este paso, instalaremos la herramienta letsencrypt ‘certbot’ y generaremos certificados para el nombre de dominio del servidor ‘ikev2.hakase-labs.io’.

Instala la herramienta letsencrypt ‘certbot’.

yum -y install certbot

Después de la instalación de certbot, tenemos que abrir el puerto HTTP y HTTPS del servidor utilizando firewall-cmd.

Añade los servicios HTTP y HTTPS a la lista de servicios de firewalld ejecutando los siguientes comandos firewall-cmd.

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

Generar certificado SSL con Let's encrypt

Ahora podemos generar nuevos archivos de certificados SSL utilizando la herramienta certbot de letsencrypt.

Ejecuta el comando certbot que aparece a continuación.

certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email [email protected] -d ikev2.hakase-labs.io

Se han generado los certificados Letsencrypt para el nombre de dominio vpn ‘ikev2.hakase-labs.io’, y se encuentran en el directorio ‘/etc/letsencrypt/live’.

Certificado SSL obtenido de Let's encrypt

A continuación, tenemos que copiar los archivos de certificado ‘fullchain.pem’, ‘privkey.pem’, y el ‘chain.pem’ al directorio ‘/etc/strongswan/ipsec.d/’.

cp /etc/letsencrypt/live/ikev2.hakase-labs.io/fullchain.pem /etc/strongswan/ipsec.d/certs/
cp /etc/letsencrypt/live/ikev2.hakase-labs.io/privkey.pem /etc/strongswan/ipsec.d/private/
cp /etc/letsencrypt/live/ikev2.hakase-labs.io/chain.pem /etc/strongswan/ipsec.d/cacerts/

Todos los certificados letsencrypt para la VPN Strongswan llamada ‘ikev2.hakase-labs.io’ han sido generados y copiados al directorio ‘/etc/strongswan/ipsec.d’.

tree /etc/strongswan/ipsec.d/

Archivos de certificados SSL

Paso 3 – Configurar Strongswan

Ve al directorio ‘/etc/strongswan’ y haz una copia de seguridad del archivo de configuración por defecto ‘ipsec.conf’.

cd /etc/strongswan/
mv ipsec.conf ipsec.conf.asli

Crea uno nuevo ‘ipsec.conf’ utilizando el editor vim.

vim ipsec.conf

Y pega la siguiente configuración.

#global configuration IPsec
#chron logger
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

#define new ipsec connection
conn hakase-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
    esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    [email protected]
    leftcert=fullchain.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.15.1.0/24
    rightdns=1.1.1.1,8.8.8.8
    rightsendcert=never
    eap_identity=%identity

Guarda y sal.

Detalles de la configuración:

  • Crea una nueva conexión de túnel VPN IPSec llamada ‘hakase-vpn’.
  • Especifica las suites de cifrado IKEv2 y ESP para la autenticación.
  • La configuración del servidor «izquierdo» utiliza un nombre de dominio «ikev2.hakase-labs.io» y utiliza el certificado letsencrypt «fullchain.pem» situado en el directorio «/etc/strongswan/ipsec.d/certs».
  • La configuración ‘correcta’ de los clientes/remota con el método de autenticación EAP ‘eap-mschapv2’, asignar el rango de direcciones IP virtuales ‘10.15.1.0/24’ a todos los clientes conectados, y utilizar los DNS públicos Cloudflare y google.

A continuación, tenemos que editar el archivo ‘ipsec.secrets’ para definir la clave privada del servidor RSA y las credenciales de la contraseña del usuario EAP.

Edita el archivo ‘ipsec.secrets’.

vim ipsec.secrets

Pega la configuración de abajo.

: RSA "privkey.pem"
hakase : EAP "hakase321@"
tensai : EAP "tensai321@"

Guarda y sal.

Detalles de la configuración:

  • Especifica la clave privada del servidor RSA utilizando el certificado letsencrypt ‘privkey.pem’ situado en el directorio ‘/etc/strongswan/ipsec.d/private’.
  • Define las credenciales del usuario EAP con el formato ‘usuario : EAP «contraseña»‘.

Configuración de Strongswan

La configuración IPSec de strongswan se ha completado. Inicia el servicio strongswan y habilítalo para que se inicie siempre al arrancar el sistema.

systemctl start strongswan
systemctl enable strongswan

Paso 4 – Habilitar NAT en Firewalld

En este paso, habilitaremos el enmascaramiento NAT y añadiremos los protocolos IPSec Authentication Header (AH) y Encapsulating Security Payload (ESP) en Firewalld utilizando la configuración ‘rich-rule’.

Añade ‘AH’ y ‘ESP’ para los protocolos de autenticación y encriptación en el firewalld.

firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="ah" accept'

Añade los puertos UDP ipsec y el servicio.

firewall-cmd --zone=public --permanent --add-port=500/udp
firewall-cmd --zone=public --permanent --add-port=4500/udp
firewall-cmd --zone=public --permanent --add-service="ipsec"

Ahora activa el modo NAT de enmascaramiento y recarga las reglas de configuración de firewalld.

firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --reload

Configuración NAT de Firewalld

El modo NAT en el firewalld ha sido habilitado, compruébalo con el siguiente comando.

firewall-cmd --list-all

A continuación se muestra el resultado.

Configuración del cortafuegos

Paso 5 – Habilitar el reenvío de puertos

Para habilitar el reenvío de puertos, necesitamos editar el archivo ‘sysctl.conf’.

Edita el archivo ‘/etc/sysctl.conf’ utilizando el editor vim.

vim /etc/sysctl.conf

Pega allí la siguiente configuración.

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

Guarda y sal, ahora vuelve a cargar utilizando el comando sysctl que aparece a continuación.

sysctl -p

El reenvío de puertos se ha activado. Ahora reinicia el servicio strongswan.

systemctl restart strongswan

Configura el reenvío de puertos en sysctl.conf

Paso 6 – Prueba de la VPN IPSec de Strongswan

En este caso, haremos la prueba en el MacOS X y en el teléfono android.

En MacOS

– Abre las ‘Preferencias del Sistema’ y haz clic en el menú ‘Red’.

Haz clic en el botón «+» para crear una nueva conexión VPN.

    • Interfaz: ‘VPN’
    • Tipo de VPN: ‘IKEv2’
    • Nombre del servicio: ‘IKEv2-vpn

Configurar la VPN en MacOS

– En la «Dirección del servidor» y el «ID remoto», escribe el nombre de dominio de la VPN «ikev2.hakase-labs.io».
– Haz clic en «Configuración de la autenticación».
– Autenticación mediante un ‘Nombre de usuario’.
– Escribe el nombre de usuario ‘tensai’ con la contraseña ‘tensai321@’
– Haz clic en ‘Aceptar’ y en ‘Aplicar’.

Configuración de la autenticación de la VPN de MacOS

Se ha creado una nueva conexión VPN IKEv2 en el cliente. Ahora haz clic en el botón de conexión.

Se ha creado una nueva conexión VPN IKEv2

Y el cliente se ha conectado al servidor VPN de Strongswan y tiene una dirección IP interna/privada 10.15.1.1.

En Android

– Descarga e instala la aplicación nativa de strongswan para android desde Google-Play.
– Añade un nuevo perfil VPN
– Escribe el nombre de dominio del servidor «ikev2.hakase-labs.io» y utiliza la autenticación de nombre de usuario y contraseña IKEv2 EAP.

A continuación se muestra el resultado cuando nos conectamos al servidor VPN.

Configurar la VPN en Android

El servidor VPN basado en IKEv2 IPSec se ha creado utilizando Strongswan y Letsencrypt en el servidor CentOS 7.

Referencia

Scroll al inicio