Comment faire fonctionner Forticlient dans OSX El Capitan

10

Le logiciel VPN forticlient est borked, lors de l'utilisation d'horizon partagé, depuis OSX El Capitan. Le problème est que les requêtes DNS sont envoyées sur l'interface principale normale au DNS du tunnel VPN.

Comment faire pour que les requêtes DNS soient envoyées via la bonne interface (c'est-à-dire tunnel VPN)

hbogert
la source

Réponses:

11

Réponse modifiée

(Re) amélioré la réponse améliorée de presque tout le monde (@elmart, @ user26312, moi-même). Les modifications ne devraient pas être nécessaires dans le 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

Rendez le fichier dans lequel vous le placez, exécutable et exécutez (après la connexion avec le VPN) avec sudo. Avant que le script n'apporte de modifications, il examine votre itinéraire par défaut actuel et connaît donc votre passerelle et votre interface actuelles.


Ancienne réponse

Ce n'est pas une solution complète, vous devrez faire les deux choses suivantes de haut niveau après chaque configuration de connexion VPN:

  1. Nous devrons définir l'interface du tunnel sur ppp0
  2. Rétablir les routes par défaut (car 1. définit implicitement la mauvaise passerelle par défaut, le tunnel fractionné devrait toujours fonctionner correctement ci-après)

Créez un fichier avec le nom scutil-fortipar exemple

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

Refaire les routes de la passerelle, alors créez un autre fichier, routes-fortiavec ( faites attention aux lignes avec des paramètres spécifiques pour votre réseau):

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

maintenant, exécutez,

$ cat scutil-forti |sudo scutil ; bash routes-forti
hbogert
la source
Mais, ces étapes doivent être annulées après la déconnexion, non?
elmart
1
TL; DR aucun retour n'est nécessaire. Non, la State:/Network/Service/forticlientsslvpn/IPv4clé est là pour commencer une fois que le tunnel VPN est en cours d'exécution et est supprimée lorsque le tunnel VPN est supprimé se déconnecte. Les itinéraires ne sont pas réellement différents de ce qu'ils devraient être.
hbogert
8

J'ai retravaillé la solution de @ hbogert en un script unique plus facile à gérer:

#!/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

Cela suppose que vous utilisez l'interface en0 et la passerelle par défaut 192.168.1.1. Sinon, remplacez-les par vos valeurs correspondantes. Si vous ne les connaissez pas, tapez route get www.google.compour les obtenir. Ensuite:

  • Placez-le dans un fichier (par exemple «fix-vpn») quelque part sur votre chemin.
  • Donnez-lui des autorisations d'exécution ( chmod u+x fix-vpn).
  • Exécutez-le avec sudo ( sudo fix-vpn) juste après vous être connecté à vpn.

Je l'ai essayé et ça marche. Comme je l'ai dit, ce n'est qu'un remaniement d'une solution précédente. Je viens de le poster comme une réponse séparée parce que je n'avais pas assez d'espace dans un commentaire.

BTW, je pensais également que cela pourrait être inclus dans un /etc/ppp/ip-upscript afin qu'il soit automatiquement exécuté lors de la connexion. Mais pour une raison quelconque, cela ne fonctionne pas de cette façon. Si quelqu'un peut expliquer / améliorer cela, veuillez le faire.

elmart
la source
1

MISE À JOUR: Le téléchargement et l'installation de la version 5.4.1 la plus récente et officielle pour Mac OS X corrige tous les problèmes sur Mac OS X El Capitan.

Comme décrit dans le forum Fortinet, il faut télécharger la version la plus récente (mais non publiée) de FortiClient pour résoudre les problèmes sur Mac OS X El Capitan:

https://www.dropbox.com/sh/cb0j4pxw1f8nq84/AABHzZW1bpx1VjzYAmiK00S9a?dl=0

C'était la solution la plus simple pour moi.

asmaier
la source
0

Améliorer un peu la réponse de @ elmart (je pense).

#!/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 cette façon, le script n'a pas besoin d'être modifié (et le changement d'interface ne devrait pas être un problème). xargsest utilisé pour supprimer l'espace.

J'ai également ajouté (même si je ne sais pas si c'est une amélioration):

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

rootcheck "$@"

Au tout début du script pour rappeler aux gens d'utiliser sudo.

user26312
la source
Il serait préférable d'utiliser une adresse IP dans la route getcommande pour éliminer la dépendance au DNS.
kasperd
Comme le problème de cette question concerne le split brain, même après la connexion du VPN, votre itinéraire par défaut est probablement votre passerelle. Vous pouvez simplement gratter $ netstat -rnpour obtenir la passerelle et l'interface.
hbogert
0

J'ai pris le script de hbogert et l'ai enveloppé dans Applescript pour moi et un autre employé, il est disponible ici: https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl=0

Connectez-vous simplement au VPN, puis exécutez l'application et saisissez votre mot de passe administrateur (requis pour sudo). REMARQUE: DOIT ÊTRE ENREGISTRÉ DANS / Applications /

michael.therrien
la source
0

J'ai résolu le problème pour moi en reconfigurant les paramètres DNS pour utiliser les serveurs DNS de Google avant ceux fournis par FortiClient. Malheureusement, cela doit être fait après chaque reconnexion.

#!/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

Des détails à ce sujet peuvent être trouvés ici .

Christoph Hermann
la source
Que se passe-t-il si j'ai besoin du DNS de mon entreprise pour résoudre les noms d'hôtes dans le réseau de l'entreprise?
hbogert
Cela dépend de la façon dont le VPN est configuré. Normalement, les serveurs DNS "internes" sont transmis à votre machine. Ce sont celles que j'ai appelées "<ADRESSES IP POUR DNS DE FORTICLIENT>". Si votre machine ne peut pas résoudre une adresse avec 8.8.8.8 ou 8.8.4.4, elle utilise les serveurs DNS définis par les adresses IP dans "<ADRESSES IP POUR DNS DE FORTICLIENT>".
Christoph Hermann
0

Sur ma version actuelle d'OS X (Sierra 10.12.6) et FortiClient 5.6.1, il semble que si ServerAddresses a plus de 2 adresses, alors l'appel "set" ne persiste rien (si vous "obtenez", rien n'aura été actualisé). Pour contourner ce problème, j'ai décidé de ne conserver que la première adresse DNS FortiClient et de la fusionner avec mon adresse DNS publique (8.8.8.8).

De plus, je suggère d'exécuter automatiquement le script bash sur FortiClient connect: cela peut être fait en exportant le script de configuration FortiClient puis en le réimportant

Guide complet ci-dessous:

1 / Créez le script bash suivant et stockez-le quelque part (dans mon cas, c'était dans ~/bashscripts/update-forticlient-dns.sh) et n'oubliez pas de remplacer le <FIRST IP ADDRESS FOR FORTICLIENT DNS>par le résultat scutil --dns | grep "nameserver\[0\]"pendant que votre connexion FortiClient est établie

#!/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 / Exécutez FortiClient, puis allez dans Préférences > Général et cliquez sur le bouton Sauvegarder qui exportera votre configuration FortiClient dans un fichier

3 / Dans ce fichier, recherchez et modifiez le / forticlient_configuration / vpn / sslvpn / connections / connection [name = "YOUR CONNECTION"] / on_connect / script / script node et appelez votre script à l'intérieur:

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

4 / Revenez à la console FortiClient, cliquez sur le verrou dans le coin inférieur gauche, puis allez dans Préférences > Général et cliquez sur le bouton Restaurer : localisez votre fichier de configuration mis à jour et c'est tout, votre configuration DNS sera mise à jour à la volée à chaque fois que vous connectez-vous au VPN.

Frédéric
la source