Bearbeitete Antwort

Bearbeitete Antwort

Die Forticlient-VPN-Software funktioniert seit OSX El Capitan nicht mehr, wenn Split Horizon verwendet wird. Das Problem besteht darin, dass DNS-Anfragen über die normale primäre Schnittstelle an den DNS des VPN-Tunnels gesendet werden.

Wie erreichen wir, dass die DNS-Anfragen über die richtige Schnittstelle (z. B. VPN-Tunnel) gesendet werden?

Antwort1

Bearbeitete Antwort

(Erneut) verbessert auf Grundlage der verbesserten Antworten von fast allen anderen (@elmart, @user26312, ich selbst). Änderungen im Skript sollten 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 der 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

Dies ist keine vollständige Lösung. Sie müssen nach der Einrichtung jeder VPN-Verbindung die folgenden beiden wichtigen Dinge tun:

  1. Wir müssen die Schnittstelle des Tunnels so einstellen:ppp0
  2. Standardrouten wiederholen (da 1. implizit das falsche Standard-Gateway einstellt, sollte der Split-Tunnel danach immer noch korrekt funktionieren)

Erstellen Sie eine Datei mit dem Namen scutil-fortibeispielsweise

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

Wiederholen Sie die Gateway-Routen, indem Sie eine weitere Datei routes-fortimit folgendem Inhalt erstellen (beachten Sie die Zeilen mit 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

Antwort2

Ich habe die Lösung von @hbogert in ein einzelnes, besser handhabbares Skript umgearbeitet:

#!/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 Schnittstelle en0 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 sie ein, route get www.google.comum sie abzurufen. 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, direkt nachdem Sie eine Verbindung zum VPN hergestellt haben.

Ich habe es ausprobiert 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 in einem Kommentar nicht genug Platz hatte.

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

Antwort3

Ich konnte eine ältere Version von Forticlient verwenden und bestätigen, dass es funktioniert!

Hier ist der Link dazu in meiner Dropbox:

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

Antwort4

Ich glaube, ich verbessere die Antwort von @elmart ein wenig.

#!/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 darstellen). xargswird verwendet, um die Leerzeichen zu entfernen.

Ich habe außerdem hinzugefügt (obwohl ich nicht weiß, ob das 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 "$@"

Ganz an den Anfang des Skripts, um die Leute daran zu erinnern, sudo zu verwenden.

verwandte Informationen