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:
- Tendremos que configurar la interfaz del túnel para
ppp0
- 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-forti
por 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-forti
con (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.com
para 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-up
script 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). xargs
se 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.