Cómo configurar VPN tradicional (IPsec) para conectar a servicios mediante software libre

Existen muchas instituciones con las que en algún momento tal vez haya que conectar un túnel VPN tradicional. Suele proporcionarse un documento con información de configuración para los parámetros a utilizar en los dispositivos hardware, con campos tipo “Phase 1 Algorithm”, “PSK”, etc. Básicamente se trata de IPsec.

La tradición en estos casos parece requerir desembolsar dinero en infraestructura, pero no es necesario. Puede hacerse perfectamente por software y usando un servidor virtual cualquiera con IP pública, sin requerir múltiples máquinas, contenedores o configuraciones complejas de cortafuegos o de NAT. Y aprovechar ese mismo servidor virtual para la comunicación, sin apenas consumir memoria RAM o recursos significativos del sistema.

En este caso se presenta la forma de realizarlo con Libreswan utilizando una interfaz virtual túnel (VTI) de Linux y muy pocas líneas de configuración. Tras instalar el paquete libreswan, se muestra el ejemplo típico de utilizar una frase de paso precompartida como llave (PSK).

Hay algunos conceptos no obvios en esta guía. En este tipo de redes VPN, se hablará de los lados “izquierdo” y “derecho” de la conexión. El lado propio podría ser cualquiera de los dos. Los grupos Diffie-Hellman (DH) cuando se documentan como grupos, en los de tipo MODP, grupo 1 es 768, 2 es 1024, 5 es 1536, 14 es 2048, 15 es 3072. En los de tipo ECP, grupo 19 es 256, 20 es 384, entre otros.

Los ficheros de configuración se crearán en la ruta /etc/ipsec.d/ donde se puede crear uno o más ficheros de configuración (*.conf) y uno o más ficheros de configuración de secretos (*.secrets). Para este ejemplo se creará un fichero ejemplo.conf. Podría usarse el nombre de la conexión o usar un fichero para cada tipo de conexión, en caso de tener más de una VPN con otros proveedores o incluso con el mismo. También se podría configurar más de una conexión por fichero .conf.

Asumimos que el proveedor nos proporciona una frase PSK, por lo que creamos un fichero ejemplo.secrets que contendrá las direcciones IP externas (públicas en nuestro caso, la nuestra y la del proveedor), separadas por espacios. Luego el símbolo : y el tipo de secreto, en este ejemplo un PSK, por lo que se agrega PSK y luego el valor del PSK entrecomillado, por ejemplo "FraseLargaYSecreta":

203.0.113.1 198.51.100.1 : PSK "FraseLargaYSecreta"

Tras guardar ese fichero como ejemplo.secrets, se crea otro fichero, ahora con la configuración de la conexión:

conn ejemplo-de-conexion
    auto=start
    authby=secret
    left=203.0.113.1
    leftsourceip=192.168.1.1
    leftsubnet=192.168.1.1/32
    leftvti=192.168.1.1/32
    right=198.51.100.1
    rightsourceip=192.168.2.1
    rightsubnet=192.168.2.1/32
    vti-interface=vti1
    mark=1/0xffffffff

Se guarda el fichero como ejemplo.conf. Tras iniciar el servicio ipsec de Libreswan, tratará de conectar automáticamente negociando parámetros de conexión. Es bastante común encontrar muchas marcas y modelos de hardware cuyas capacidades de negociación IPsec son mediocres a pesar de su elevado precio, por lo que suelen cortar la conexión durante la negociación automática, requiriendo ajustar manualmente los parámetros. En estos casos se pueden revisar los registros de ipsec con el comando sudo journalctl -eu ipsec y comprobar el estado de las conexiones ipsec mediante el comando sudo ipsec status donde indicará si la conexión o conexiones IPsec están activas.

Ejemplos de algunos de parámetros que se pueden agregar y ajustar según la configuración que haya proporcionado el proveedor. Algunos dispositivos por ejemplo no funcionan si se negocia IKEv2, en otros hay que limitar los algoritmos en ike, también conocido como fase 1 o ISAKMP SA, o en esp, también conocido como fase 2, Child SA o IPsec SA, en algunos casos también definir sus tiempos de espera, por ejemplo:

    ikev2=no
    ike=aes256-sha1;modp1024
    esp=aes256-sha1;modp1536
    ikelifetime=1h
    salifetime=1d

El parámetro vti-interface hará que se cree una interfaz túnel virtual (VTI) con el nombre indicado (vti1 en el ejemplo). A Linux se le indica que el tráfico marcado con un número específico y una máscara de bits para que filtre esos datos para que pasen por esa interfaz. Libreswan se encargará de crear el túnel y la configuración de encaminamiento.

Se puede ver si pasa tráfico por la interfaz túnel con el comando ip -s tunnel show donde mostrará la cantidad de paquetes transmitidos y recibidos. Con el comando tcpdump -i vti1 -n se verá el tráfico entre las direcciones IP internas, por ejemplo entre 192.168.1.1 y 192.168.2.1. Con el comando tcpdump -n esp or udp port 4500 se observará el tráfico ESP que transita entre las direcciones IP externas, por ejemplo entre 203.0.113.1 y 198.51.100.1.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *