Cómo conseguir que Forticlient trabaje en OSX El Capitan

10

El software VPN forticlient se borked, cuando se utiliza el horizonte dividido, desde OSX El Capitan. El problema es que las solicitudes de DNS se envían en la interfaz primaria normal al DNS del túnel VPN.

¿Cómo obtenemos que las solicitudes de DNS se envíen a través de la interfaz correcta (es decir, el túnel VPN)

hbogert
fuente

Respuestas:

11

Respuesta editada

(Re) mejoró la respuesta mejorada de casi todos los demás (@elmart, @ user26312, yo mismo). Las ediciones no deberían ser necesarias en el script:

#!/bin/bash
default_line=$(netstat -rn |grep default)
gateway=$(echo $default_line | awk '{print $2}')
interface=$(echo $default_line | awk '{print $6}')
echo $gateway
echo $interface

scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF

route delete default
route delete -ifscope $interface default
route add -ifscope $interface default $gateway
route add -net 0.0.0.0 -interface $interface

Haga que el archivo en el que lo colocó sea ejecutable y ejecute (después de conectarse con la VPN) con sudo. Antes de que el script realice algún cambio, analiza su ruta predeterminada actual y, por lo tanto, conoce su puerta de enlace e interfaz actuales.


Vieja respuesta

No es una solución completa, tendrá que hacer las siguientes dos cosas de alto nivel después de cada configuración de conexión VPN:

  1. Tendremos que configurar la interfaz del túnel para ppp0
  2. Rehacer rutas predeterminadas (porque 1. establece implícitamente la puerta de enlace predeterminada incorrecta, el túnel dividido debería funcionar correctamente de aquí en adelante)

Cree un archivo con el nombre, scutil-fortipor ejemplo

d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4

Rehaga las rutas de la puerta de enlace, así que cree otro archivo, routes-forticon ( tenga en cuenta las líneas con configuraciones específicas para su red):

sudo route delete default
sudo route delete  -ifscope en0 default # This line depends on your interface
sudo route add -ifscope en0 default 192.168.2.252  # This depends on your normal local gateway.
sudo route add -net 0.0.0.0 -interface en0

ahora ejecuta

$ cat scutil-forti |sudo scutil ; bash routes-forti
hbogert
fuente
Pero, estos pasos deberían revertirse después de desconectarse, ¿no?
elmart
1
TL; DR no se necesita revertir. No, la State:/Network/Service/forticlientsslvpn/IPv4clave está ahí para comenzar una vez que el túnel VPN se está ejecutando y se elimina cuando se desconecta el túnel VPN. Las rutas no son realmente diferentes de lo que deberían ser.
hbogert
8

He reelaborado la solución de @ hbogert en un script único más manejable:

#!/bin/bash

scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF

route delete default
route delete -ifscope en0 default
route add -ifscope en0 default 192.168.1.1
route add -net 0.0.0.0 -interface en0

Eso supone que está utilizando la interfaz en0 y la puerta de enlace predeterminada 192.168.1.1. Si no, reemplácelos con sus valores correspondientes. Si no los conoce, escriba route get www.google.compara obtenerlos. Luego:

  • Colóquelo en un archivo (por ejemplo, 'fix-vpn') en algún lugar de su ruta.
  • Déle permisos de ejecución ( chmod u+x fix-vpn).
  • Ejecútelo con sudo ( sudo fix-vpn) justo después de conectarse a vpn.

Lo he intentado y funciona. Como dije, esto es solo una revisión de una solución anterior. Lo publiqué como una respuesta separada porque no tenía suficiente espacio en un comentario.

Por cierto, también pensé que esto podría incluirse en un /etc/ppp/ip-upscript para que se ejecute automáticamente al conectarse. Pero por alguna razón, no funciona de esa manera. Si alguien puede explicar / mejorar eso, por favor hágalo.

elmart
fuente
0

Mejorando un poco la respuesta de @elmart (creo).

#!/bin/bash
scutil <<EOF
d.init
get State:/Network/Service/forticlientsslvpn/IPv4
d.add InterfaceName ppp0
set State:/Network/Service/forticlientsslvpn/IPv4
EOF
ROUTE_OUT=$(route get www.google.com)
GATEWAY=$(echo "${ROUTE_OUT}"|grep gateway|cut -d':' -f2|xargs)
INTERFACE=$(echo "${ROUTE_OUT}"|grep interface|cut -d':' -f2|xargs)

echo "Fixing $INTERFACE with gateway $GATEWAY"

route delete default
route delete -ifscope $INTEFACE default
route add -ifscope $INTERFACE default $GATEWAY
route add -net 0.0.0.0 -interface $INTERFACE

De esa manera, el script no necesita ser editado (y cambiar las interfaces no debería ser un problema). xargsse usa para quitar el espacio en blanco.

También he agregado (aunque no sé si esto es una mejora):

rootcheck () {
  if [ $(id -u) != "0" ]
    then
      echo "We need sudo permissions to run this script"
      sudo "$0" "$@"  # Modified as suggested below.
      exit $?
  fi
}

rootcheck "$@"

Hasta el comienzo del guión para recordarle a la gente que use sudo.

usuario26312
fuente
Sería mejor usar una dirección IP en el route getcomando para eliminar la dependencia del DNS.
kasperd
Como el problema de esta pregunta es con el cerebro dividido, incluso después de que la VPN esté conectada, su ruta predeterminada probablemente sea su puerta de enlace. Simplemente puede raspar $ netstat -rnpara obtener la puerta de enlace y la interfaz.
hbogert
0

Resolví el problema por mí volviendo a configurar los ajustes de DNS para usar servidores DNS de Google antes de los proporcionados por FortiClient. Desafortunadamente, esto debe hacerse después de cada reconexión.

#!/bin/bash
scutil <<EOF
d.init
d.add ServerAddresses 8.8.8.8 8.8.4.4 <IP ADDRESSES FOR DNS FROM FORTICLIENT>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF

Los detalles sobre esto se pueden encontrar aquí .

Christoph Hermann
fuente
Entonces, ¿qué sucede si necesito el DNS de mi empresa para resolver nombres de host en la red de la empresa?
hbogert
Esto depende de cómo esté configurada la VPN. Normalmente, los servidores DNS "internos" se transfieren a su máquina. Estos son los que llamé "<DIRECCIONES IP PARA DNS DE FORTICLIENT>". Si su máquina no puede resolver una dirección con 8.8.8.8 o 8.8.4.4, utiliza los servidores DNS definidos por las direcciones IP en "<DIRECCIONES IP PARA DNS DE FORTICLIENT>".
Christoph Hermann
0

En mi versión actual de OS X (Sierra 10.12.6) y FortiClient 5.6.1 parece que si ServerAddresses tiene más de 2 direcciones, entonces la llamada "set" no persiste nada (si "obtiene", nada habrá sido actualizado). Para solucionar esto, decidí mantener solo la primera dirección DNS de FortiClient y fusionarla con mi dirección DNS pública (8.8.8.8).

Además, sugeriría ejecutar automáticamente el script bash en FortiClient connect: esto se puede hacer exportando el script de configuración de FortiClient y luego volviendo a importarlo

Guía completa a continuación:

1 / Cree el siguiente script de bash y guárdelo en algún lugar (en mi caso, estaba en ~/bashscripts/update-forticlient-dns.sh) y no olvide reemplazarlo <FIRST IP ADDRESS FOR FORTICLIENT DNS>por el resultado de scutil --dns | grep "nameserver\[0\]"mientras su conexión FortiClient está activa

#!/bin/bash

ROOT_PASSWORD=$1

# Uncomment this if you want to log everything happening during this script execution into a dedicated log file
# exec >/tmp/forticlient-log 2>&1

# Ensuring we did a sudo correctly once
# Because we cannot both use a pipe and an stdin redirection at the same time
# (or at least, my bash knowledge is not wide enough for that :-))
echo "$ROOT_PASSWORD" | sudo -S ls /dev/null
sudo scutil <<EOF
get State:/Network/Service/forticlientsslvpn/DNS
d.add ServerAddresses 8.8.8.8 <FIRST IP ADDRESS FOR FORTICLIENT DNS>
set State:/Network/Service/forticlientsslvpn/DNS
quit
EOF

2 / Ejecute FortiClient, luego vaya a Preferencias > General y haga clic en el botón Copia de seguridad que exportará su configuración de FortiClient a un archivo

3 / En este archivo, localice y edite el / forticlient_configuration / vpn / sslvpn / connections / connection [name = "YOUR CONNECTION"] / on_connect / script / script y llame a su script dentro de él:

<on_connect>
   <script>
      <os>mac</os>
      <script>/Users/fcamblor/bashscripts/update-forticlient-dns.sh "your_secret_root_password_here"</script>
    </script>
</on_connect>

4 / Vuelva a la consola de FortiClient, haga clic en el candado en la esquina inferior izquierda, luego vaya a Preferencias > General y haga clic en el botón Restaurar : ubique su archivo de configuración actualizado y listo , su configuración de DNS se actualizará sobre la marcha cada vez que conectarse a la VPN.

Frédéric
fuente