Jak zdobyć fortunlient w OSX El Capitan

10

Oprogramowanie Forticlient VPN jest błędne, gdy używa się podzielonego horyzontu, od OSX El Capitan. Problem polega na tym, że żądania DNS są wysyłane przez zwykły podstawowy interfejs do DNS tunelu VPN.

W jaki sposób otrzymujemy żądania DNS wysyłane za pośrednictwem właściwego interfejsu (tj. Tunelu VPN)

Hbogert
źródło

Odpowiedzi:

11

Edytowana odpowiedź

(Re) poprawione na podstawie prawie poprawionej odpowiedzi wszystkich (@elmart, @ user26312, ja). W skrypcie nie powinny być potrzebne zmiany:

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

Spraw, aby plik, który wstawiłeś, był wykonywalny i uruchom (po połączeniu z VPN) za pomocą sudo. Zanim skrypt dokona jakichkolwiek zmian, sprawdza twoją domyślną trasę i dlatego zna twoją aktualną bramę i interfejs.


Stara odpowiedź

Nie jest to kompletne rozwiązanie, po każdej konfiguracji połączenia VPN musisz wykonać dwie rzeczy wysokiego poziomu:

  1. Będziemy musieli ustawić interfejs tunelu na ppp0
  2. Ponów domyślne trasy (ponieważ 1. domyślnie ustawia niewłaściwą domyślną bramę, podzielony tunel powinien dalej działać poprawnie)

Utwórz plik o nazwie scutil-fortina przykład

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

Ponów trasy bramy, więc utwórz kolejny plik, routes-fortiz (pamiętaj o liniach z określonymi ustawieniami dla swojej sieci):

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

teraz wykonaj,

$ cat scutil-forti |sudo scutil ; bash routes-forti
Hbogert
źródło
Ale te kroki powinny zostać cofnięte po odłączeniu, prawda?
elmart
1
TL; DR nie jest wymagane cofanie. Nie, State:/Network/Service/forticlientsslvpn/IPv4klucz można zacząć od momentu uruchomienia tunelu VPN i jest on usuwany po usunięciu tunelu VPN. Trasy tak naprawdę nie różnią się od tego, jakie powinny być.
hbogert
8

Przerobiłem rozwiązanie @ hbogert na łatwiejszy do zarządzania pojedynczy skrypt:

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

Zakłada się, że używasz interfejsu en0 i domyślnej bramy 192.168.1.1. Jeśli nie, zastąp je odpowiednimi wartościami. Jeśli ich nie znasz, wpisz, route get www.google.comaby je zdobyć. Następnie:

  • Umieść to w pliku (np. „Fix-vpn”) gdzieś na swojej ścieżce.
  • Nadaj mu uprawnienia do wykonywania ( chmod u+x fix-vpn).
  • Uruchom go za pomocą sudo ( sudo fix-vpn) zaraz po podłączeniu do VPN.

Próbowałem i działa. Jak powiedziałem, jest to tylko przeróbka poprzedniego rozwiązania. Właśnie zamieściłem to jako osobną odpowiedź, ponieważ nie miałem wystarczająco dużo miejsca w komentarzu.

BTW, myślałem również, że może to zostać uwzględnione w /etc/ppp/ip-upskrypcie, aby był automatycznie wykonywany podczas łączenia. Ale z jakiegoś powodu to nie działa w ten sposób. Jeśli ktoś może to wyjaśnić / poprawić, proszę.

Elmart
źródło
1

AKTUALIZACJA: Pobieranie i instalowanie najnowszej i oficjalnej wersji 5.4.1 dla Mac OS X rozwiązuje wszystkie problemy w Mac OS X El Capitan.

Jak opisano na forum fortinet, należy pobrać najnowszą (jeszcze nieopublikowaną) wersję FortiClient, aby naprawić problemy w Mac OS X El Capitan:

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

To było dla mnie najłatwiejsze rozwiązanie.

asmaier
źródło
0

Trochę poprawiam odpowiedź @ elmart (myślę).

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

W ten sposób skrypt nie musi być edytowany (a zmiana interfejsów nie powinna stanowić problemu). xargssłuży do usuwania białych znaków.

Dodałem również (choć nie wiem, czy to poprawa):

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

rootcheck "$@"

Do samego początku skryptu przypominającego ludziom o używaniu sudo.

użytkownik26312
źródło
Lepiej byłoby użyć adresu IP w route getpoleceniu, aby wyeliminować zależność od DNS.
kasperd
Ponieważ to pytanie dotyczy rozszczepionego mózgu, nawet po podłączeniu VPN twoja domyślna trasa jest prawdopodobnie twoją bramą. Możesz po prostu zeskrobać, $ netstat -rnaby uzyskać bramę i interfejs.
hbogert
0

Rozwiązałem problem, zmieniając konfigurację ustawień DNS, tak aby korzystały z serwerów Google DNS przed serwerami dostarczonymi przez FortiClient. Niestety, należy to zrobić po każdym ponownym połączeniu.

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

Szczegółowe informacje na ten temat można znaleźć tutaj .

Christoph Hermann
źródło
Co się stanie, jeśli będę potrzebował DNS mojej firmy do rozpoznawania nazw hostów w sieci firmowej?
hbogert
Zależy to od konfiguracji VPN. Zwykle „wewnętrzne” serwery DNS są przekazywane do komputera. Są to te, które nazwałem „<ADRESY IP DLA DNS Z FORTICLIENT>”. Jeśli twoje urządzenie nie może rozpoznać adresu w wersji 8.8.8.8 lub 8.8.4.4, używa serwerów DNS zdefiniowanych przez adresy IP w „<ADRESY IP DLA DNS Z FORTICLIENT>”.
Christoph Hermann
0

W mojej bieżącej wersji OS X (Sierra 10.12.6) i FortiClient 5.6.1 wydaje się, że jeśli ServerAddresses ma więcej niż 2 adresy, wówczas połączenie „set” niczego nie utrzymuje (jeśli „dostaniesz”, nic nie będzie zaktualizowane). Aby obejść ten problem, postanowiłem zachować tylko pierwszy adres DNS FortiClient i połączyć go z moim publicznym adresem DNS (8.8.8.8).

Ponadto sugerowałbym automatyczne uruchomienie skryptu bash na FortiClient connect: można to zrobić, eksportując skrypt konfiguracyjny FortiClient, a następnie importując go ponownie

Pełny przewodnik poniżej:

1 / Utwórz następujący skrypt bash i zapisz go gdzieś (w moim przypadku był w ~/bashscripts/update-forticlient-dns.sh) i nie zapomnij zastąpić <FIRST IP ADDRESS FOR FORTICLIENT DNS>przez wynikiem, scutil --dns | grep "nameserver\[0\]"gdy połączenie FortiClient jest aktywne

#!/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 / Uruchom FortiClient, a następnie przejdź do Preferencje > Ogólne i kliknij przycisk Kopia zapasowa , która wyeksportuje konfigurację FortiClient do pliku

3 / W tym pliku zlokalizuj i edytuj / forticlient_configuration / vpn / sslvpn / connection / connection [name = "YOUR CONNECTION"] / on_connect / script / script node i wywołaj w nim swój skrypt:

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

4 / Wróć do konsoli FortiClient, kliknij blokadę w lewym dolnym rogu, a następnie przejdź do Preferencji > Ogólne i kliknij przycisk Przywróć : zlokalizuj zaktualizowany plik konfiguracyjny i to wszystko, konfiguracja DNS będzie aktualizowana na bieżąco za każdym razem, gdy połączyć się z VPN.

Frédéric
źródło