openconnect + vpn-slice o cómo seguir navegando directamente por Internet al conectar la VPN de empresa (split tunneling)

Normalmente, los administradores de seguridad perimetral de una empresa configurarán sus concentradores VPN para forzar una ruta predeterminada a los usuarios, de tal manera que todo el tráfico se enrute a través de la conexión vpn. Esto se traduce en que los usuarios deberán salir también a Internet a través de la infraestructura y filtrado corporativos.

Sin embargo, aunque el administrador de VPN de turno puede enviar rutas al cliente, éstas pueden ser ignoradas y establecer un enrutamiento de modo que solo la red A.B.C.D/E requerida se enrute a través de la VPN. El resto del tráfico seguirá utilizando las rutas y la conexión a Internet saliente que se tenían antes de conectar a la VPN.

Esto se denomina enrutamiento VPN de túnel dividido (split-tunneling) y en esta entrada veremos cómo hacerlo mediante:
- openconnect: un cliente VPN de código abierto concebido para ser una alternativa al cliente propietario Cisco Anyconnect y compatible con su servidor
- vpn-slice: un script en bash que reemplaza al que te viene por defecto con openconnect y que facilita añadir y eliminar rutas para realizar el split tunnel

Instalación OpenConnect

$ sudo apt-get install openconnect lib32ncurses5 lib32tinfo5 lib32z1 libc6-i386 libpkcs11-helper1 openvpn vpnc-scripts

El binario openconnect no podrá crear el túnel tun0 sin que se le otorgue alguna capacidad o capability root para administrar redes; consulta las capabilities de Linux (man 7 capabilities) para obtener más detalle.

sudo setcap cap_net_admin+ep /usr/bin/openconnect

Para comprobar que la capacidad se ha añadido correctamente:

getcap -rv /usr/sbin/openconnect
/usr/sbin/openconnect = cap_net_admin+ep

Instalación vpn-slice

Como os comentaba vpn-slice es un reemplazo para OpenConnect o VPNC que facilita la creación de un split túnel:

- Solo enruta el tráfico de hosts o subredes específicos a través de la VPN
- Busca automáticamente nombres de hosts utilizando los servidores DNS de la VPN, y agrega entradas para ellos en /etc/hosts (que limpia después de la desconexión de VPN), sin embargo, no altera /etc/resolv.conf.

Necesitaremos Python 3.3+, dig, iproute2 e iptables:

apt-get install -y python3-pip
pip3 install https://github.com/dlenski/vpn-slice/archive/master.zip

Estableciendo una conexión VPN

Al establecer una conexión VPN contra la red corporativa debemos enrutar la subred requerida a través del túnel. El comando tipo sería:
sudo openconnect <corporate-vpn-endpoint> \
     -m 1290 \
     -u <your-vpn-user> \
     --servercert sha256:<0446a7EXAMPLE8901278394> \
     -s 'vpn-slice <10.10.0.0/14>'

- La primera vez que te conectas, openconnect mostrará el shasum del servercert, en las conexiones siguientes se puede usar ese shasum como el valor para --servercert
- Hay que reemplazar <10.10.0.0/14> con la subred que desea enrutar sobre el vpn corporativo.

Estas son las rutas antes de establecer la vpn:
default via 10.1.1.1 dev wlp4s0 proto static metric 600
10.1.1.0/24 dev wlp4s0 proto kernel scope link src 10.1.1.50 metric 600
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1

Estas son las rutas después de conectarse a la vpn. vpn-slice solo creará rutas para la subred VPN y los servidores DNS de la VPN. Como veis, la ruta predeterminada que no ha cambiado después de conectarse la VPN.
default via 10.1.1.1 dev wlp4s0 proto static metric 600
10.1.1.0/24 dev wlp4s0 proto kernel scope link src 10.1.1.50 metric 600
10.10.0.0/14 dev tun0 scope link
10.10.0.0/14 dev tun0 scope link metric 6
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
180.10.34.165 dev tun0 scope link
180.10.34.165 dev tun0 scope link metric 6

Fuentes:
- Split tunneling with openconnect
- vpnc-script replacement for easy and secure split-tunnel VPN setup

Comentarios

  1. Buenas,

    ¿Esto funciona cuando es necesario tener un cliente dedicado tipo Fortinet o Globalprotect de palo alto? (lo digo por vpn-slice, que lo desconozco, el OpenConnect ya se que no, que es el que tiene que levantar directamente el túnel)

    ResponderEliminar
    Respuestas
    1. vpn-slice es un reemplazo de vpnc-script y sólo funciona con openconnect y vpnc, que a su vez son compatibles con Cisco y, en teoria porque no lo he probado, con Juniper/Netscreen. Me temo que esta herramienta/script no funciona para Fortinet o Palo alto

      Eliminar
  2. ¿Ésto es lo que hay bajo el capó de la VPN de hackthebox?

    ResponderEliminar

Publicar un comentario