Respuesta editada

Respuesta editada

El software VPN forticlient está bloqueado cuando se usa horizonte dividido, desde OSX El Capitan. El problema es que las solicitudes de DNS se envían a través de la interfaz principal normal al DNS del túnel VPN.

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

Respuesta1

Respuesta editada

(Re)mejorado en casi la respuesta mejorada de todos los demás (@elmart, @user26312,yo mismo). No deberían ser necesarias modificaciones 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 puso sea ejecutable y ejecútelo (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.


Antigua respuesta

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

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

Crea 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

Respuesta2

He modificado 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. De lo contrario, reemplácelos con sus valores correspondientes. Si no los conoces, escribe route get www.google.compara obtenerlos. Entonces:

  • Colóquelo en un archivo (por ejemplo, 'fix-vpn') en algún lugar de su ruta.
  • Dale 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 probado y funciona. Como dije, esto es solo una reelaboració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.

Respuesta3

¡Pude usar una versión anterior de Forticlient y confirmé que funciona!

Aquí está el enlace en mi Dropbox:

https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0

Respuesta4

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 no es necesario editar el script (y cambiar las interfaces no debería ser un problema). xargsse utiliza para eliminar los espacios en blanco.

También agregué (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 "$@"

Desde el principio del script para recordarle a la gente que use sudo.

información relacionada