Wie man Forticlient in OSX El Capitan zum Laufen bringt


10

Die forticlient VPN-Software ist bei Verwendung von Split Horizon seit OSX El Capitan kaputt. Das Problem ist, dass DNS-Anforderungen über die normale primäre Schnittstelle an das DNS des VPN-Tunnels gesendet werden.

Wie erhalten wir die DNS-Anfragen, die über die richtige Schnittstelle (dh VPN-Tunnel) gesendet werden?

Antworten:


11

Bearbeitete Antwort

(Re) verbesserte die verbesserte Antwort fast aller anderen (@elmart, @ user26312, ich selbst). Änderungen sollten im Skript nicht erforderlich sein:

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

Machen Sie die Datei, in die Sie dies einfügen, ausführbar und führen Sie sie (nach dem Herstellen einer Verbindung mit dem VPN) mit sudo aus. Bevor das Skript Änderungen vornimmt, überprüft es Ihre aktuelle Standardroute und kennt daher Ihr aktuelles Gateway und Ihre aktuelle Schnittstelle.


Alte Antwort

Da dies keine vollständige Lösung ist, müssen Sie nach jedem VPN-Verbindungsaufbau die folgenden zwei allgemeinen Schritte ausführen:

  1. Wir müssen die Schnittstelle des Tunnels auf einstellen ppp0
  2. Standardrouten wiederholen (da 1. implizit das falsche Standardgateway festlegt, sollte der geteilte Tunnel im Folgenden weiterhin ordnungsgemäß funktionieren)

Erstellen Sie eine Datei mit dem Namen scutil-fortizum Beispiel

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

Wiederholen Sie die Gateway-Routen, und erstellen Sie eine weitere Datei routes-fortimit (beachten Sie die Zeilen mit den spezifischen Einstellungen für Ihr Netzwerk):

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

jetzt ausführen,

$ cat scutil-forti |sudo scutil ; bash routes-forti

Aber diese Schritte sollten nach dem Trennen der Verbindung zurückgesetzt werden müssen, nicht wahr?
Elmart

1
TL; DR ist kein Zurücksetzen erforderlich. Nein, der State:/Network/Service/forticlientsslvpn/IPv4Schlüssel beginnt mit dem Ausführen des VPN-Tunnels und wird gelöscht, wenn der VPN-Tunnel gelöscht wird. Die Routen unterscheiden sich eigentlich nicht von dem, was sie sein sollten.
Hbogert

8

Ich habe die Lösung von @ hbogert in ein übersichtlicheres Einzelskript überarbeitet:

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

Dies setzt voraus, dass Sie die en0-Schnittstelle und das Standard-Gateway 192.168.1.1 verwenden. Wenn nicht, ersetzen Sie diese durch Ihre entsprechenden Werte. Wenn Sie sie nicht kennen, geben Sie ein, route get www.google.comum sie zu erhalten. Dann:

  • Platzieren Sie das in einer Datei (z. B. 'fix-vpn') irgendwo in Ihrem Pfad.
  • Geben Sie ihm Ausführungsberechtigungen ( chmod u+x fix-vpn).
  • Führen Sie es mit sudo ( sudo fix-vpn) aus, sobald Sie eine Verbindung zu vpn hergestellt haben.

Ich habe es versucht und es funktioniert. Wie gesagt, dies ist nur eine Überarbeitung einer früheren Lösung. Ich habe es nur als separate Antwort gepostet, weil ich nicht genug Platz in einem Kommentar hatte.

Übrigens dachte ich auch, dass dies in ein /etc/ppp/ip-upSkript aufgenommen werden könnte, damit es beim Verbinden automatisch ausgeführt wird. Aber aus irgendeinem Grund funktioniert es nicht so. Wenn jemand das erklären / verbessern kann, bitte.




0

Die Antwort von @ elmart ein wenig verbessern (glaube ich).

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

Auf diese Weise muss das Skript nicht bearbeitet werden (und das Ändern von Schnittstellen sollte kein Problem sein). xargswird verwendet, um das Leerzeichen zu entfernen.

Ich habe auch hinzugefügt (obwohl ich nicht weiß, ob dies eine Verbesserung ist):

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

rootcheck "$@"

Bis zum Anfang des Skripts, um die Leute daran zu erinnern, Sudo zu verwenden.


Es ist besser, eine IP-Adresse im route getBefehl zu verwenden, um die Abhängigkeit von DNS zu beseitigen.
Kasperd

Da das Problem dieser Frage bei Split Brain liegt, ist Ihre Standardroute wahrscheinlich auch nach dem Verbinden des VPN Ihr Gateway. Sie können nur kratzen $ netstat -rn, um das Gateway und die Schnittstelle zu erhalten.
Hbogert


0

Ich habe das Problem für mich gelöst, indem ich die DNS-Einstellungen neu konfiguriert habe, um Google DNS-Server vor den von FortiClient bereitgestellten zu verwenden. Leider muss dies nach jeder erneuten Verbindung erfolgen.

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

Details dazu finden Sie hier .


Was passiert also, wenn ich das DNS meines Unternehmens zum Auflösen von Hostnamen im Unternehmensnetzwerk benötige?
Hbogert

Dies hängt davon ab, wie das VPN konfiguriert ist. Normalerweise werden die "internen" DNS-Server an Ihren Computer weitergeleitet. Dies sind die, die ich "<IP-ADRESSEN FÜR DNS VON FORTICLIENT>" genannt habe. Wenn Ihr Computer eine Adresse mit 8.8.8.8 oder 8.8.4.4 nicht auflösen kann, verwendet er die DNS-Server, die durch die IP-Adressen in "<IP-ADRESSEN FÜR DNS VON FORTICLIENT>" definiert sind.
Christoph Hermann

0

In meiner aktuellen OS X-Version (Sierra 10.12.6) und FortiClient 5.6.1 scheint es so, als ob der "set" -Aufruf nichts fortsetzt, wenn ServerAddresses mehr als 2 Adressen hat (wenn Sie "erhalten"), ist nichts gewesen Aktualisiert). Um dies zu umgehen, habe ich beschlossen, nur die erste FortiClient-DNS-Adresse beizubehalten und mit meiner öffentlichen DNS-Adresse (8.8.8.8) zusammenzuführen.

Darüber hinaus würde ich vorschlagen, das Bash-Skript automatisch auf FortiClient Connect auszuführen: Dies kann durch Exportieren des FortiClient-Konfigurationsskripts und anschließendes erneutes Importieren erfolgen

Vollständige Anleitung unten:

1 / Erstellen Sie das folgende Bash-Skript und speichern Sie es irgendwo (in meinem Fall war es in ~/bashscripts/update-forticlient-dns.sh). Vergessen Sie nicht, das <FIRST IP ADDRESS FOR FORTICLIENT DNS>durch das Ergebnis zu ersetzen, scutil --dns | grep "nameserver\[0\]"während Ihre FortiClient-Verbindung besteht

#!/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 / Führen Sie FortiClient aus, gehen Sie zu Einstellungen > Allgemein und klicken Sie auf die Schaltfläche Sichern , um Ihre FortiClient-Konfiguration in eine Datei zu exportieren

3 / Suchen und bearbeiten Sie in dieser Datei den Knoten / forticlient_configuration / vpn / sslvpn / connection / connection [name = "IHRE VERBINDUNG"] / on_connect / script / script und rufen Sie Ihr Skript darin auf:

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

4 / Kehren Sie zur FortiClient-Konsole zurück, klicken Sie auf das Schloss in der unteren linken Ecke, gehen Sie zu Einstellungen > Allgemein und klicken Sie auf die Schaltfläche Wiederherstellen : Suchen Sie Ihre aktualisierte Konfigurationsdatei, und fertig , Ihre DNS-Konfiguration wird jedes Mal im laufenden Betrieb aktualisiert Stellen Sie eine Verbindung zum VPN her.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.