web-dev-qa-db-ja.com

OSX El Capitanでforticlientを動作させる方法

OSX El Capitan以降、スプリットホライズンを使用するとforticlient VPNソフトウェアが機能しなくなります。問題は、DNS要求がVPNトンネルのDNSへの通常のプライマリインターフェイスで送信されることです。

DNS要求を正しいインターフェイス(VPNトンネルなど)経由で送信する方法

10
hbogert

編集された回答

他のほぼすべての改善された回答(@ elmart、@ user26312、自分)を(再)改善。スクリプトでの編集は必要ありません。

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

これを入れたファイルを実行可能にして、(VPNに接続した後)Sudoで実行します。スクリプトは変更を行う前に、現在のデフォルトルートを確認するため、現在のゲートウェイとインターフェースを認識します。


古い答え

完全なソリューションではありません。各VPN接続のセットアップ後に、次の2つの高レベルの作業を行う必要があります。

  1. トンネルのインターフェースをppp0に設定する必要があります
  2. デフォルトルートのやり直し(1.暗黙的に間違ったデフォルトゲートウェイを設定するため、スプリットトンネルは今後も正しく機能するはずです)

たとえば、scutil-fortiという名前のファイルを作成します。

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

ゲートウェイのルートをやり直すため、別のファイルroutes-fortiを作成します(ネットワークの特定の設定を含む行に注意してください)。

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

今、実行し、

$ cat scutil-forti |Sudo scutil ; bash routes-forti
11
hbogert

@hbogertのソリューションをより扱いやすい単一のスクリプトに作り直しました。

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

これは、en0インターフェースと192.168.1.1デフォルトゲートウェイを使用していることを前提としています。そうでない場合は、対応する値に置き換えてください。それらがわからない場合は、route get www.google.com取得します。次に:

  • それをパスのどこかにあるファイル( 'fix-vpn'など)に配置します。
  • 実行権限を付与します(chmod u+x fix-vpn)。
  • Sudo(Sudo fix-vpn)vpnに接続した直後。

私はそれを試しました、そしてそれは働きます。私が言ったように、これは以前の解決策の単なる手直しです。コメントに十分なスペースがなかったので、別の回答として投稿しました。

ところで、私はこれが/etc/ppp/ip-upスクリプトを使用すると、接続時に自動的に実行されます。しかし、何らかの理由で、そのようには機能しません。誰かがそれについて説明/改善できる場合は、どうぞ。

8
elmart

古いバージョンのForticlientを使用することができ、動作することを確認しました!

Dropboxのリンクは次のとおりです。

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

4
mr. brody

UPDATE:Mac OS X用の最新の公式バージョン5.4.1をダウンロードしてインストールすると、Mac OS X El Capitanのすべての問題が修正されます。

fortinetフォーラム で説明されているように、Mac OS X El Capitanの問題を修正するには、FortiClientの最新の(まだ公開されていない)バージョンをダウンロードする必要があります。

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

これは私にとって最も簡単な解決策でした。

1
asmaier

FortiClientが提供するものよりも前にGoogle DNSサーバーを使用するようにDNS設定を再構成することで、問題を解決しました。残念ながら、これは再接続するたびに行う必要があります。

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

この詳細は here にあります。

0

私はhbogertのスクリプトを取り、それを自分と別の従業員のためにApplescriptでラップしました。ここから入手できます。 https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl =

VPNに接続して、アプリを実行し、管理者パスワード(Sudoに必要)を入力するだけです。注:/ Applications /に保存する必要があります

0

私の現在のOS Xバージョン(Sierra 10.12.6)とFortiClient 5.6.1では、ServerAddressesに3つ以上のアドレスがある場合、 "set"呼び出しは何も保持しません( "get"の場合、何もされません)更新しました)。これを回避するために、最初のFortiClient DNSアドレスのみを保持し、それを私のパブリックDNSアドレス(8.8.8.8)とマージすることにしました。

さらに、FortiClient接続でbashスクリプトを自動的に実行することをお勧めします。これは、FortiClient構成スクリプトをエクスポートしてから再インポートすることで実行できます。

以下の完全なガイド:

1 /次のbashスクリプトを作成し、どこかに(私の場合は~/bashscripts/update-forticlient-dns.shに)保存し、FortiClient接続中に<FIRST IP ADDRESS FOR FORTICLIENT DNS>の結果でscutil --dns | grep "nameserver\[0\]"を置き換えることを忘れないでください上がっています

#!/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/FortiClientを実行し、次にPreferences> Generalに移動して、FortiClient構成をファイルにエクスポートするBackupボタンをクリックします。

3 /このファイルで、/ forticlient_configuration/vpn/sslvpn/connections/connection [name = "YOUR CONNECTION"]/on_connect/script/scriptノードとその中のスクリプトを呼び出します:

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

4/FortiClientコンソールに戻り、左下のカギをクリックして、次にPreferences> Generalに移動し、Restoreボタンをクリックします。 VPNに接続するたびに、DNS構成がオンザフライで更新されます。

0
Frédéric

@elmartの答えを少し改善する(私は思う)。

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

そうすれば、スクリプトを編集する必要がなくなります(インターフェイスの変更は問題になりません)。 xargsは空白を取り除くために使用されます。

私はまた追加しました(これが改善であるかどうかはわかりませんが):

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

rootcheck "$@"

スクリプトの冒頭にSudoを使用することを人々に思い出させるために。

0
user26312