OSX El Capitan以降、スプリットホライズンを使用するとforticlient VPNソフトウェアが機能しなくなります。問題は、DNS要求がVPNトンネルのDNSへの通常のプライマリインターフェイスで送信されることです。
DNS要求を正しいインターフェイス(VPNトンネルなど)経由で送信する方法
他のほぼすべての改善された回答(@ 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つの高レベルの作業を行う必要があります。
ppp0
に設定する必要がありますたとえば、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
@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
取得します。次に:
chmod u+x fix-vpn
)。Sudo fix-vpn
)vpnに接続した直後。私はそれを試しました、そしてそれは働きます。私が言ったように、これは以前の解決策の単なる手直しです。コメントに十分なスペースがなかったので、別の回答として投稿しました。
ところで、私はこれが/etc/ppp/ip-up
スクリプトを使用すると、接続時に自動的に実行されます。しかし、何らかの理由で、そのようには機能しません。誰かがそれについて説明/改善できる場合は、どうぞ。
古いバージョンのForticlientを使用することができ、動作することを確認しました!
Dropboxのリンクは次のとおりです。
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=
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=
これは私にとって最も簡単な解決策でした。
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 にあります。
私はhbogertのスクリプトを取り、それを自分と別の従業員のためにApplescriptでラップしました。ここから入手できます。 https://www.dropbox.com/s/lh0hsqdesk3i0n7/Execute-Post-VPN-Connection.app.zip?dl =
VPNに接続して、アプリを実行し、管理者パスワード(Sudoに必要)を入力するだけです。注:/ Applications /に保存する必要があります
私の現在の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構成がオンザフライで更新されます。
@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を使用することを人々に思い出させるために。