jueves, 3 de marzo de 2022

OpenConnect VPN en macOS No Resuelve DNS - Solución

 


Al utilizar OpenConnect VPN para conectarnos a intranets de nuestros clientes, depende de la configuración de la VPN a veces la resolución de DNS ocurre de forma automática y a veces no.

Cuando esto no ocurre, el acceso a los diferentes sitios de la intranet se complica y empiezan los errores. Si este es tu caso, te invito a leer el siguiente articulo exclusivo para usuarios de macOS para resolver esta situación particular.

¿Que es OpenConnect VPN?

OpenConnect es un cliente VPN SSL de linea de comandos multiprotocolo y multiplataforma que soporta varios protocolos VPN, entre ellos:

  • Cisco AnyConnect (--protocol=anyconnect)
  • Fortinet Fortigate SSL VPN (--protocol=fortinet)
  • Array Networks AG SSL VPN (--protocol=array)
  • Juniper SSL VPN (--protocol=nc)
  • Pulse Connect Secure (--protocol=pulse
  • Palo Alto Networks GlobalProtect SSL VPN (--protocol=gp)
  • F5 Big-IP SSL VPN (--protocol=f5)


¿Cómo se usa?

Para usar OpenConnect VPN es por medio de una terminal o linea de comandos. Y como hace uso exclusivo de recursos de red y demás, es necesario darle permisos de administrador (con sudo generalmente).

Una forma genérica de conectarse a una VPN es ejecutando el comando:

sudo openconnect url-de-vpn:8443 --protocol=fortinet -u miusuario -p micontraseña

Notar que ademas de la URL (o gateway), Puerto, Usuario y Contraseña... OpenConnect acepta más parámetros que pueden personalizar la forma en que se conectará a la VPN.

Uno de los más usados es el parámetro --no-system-trust para evitar validar certificados SSL autofirmados.


OpenConnect VPN No Resuelve Los DNS

¿Cómo Lo Soluciono?

A veces, según la configuración de la VPN de destino, OpenConnect no resuelve de forma automática los DNS. Por ejemplo: si en la intranet existe una url con el DNS miapp.intranet.cliente.net y deseamos acceder desde un navegador, probablemente falle.

Una forma de comprobar si efectivamente el error se debe a que no esta resolviendo los DNS, podemos ejecutar un comando CURL de la siguiente manera:

Hay 2 formas de arreglar esto:

1- Editando manualmente el archivo /etc/hosts y mapeando la URL a una IP. Es decir, por ejemplo:

miapp.intranet.cliente.net        10.0.0.1

2- Indicandole a macOS que tenga en cuenta un servidor DNS adicional del lado de la VPN para resolver estos DNS particulares.

Para esta segunda opción para arreglar el problema, podemos valernos de un par de comandos que podemos ejecutar en la terminal y que configuren nuestro macOS de forma automática:

ACTIVE_INTERFACE=$(route -n get default | grep interface | awk '{print $2}')

ACTIVE_NETWORK_SERVICE=$(networksetup -listnetworkserviceorder | grep -B 1 "$ACTIVE_INTERFACE" | head -n 1 | awk '/\([0-9]+\)/{ print }'|cut -d " " -f2-)

CURRENT_IP4_DNS=$(networksetup -getdnsservers $ACTIVE_NETWORK_SERVICE)

VPN_IP4_DNS=10.1.2.3

networksetup -setdnsservers "$ACTIVE_NETWORK_SERVICE" $CURRENT_IP4_DNS $VPN_IP4_DNS

Tener en cuenta que la variable VPN_IP4_DNS el valor debemos sustituirlo por el que indica OpenConnect a la hora de conectarse a la VPN.

Es decir, primero debemos utilizar OpenConnect para conectarnos a la VPN (la salida del comando openconnect arrojará el dato de la IP del DNS) y luego ejecutamos los comandos anteriores, en ese orden en especifico.

Por ejemplo:

sudo openconnect url-de-vpn:8443 --protocol=fortinet -u miusuario -p micontraseña

Conectado a HTTPS en url-de-vpn con ciphersuite (TLS1.3)-(ECDHE-SECP384R1)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM)

Se obtuvo la respuesta HTTP: HTTP/1.1 200 OK

POST https://url-de-vpn:8443/remote/logincheck

Se obtuvo la respuesta HTTP: HTTP/1.1 200 OK

Server: xxxxxxxx-xxxxx

...

Transfer-Encoding: chunked

Content-Type: text/xml

X-Frame-Options: SAMEORIGIN

...

DTLS está activado en el puerto 8443

...

Recibido servidor DNS IPv4 10.1.2.3

Recibido servidor DNS IPv4 10.1.2.4

Recibida dirección IP heredada 10.1.1.5

Recibida ruta IPv4 x.x.x.x

...

Si prestamos atención, en la salida (marcado con color rojo), se logra ver la IP del servidor DNS del lado de la VPN (de la intranet).

Este valor lo necesitaremos conocer antes de ejecutar los comandos de la 2da solución.

De esta manera, el servidor DNS nos resolverá por sí solo cualquier URL que exista en la intranet y nos evitará tener que editar el archivo /etc/hosts con cada IP que queramos visitar.


Cualquier comentario, duda o sugerencia pueden dejarla con respeto en la caja de comentarios de este articulo. 

No hay comentarios:

Publicar un comentario