Come far funzionare i forticlient in OSX El Capitan


10

Il software VPN previsto è ostruito, quando si utilizza split horizon, da OSX El Capitan. Il problema è che le richieste DNS vengono inviate sulla normale interfaccia primaria al DNS del tunnel VPN.

Come ottenere le richieste DNS da inviare tramite l'interfaccia corretta (ad es. Tunnel VPN)

Risposte:


11

Risposta modificata

(Ri) migliorato praticamente sulla risposta migliorata di tutti gli altri (@elmart, @ user26312, me stesso). Le modifiche non dovrebbero essere necessarie nello 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

Rendi il file in cui lo metti, eseguibile ed esegui (dopo esserti connesso alla VPN) con sudo. Prima che lo script apporti eventuali modifiche, esamina il percorso predefinito corrente e quindi conosce il gateway e l'interfaccia correnti.


Vecchia risposta

Non è una soluzione completa, dovrai eseguire le seguenti due operazioni di alto livello dopo ogni configurazione della connessione VPN:

  1. Dovremo impostare l'interfaccia del tunnel su ppp0
  2. Ripeti route predefinite (poiché 1. imposta implicitamente il gateway predefinito errato, il tunnel diviso dovrebbe funzionare correttamente in seguito)

Crea un file con il nome scutil-fortiper esempio

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

Ripeti le route del gateway, quindi crea un altro file, routes-forticon (attenzione alle linee con impostazioni specifiche per la tua rete):

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

ora, esegui,

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

Ma questi passaggi dovrebbero essere ripristinati dopo la disconnessione, no?
elmart,

1
TL; DR non è necessario il ripristino. No, la State:/Network/Service/forticlientsslvpn/IPv4chiave è lì per iniziare quando il tunnel VPN è in esecuzione e viene eliminato quando il tunnel VPN viene eliminato si disconnette. I percorsi non sono in realtà diversi da quelli che dovrebbero essere.
hbogert,

8

Ho rielaborato la soluzione di @ hbogert in un singolo script più gestibile:

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

Ciò presuppone che tu stia utilizzando l'interfaccia en0 e il gateway predefinito 192.168.1.1. In caso contrario, sostituire quelli con i valori corrispondenti. Se non li conosci, digita route get www.google.comper ottenerli. Poi:

  • Inseriscilo in un file (ad es. 'Fix-vpn') da qualche parte nel tuo percorso.
  • Dagli autorizzazioni di esecuzione ( chmod u+x fix-vpn).
  • Eseguilo con sudo ( sudo fix-vpn) subito dopo la connessione a vpn.

L'ho provato e funziona. Come ho già detto, questa è solo una rielaborazione di una soluzione precedente. L'ho appena pubblicato come risposta separata perché non avevo abbastanza spazio in un commento.

A proposito, ho anche pensato che questo potesse essere incluso in uno /etc/ppp/ip-upscript in modo che venisse eseguito automaticamente durante la connessione. Ma per qualche motivo, non funziona in questo modo. Se qualcuno può spiegarlo / migliorarlo, per favore fallo.




0

Migliorando un po 'la risposta di @elmart (penso).

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

In questo modo lo script non ha bisogno di essere modificato (e cambiare interfaccia non dovrebbe essere un problema). xargsviene utilizzato per eliminare gli spazi bianchi.

Ho anche aggiunto (anche se non so se si tratta di un miglioramento):

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

rootcheck "$@"

All'inizio dello script per ricordare alle persone di usare sudo.


Sarebbe meglio usare un indirizzo IP nel route getcomando per eliminare la dipendenza dal DNS.
Kasperd,

Dato che il problema di questa domanda è con split brain, anche dopo che la VPN è connessa la tua route predefinita è probabilmente il tuo gateway. Puoi semplicemente grattare $ netstat -rnper ottenere il gateway e l'interfaccia.
hbogert,


0

Ho risolto il problema per me riconfigurando le impostazioni DNS per utilizzare i server DNS di Google prima di quelli forniti da FortiClient. Sfortunatamente, questo deve essere fatto dopo ogni nuova connessione.

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

Dettagli su questo possono essere trovati qui .


Quindi cosa succede se ho bisogno del DNS della mia azienda per risolvere i nomi host nella rete aziendale?
hbogert,

Questo dipende da come è configurata la VPN. Normalmente, i server DNS "interni" vengono passati al tuo computer. Questi sono quelli che ho chiamato "<INDIRIZZI IP PER DNS DA FORTICLIENT>". Se la macchina non è in grado di risolvere un indirizzo con 8.8.8.8 o 8.8.4.4, utilizza i server DNS definiti dagli indirizzi IP in "<INDIRIZZI IP PER DNS DA FORTICLIENT>".
Christoph Hermann,

0

Sulla mia attuale versione di OS X (Sierra 10.12.6) e FortiClient 5.6.1 sembra che ServerAddresses abbia più di 2 indirizzi, quindi la chiamata "set" non persiste nulla (se "ottieni", nulla sarà stato aggiornato). Per ovviare a questo, ho deciso di mantenere solo il primo indirizzo DNS FortiClient e di unirlo con il mio indirizzo DNS pubblico (8.8.8.8).

Inoltre, suggerirei di eseguire automaticamente lo script bash su FortiClient connect: questo può essere fatto esportando lo script di configurazione di FortiClient e reimportandolo

Guida completa di seguito:

1 / Crea il seguente script bash e memorizzalo da qualche parte (nel mio caso, era in ~/bashscripts/update-forticlient-dns.sh) e non dimenticare di sostituirlo <FIRST IP ADDRESS FOR FORTICLIENT DNS>con il risultato di scutil --dns | grep "nameserver\[0\]"mentre la tua connessione FortiClient è attiva

#!/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 / Esegui FortiClient, quindi vai in Preferenze > Generali e fai clic sul pulsante Backup che esporterà la tua configurazione FortiClient in un file

3 / In questo file, individua e modifica il nodo / forticlient_configuration / vpn / sslvpn / connections / connection [name = "YOUR CONNECTION"] / on_connect / script / script e chiama il tuo script al suo interno:

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

4 / Torna alla console di FortiClient, fai clic sul lucchetto nell'angolo in basso a sinistra, quindi vai su Preferenze > Generali e fai clic sul pulsante Ripristina : individua il file di configurazione aggiornato e il gioco è fatto, la tua configurazione DNS verrà aggiornata al volo ogni volta che connettersi alla VPN.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.