Cara mendapatkan forticlient bekerja di OSX El Capitan

10

Perangkat lunak VPN forticlient borked, ketika menggunakan split horizon, sejak OSX El Capitan. Masalahnya adalah bahwa permintaan DNS dikirim pada antarmuka primer normal ke DNS terowongan VPN.

Bagaimana cara kami mendapatkan permintaan DNS untuk dikirim melalui antarmuka yang benar (mis. Terowongan VPN)

hbogert
sumber

Jawaban:

11

Jawaban yang Diedit

(Re) meningkat pada hampir semua jawaban orang lain yang ditingkatkan (@elmart, @ user26312, saya sendiri). Pengeditan tidak diperlukan dalam skrip:

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

Buat file yang Anda masukkan ini, dapat dieksekusi dan dieksekusi (setelah terhubung dengan VPN) dengan sudo. Sebelum skrip melakukan perubahan, skrip ini akan melihat rute default Anda saat ini dan karenanya mengetahui gerbang dan antarmuka Anda saat ini.


Jawaban lama

Bukan solusi lengkap, Anda harus melakukan dua hal tingkat tinggi berikut setelah setiap pengaturan koneksi VPN:

  1. Kita harus mengatur antarmuka terowongan ppp0
  2. Ulangi rute default (karena 1. secara implisit menetapkan gateway default yang salah, terowongan terpecah akan tetap berfungsi dengan baik setelah ini)

Buat file dengan nama scutil-fortimisalnya

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

Ulangi rute gateway, jadi buat file lain routes-forti,, dengan (perhatikan garis dengan pengaturan spesifik untuk jaringan Anda):

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

sekarang, jalankan,

$ cat scutil-forti |sudo scutil ; bash routes-forti
hbogert
sumber
Tetapi, langkah-langkah ini harus dikembalikan setelah diputuskan, bukan?
elmart
1
TL; DR tidak diperlukan reverting. Tidak, State:/Network/Service/forticlientsslvpn/IPv4kuncinya ada untuk mulai dengan begitu terowongan VPN berjalan dan dihapus ketika terowongan VPN dihapus terputus. Rute sebenarnya tidak berbeda dari yang seharusnya.
hbogert
8

Saya telah mengerjakan ulang solusi @ hbogert menjadi sebuah skrip tunggal yang lebih mudah dikelola:

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

Itu dengan asumsi Anda menggunakan antarmuka en0 dan 192.168.1.1 gateway standar. Jika tidak, gantikan dengan nilai yang sesuai. Jika Anda tidak mengenal mereka, ketikkan route get www.google.comuntuk mendapatkannya. Kemudian:

  • Tempatkan itu ke dalam file (mis. 'Fix-vpn') di suatu tempat di jalur Anda.
  • Berikan itu jalankan izin ( chmod u+x fix-vpn).
  • Jalankan dengan sudo ( sudo fix-vpn) tepat setelah terhubung ke vpn.

Saya sudah mencobanya dan berhasil. Seperti yang saya katakan, ini hanyalah pengerjaan ulang dari solusi sebelumnya. Saya hanya mempostingnya sebagai jawaban terpisah karena saya tidak punya cukup ruang dalam komentar.

BTW, saya juga berpikir ini bisa dimasukkan dalam /etc/ppp/ip-upskrip sehingga dieksekusi secara otomatis saat menghubungkan. Tetapi untuk beberapa alasan, itu tidak berfungsi seperti itu. Jika seseorang dapat menjelaskan / meningkatkannya, silakan lakukan.

elmart
sumber
0

Memperbaiki jawaban @ elmart sedikit (saya pikir).

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

Dengan begitu skrip tidak perlu diedit (dan mengubah antarmuka seharusnya tidak menjadi masalah). xargsdigunakan untuk menghapus spasi.

Saya juga menambahkan (meskipun saya tidak tahu apakah ini merupakan peningkatan):

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

rootcheck "$@"

Ke bagian paling awal dari skrip untuk mengingatkan orang untuk menggunakan sudo.

pengguna26312
sumber
Akan lebih baik menggunakan alamat IP dalam route getperintah untuk menghilangkan ketergantungan pada DNS.
kasperd
Karena masalah Pertanyaan ini adalah dengan otak terpecah, bahkan setelah VPN terhubung, rute default Anda kemungkinan adalah gateway Anda. Anda bisa mengorek $ netstat -rnuntuk mendapatkan gateway dan antarmuka.
hbogert
0

Saya memecahkan masalah bagi saya dengan mengkonfigurasi ulang pengaturan DNS untuk menggunakan server DNS Google sebelum yang disediakan oleh FortiClient. Sayangnya, ini harus dilakukan setelah setiap kali terhubung kembali.

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

Detail tentang ini dapat ditemukan di sini .

Christoph Hermann
sumber
Jadi apa yang terjadi jika saya memerlukan DNS perusahaan saya untuk menyelesaikan nama host di jaringan perusahaan?
hbogert
Ini tergantung pada bagaimana VPN dikonfigurasi. Biasanya, server DNS "internal" dilewatkan ke mesin Anda. Ini adalah yang saya sebut "<ALAMAT IP UNTUK DNS DARI FORTICLIENT>". Jika mesin Anda tidak dapat menyelesaikan alamat dengan 8.8.8.8 atau 8.8.4.4 ia menggunakan server DNS yang ditentukan oleh alamat IP di "<ALAMAT IP UNTUK DNS DARI FORTICLIENT>".
Christoph Hermann
0

Pada versi OS X saya saat ini (Sierra 10.12.6) & FortiClient 5.6.1 sepertinya jika ServerAddresses memiliki lebih dari 2 alamat, maka panggilan "set" tidak bertahan apa-apa (jika Anda "mendapatkan", tidak ada yang akan terjadi. diperbarui). Untuk mengatasinya, saya memutuskan untuk hanya menyimpan alamat DNS FortiClient pertama dan menggabungkannya dengan alamat DNS publik saya (8.8.8.8).

Selain itu, saya akan menyarankan untuk secara otomatis menjalankan skrip bash pada FortiClient connect: ini dapat dilakukan dengan mengekspor skrip konfigurasi FortiClient kemudian mengimpornya kembali

Panduan lengkap di bawah ini:

1 / Buat skrip bash berikut dan simpan di suatu tempat (dalam kasus saya, ini menjadi ~/bashscripts/update-forticlient-dns.sh) dan jangan lupa ganti <FIRST IP ADDRESS FOR FORTICLIENT DNS>dengan hasil scutil --dns | grep "nameserver\[0\]"ketika koneksi FortiClient Anda naik

#!/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 / Jalankan FortiClient, lalu buka Preferensi > Umum dan klik tombol Cadangan yang akan mengekspor konfigurasi FortiClient Anda ke file

3 / Dalam file ini, cari & edit / forticlient_configuration / vpn / sslvpn / koneksi / koneksi [name = "KONEKSI ANDA"] / on_connect / skrip / skrip script dan panggil skrip Anda di dalamnya:

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

4 / Kembali ke konsol FortiClient, klik kunci di sudut kiri bawah, lalu pergi ke Preferensi > Umum dan klik tombol Pulihkan : cari file konfigurasi yang diperbarui dan hanya itu, konfigurasi DNS Anda akan diperbarui dengan cepat setiap kali Anda terhubung ke VPN.

Frédéric
sumber