Introducción
strongSwan es un software de código abierto diseñado para implementar redes privadas virtuales (VPN) utilizando el protocolo IPsec, destacando por su seguridad, flexibilidad y compatibilidad con múltiples plataformas. Fue desarrollado originalmente como una bifurcación del proyecto FreeS/WAN en 2005, tiene gran respaldo por parte de la comunidad y el proyecto lo mantiene Andreas Steffen, profesor emérito de Seguridad en las Comunicaciones en la Universidad de Ciencias Aplicadas de Rapperswil, Suiza.
Es ampliamente utilizado para asegurar el tráfico de Internet en redes inseguras y soporta una variedad de métodos de autenticación, incluyendo certificados y EAP. Adecuado para tanto pequeñas como grandes infraestructuras, strongSwan se beneficia de ser un proyecto de código abierto, lo que garantiza una revisión constante y mejoras en seguridad, además de su capacidad para interoperar con diversos sistemas y dispositivos. Un aspecto crucial de StrongSwan es su uso del protocolo IKEv2 para la gestión de claves y el establecimiento de conexiones seguras, característica que ha fortalecido su posición.
La combinación de IPsec con IKEv2 proporciona una solución robusta y eficiente para VPNs seguras, escalables tanto para pequeñas implementaciones como para grandes infraestructuras. Su interoperabilidad con diversos sistemas y dispositivos refuerza su valor en entornos donde se requiere una comunicación segura y confiable entre hardware y software heterogéneos.
Indicaciones y requisitos previos
El artículo está enfocado exclusivamente a sistemas basados en Debian, un ejemplo sería la distribución Ubuntu y es necesario iniciar sesión con el usuario root (también puedes utilizar un usuario con permisos de superusuario).
Configuración cortafuegos
Será necesario habilitar los puertos 500 y 4500 UDP para ambos extremos. En Clouding quedarían así las reglas en cuestión:
Adicionalmente, es recomendable crear la regla filtrando también con IP de Origen para mayor seguridad. También recuerda añadir las redes involucradas en los perfiles de Firewall de los servidores involucrados para permitir el tráfico.
Instalación de strongSwan
Primero actualiza los repositorios y paquetes, luego instala strongSwan:
# apt-get update && apt upgrade -y && apt-get install strongswan -y
También habilita el enrutamiento en el servidor de forma persistente:
# echo 'net.ipv4.ip_forward=1' | tee -a /etc/sysctl.conf && sysctl -p
Configuración de conexión en strongSwan
Posteriormente, edita el archivo /etc/ipsec.conf para configurar tu conexión o conexiones VPN:
# nano /etc/ipsec.conf
A continuación un ejemplo de una configuración con una breve explicación, mínimo deberías modificar la dirección pública y subred del lado derecho (right y rightsubnet):
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 3, dmn 2, mgr 2, asn 2, chd 2, job 2, enc 2, tnc 2"
conn %default
ikelifetime=2h # Tiempo de vida de la negociación de intercambio de claves y SA.
keylife=1h # Tiempo de vida de la llave del cifrado.
rekeymargin=3m # Margen de tiempo de renegociación antes de fin de vida.
keyingtries=3 # Intentos máximos de renegociación.
keyexchange=ikev2 # Versión protocolo IKE.
authby=secret # Uso de llave precompartida (también es posible usar certificados SSL).
ike=aes256-sha1-modp1024 # Encriptación IKE disponibles (es posible añadir más de una).
esp=aes256-sha1 # Encriptación ESP (es posible añadir más de una).
forceencaps=yes # Forzar ESP por UDP
dpdaction=hold # Activar DPD
conn IPSec_clouding_to_ejemplo
left=%any # Any o dirección IP del servidor strongswan.
leftid=%any # Nombre identificativo (deben coincidir entre extremos).
leftsubnet=%any # Any o redes del lado del servidor vpn.
right=Public_IP # Dirección IP pública del otro extremo.
rightid=%any # Any o nombre identificativo (deben coincidir entre extremos).
rightsubnet=192.168.1.0/24 # Red o redes del otro extremo.
auto=start # Arranque automático de la conexión.
Donde left es tu servidor VPN, y right es el cliente o el otro extremo que tendrás que indicar. También deberás modificar en caso necesario las subredes de los extremos. También puedes añadir más de una subred o más de una posibilidad de encriptación, separándolo por comas.
Las opciones de un solo carácter en la lista a continuación se utilizan a lo largo de este despegable para designar las bibliotecas de criptografía de terceros y/o los complementos predeterminados de strongSwan que admiten un algoritmo criptográfico dado utilizado por el protocolo IKE.
Los algoritmos designados por 's' están fuertemente desaconsejados porque se han vuelto criptográficamente débiles y, por lo tanto, propensos a ataques.
Opción | Complemento | Desde |
---|---|---|
s | Desaprobado debido a problemas de seguridad | |
x | Complemento[s] criptográfico predeterminado | ver columnas de Complementos abajo |
b | Biblioteca criptográfica Botan | strongSwan 5.7.0 |
w | Biblioteca criptográfica wolfSSL | strongSwan 5.8.0 |
o | Biblioteca criptográfica OpenSSL | |
g | Biblioteca criptográfica Gcrypt | |
a | API criptográfica de usuario AF_ALG para Linux | Kernel de Linux 2.6.38 |
Las opciones de un solo carácter en la lista a continuación se utilizan a lo largo de este documento para designar las versiones del kernel de Linux que admiten un algoritmo criptográfico dado utilizado por los protocolos IPsec ESP o AH. Los algoritmos designados por 's' están fuertemente desaconsejados porque se han vuelto criptográficamente débiles y, por lo tanto, propensos a ataques.
Opción | Desde |
---|---|
s | Desaprobado debido a problemas de seguridad |
k | Kernel de Linux 2.6 |
m | Kernel de Linux 2.6.33 |
n | Kernel de Linux 4.2 |
p | Compatibilidad con kernels que usan incorrectamente la truncación de 96 bits para SHA256 Kernel de Linux <2.6.33></2.6.33> |
q | Para AH, AES-GMAC se negocia como algoritmo de encriptación para ESP |
Algoritmos de Encriptación
Palabra Clave | Descripción | IANA | IKE | ESP | Plugins |
---|---|---|---|---|---|
3des | 168 bit 3DES-EDE-CBC | 3 | s x w o g a | s k | des |
cast128 | 128 bit CAST-CBC | 6 | s o g a | s k | blowfish128 or blowfish |
blowfish128 or blowfish | 128 bit Blowfish-CBC | 7 | s x o g a | s k | blowfish |
blowfish192 | 192 bit Blowfish-CBC | 7 | s x o a | s k | blowfish |
blowfish256 | 256 bit Blowfish-CBC | 7 | s x o a | s k | blowfish |
null | Null encryption | 11 | w o | k | |
aes128 or aes | 128 bit AES-CBC | 12 | x b w o g a | k | aes |
aes192 | 192 bit AES-CBC | 12 | x b w o g a | k | aes |
aes256 | 256 bit AES-CBC | 12 | x b w o g a | k | aes |
aes128ctr | 128 bit AES-COUNTER | 13 | x w o g a | k | aes, ctr |
aes192ctr | 192 bit AES-COUNTER | 13 | x w o g a | k | aes, ctr |
aes256ctr | 256 bit AES-COUNTER | 13 | x w o g a | k | aes, ctr |
camellia128 or camellia | 128 bit Camellia-CBC | 23 | o g a | k | |
camellia192 | 192 bit Camellia-CBC | 23 | o g a | k | |
camellia256 | 256 bit Camellia-CBC | 23 | o g a | k | |
camellia128ctr | 128 bit Camellia-COUNTER | 24 | o g a | k | |
camellia192ctr | 192 bit Camellia-COUNTER | 24 | o g a | k | |
camellia256ctr | 256 bit Camellia-COUNTER | 24 | o g a | k |
Algoritmos de Encriptación Autenticada (AEAD)
Los algoritmos AEAD (Encriptación Autenticada con Datos Asociados) no pueden combinarse con cifrados de encriptación clásicos en la misma propuesta. No se debe proponer un algoritmo de integridad por separado y, por lo tanto, las Funciones Pseudoaleatorias (PRFs) deben incluirse explícitamente en dichas propuestas.
Palabra Clave | Descripción | IANA | IKE | ESP | Plugins |
---|---|---|---|---|---|
aes128ccm8 or aes128ccm64 | 128 bit AES-CCM with 64 bit ICV | 14 | x b w o g a | k | aes, ccm |
aes192ccm8 or aes192ccm64 | 192 bit AES-CCM with 64 bit ICV | 14 | x b w o g a | k | aes, ccm |
aes256ccm8 or aes256ccm64 | 256 bit AES-CCM with 64 bit ICV | 14 | x b w o g a | k | aes, ccm |
aes128ccm12 or aes128ccm96 | 128 bit AES-CCM with 96 bit ICV | 15 | x b w o g a | k | aes, ccm |
aes192ccm12 or aes192ccm96 | 192 bit AES-CCM with 96 bit ICV | 15 | x b w o g a | k | aes, ccm |
aes256ccm12 or aes256ccm96 | 256 bit AES-CCM with 96 bit ICV | 15 | x b w o g a | k | aes, ccm |
aes128ccm16 or aes128ccm128 | 128 bit AES-CCM with 128 bit ICV | 16 | x b w o g a | k | aes, ccm |
aes192ccm16 or aes192ccm128 | 192 bit AES-CCM with 128 bit ICV | 16 | x b w o g a | k | aes, ccm |
aes256ccm16 or aes256ccm128 | 256 bit AES-CCM with 128 bit ICV | 16 | x b w o g a | k | aes, ccm |
aes128gcm8 or aes128gcm64 | 128 bit AES-GCM with 64 bit ICV | 18 | x b w o g a | k | aes, gcm |
aes192gcm8 or aes192gcm64 | 192 bit AES-GCM with 64 bit ICV | 18 | x b w o g a | k | aes, gcm |
aes256gcm8 or aes256gcm64 | 256 bit AES-GCM with 64 bit ICV | 18 | x b w o g a | k | aes, gcm |
aes128gcm12 or aes128gcm96 | 128 bit AES-GCM with 96 bit ICV | 19 | x b w o g a | k | aes, gcm |
aes192gcm12 or aes192gcm96 | 192 bit AES-GCM with 96 bit ICV | 19 | x b w o g a | k | aes, gcm |
aes256gcm12 or aes256gcm96 | 256 bit AES-GCM with 96 bit ICV | 19 | x b w o g a | k | aes, gcm |
aes128gcm16 or aes128gcm128 | 128 bit AES-GCM with 128 bit ICV | 20 | x b w o g a | k | aes, gcm |
aes192gcm16 or aes192gcm128 | 192 bit AES-GCM with 128 bit ICV | 20 | x b w o g a | k | aes, gcm |
aes256gcm16 or aes256gcm128 | 256 bit AES-GCM with 128 bit ICV | 20 | x b w o g a | k | aes, gcm |
aes128gmac | Null encryption with 128 bit AES-GMAC | 21 | k | ||
aes192gmac | Null encryption with 192 bit AES-GMAC | 21 | k | ||
aes256gmac | Null encryption with 256 bit AES-GMAC | 21 | k | ||
camellia128ccm8 or camellia128ccm64 | 128 bit Camellia-CCM with 64 bit ICV | 25 | o g a | ||
camellia192ccm8 or camellia192ccm64 | 192 bit Camellia-CCM with 64 bit ICV | 25 | o g a | ||
camellia256ccm8 or camellia256ccm64 | 256 bit Camellia-CCM with 64 bit ICV | 25 | o g a | ||
camellia128ccm12 or camellia128ccm96 | 128 bit Camellia-CCM with 96 bit ICV | 26 | o g a | ||
camellia192ccm12 or camellia192ccm96 | 192 bit Camellia-CCM with 96 bit ICV | 26 | o g a | ||
camellia256ccm12 or camellia256ccm96 | 256 bit Camellia-CCM with 96 bit ICV | 26 | o g a | ||
camellia128ccm16 or camellia128ccm128 | 128 bit Camellia-CCM with 128 bit ICV | 27 | o g a | ||
camellia192ccm16 or camellia192ccm128 | 192 bit Camellia-CCM with 128 bit ICV | 27 | o g a | ||
camellia256ccm16 or camellia256ccm128 | 256 bit Camellia-CCM with 128 bit ICV | 27 | o g a | ||
chacha20poly1305 | 256 bit ChaCha20/Poly1305 with 128 bit ICV | 28 | x b w o | n | chapoly |
Las funciones PRF (Funciones Pseudoaleatorias) pueden definirse opcionalmente en propuestas IKEv2. En versiones anteriores o si no se configuran funciones pseudoaleatorias, los algoritmos de integridad propuestos se mapean a funciones pseudoaleatorias.
Si se proponen cifrados AEAD, no habrá algoritmos de integridad de los cuales derivar PRFs. Por lo tanto, los algoritmos PRF deben configurarse explícitamente.
Palabra Clave | Descripción | IANA | IKE | Plugins |
---|---|---|---|---|
prfmd5 | PRF MD5 | 1 | s x w o a | md5, hmac |
prfsha1 | PRF SHA1 | 2 | s x b w o a | sha1, hmac |
prfaesxcbc | PRF AES XCBC | 4 | x a | aes, xcbc |
prfaescmac | PRF AES CMAC | 8 | x | aes, cmac |
prfsha256 | PRF SHA2_256 | 5 | x b w o a | sha2, hmac |
prfsha384 | PRF SHA2_384 | 6 | x b w o a | sha2, hmac |
prfsha512 | PRF SHA2_512 | 7 | x b w o a | sha2, hmac |
También es posible utilizar los hashers proporcionados por el plugin gcrypt junto con el plugin hmac.
Funciones de Derivación de Claves
Basado en la PRF negociada, IKEv2 deriva el material de la clave en dos pasos separados (PRF/prf+). Desde strongSwan 5.9.6, estos son proporcionados por plugins.
PRF Base | IKE | Plugins |
---|---|---|
PRF MD5 | s x w o | md5, hmac, kdf |
PRF SHA1 | s x b w o | sha1, hmac, kdf |
PRF AES XCBC | x | aes, xcbc, kdf |
PRF AES CMAC | x | aes, cmac, kdf |
PRF SHA2_256 | x b w o | sha2, hmac, kdf |
PRF SHA2_384 | x b w o | sha2, hmac, kdf |
PRF SHA2_512 | x b w o | sha2, hmac, kdf |
Los plugins botan, openssl y wolfssl implementan KDFs basados en HMAC directamente a través de su respectiva implementación HKDF (RFC 5869).
El plugin kdf proporciona envolturas genéricas para cualquier PRF genérico soportado.
Grupos Diffie-Hellman
Grupos Primos Modulares Regulares
Palabra Clave | Modulus | IANA | IKE | Complementos |
---|---|---|---|---|
modp768 | 768 bits | 1 | s x b w o g | gmp |
modp1024 | 1024 bits | 2 | s x b w o g | gmp |
modp1536 | 1536 bits | 5 | s x b w o g | gmp |
modp2048 | 2048 bits | 14 | x b w o g | gmp |
modp3072 | 3072 bits | 15 | x b w o g | gmp |
modp4096 | 4096 bits | 16 | x b w o g | gmp |
modp6144 | 6144 bits | 17 | x b o g | gmp |
modp8192 | 8192 bits | 18 | x b o g | gmp |
Grupos Primos Modulares con Subgrupo de Orden Primo
Palabra Clave | Modulus | Subgrupo | IANA | IKE | Complementos |
---|---|---|---|---|---|
modp1024s160 | 1024 bits | 160 bits | 22 | s x b w o g | gmp |
modp2048s224 | 2048 bits | 224 bits | 23 | s x b w o g | gmp |
modp2048s256 | 2048 bits | 256 bits | 24 | s x b w o g | gmp |
Grupos de Curvas Elípticas NIST
Palabra Clave | Tamaño del Primo | IANA | IKE | Complementos |
---|---|---|---|---|
ecp192 | 192 bits | 25 | s w o | |
ecp224 | 224 bits | 26 | w o | |
ecp256 | 256 bits | 19 | b w o | |
ecp384 | 384 bits | 20 | b w o | |
ecp521 | 521 bits | 21 | b w o |
Grupos de Curvas Elípticas Brainpool
Palabra Clave | Modulus | IANA | IKE | Complementos |
---|---|---|---|---|
ecp224bp | 224 bits | 27 | o | |
ecp256bp | 256 bits | 28 | b w o | |
ecp384bp | 384 bits | 29 | b w o | |
ecp512bp | 512 bits | 30 | b w o |
Grupos Modernos de Curvas Elípticas
Palabra Clave | Modulus | IANA | IKE | Complementos |
---|---|---|---|---|
curve25519 o x25519 | 256 bits | 31 | x b w o | curve25519 |
curve448 o x448 | 448 bits | 32 | w o |
Fuente: https://docs.strongswan.org/docs/5.9/config/IKEv2CipherSuites.html
Adicionalmente, puedes añadir conexiones con más extremos a continuación de la última. Indicar que si deseas utilizar en alguna conexión una directiva diferente a las por defecto (%default), puedes indicarla directamente en la configuración de la conexión en particular.
Configuración de la Clave Precompartida (PSK)
La clave precompartida (PSK) se utiliza para la autenticación entre los dos extremos de la VPN. Edita el archivo /etc/ipsec.secrets para agregar tu PSK:
# nano /etc/ipsec.secrets
Reemplaza "MiClaveSecreta" con una clave fuerte y única:
: PSK 'MiClaveSecreta'
También puedes añadir más líneas para configurar cada conexiones con diferentes claves, puedes realizarlo especificando en cada línea con los IDs o IP del extremo izquierdo delante de los dos puntos.
Para aplicar la configuración, simplemente reinicia el IPSec y puedes consultar el estado de las conexiones:
# ipsec restart && ipsec statusall
Configuración del otro extremo
Una vez aplicada la configuración, en el otro lado, la configuración sería:
TIPO = ikev2
IKE = aes256-sha1-modp1024 (DH Group 2)
ESP = aes256-sha1
PSK = MiClaveSecreta
IKE Lifetime = 2h
Key Lifetime = 1h
Left = IP pública del dispositivo en cuestión.
Left subnet = 192.168.1.0/24 (Ejemplo de red interna común)
Right = IP pública del strongswan de Clouding
Right subnet = 10.20.10.0/24 (Ejemplo de red servidores Clouding)
E indicando las IPs y subredes según tu red específica como extremo izquierdo. En el derecho la dirección pública del servidor strongSwan de Clouding y la red privada automática o configurada manualmente en los servidores (Red privada).
Esperamos que este tutorial te haya sido de ayuda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en contactar a soporte@clouding.io ¡Estamos para ayudarte!