OSX El Capitan 以降、スプリット ホライズンを使用すると、FortiClient VPN ソフトウェアが壊れます。問題は、DNS 要求が VPN トンネルの DNS への通常のプライマリ インターフェイスで送信されることです。
DNS リクエストを正しいインターフェース (VPN トンネルなど) 経由で送信するにはどうすればよいでしょうか。
答え1
編集された回答
他のほぼ全員の改善された回答 (@elmart、@user26312、myself) を (再) 改善しました。スクリプトの編集は必要ありません。
#!/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
- デフォルト ルートをやり直す (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
答え2
@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 fix-vpn
VPNに接続した直後にsudo()で実行します。
試してみましたが、うまくいきました。前述したように、これは以前の解決策を単に作り直しただけです。コメントに十分なスペースがなかったため、別の回答として投稿しました。
ちなみに、これをスクリプトに組み込んで/etc/ppp/ip-up
、接続時に自動的に実行することもできると思いました。しかし、何らかの理由で、そのようには動作しません。誰かがそれを説明/改善できる場合は、ぜひお願いします。
答え3
Forticlient の古いバージョンを使用して、動作を確認できました。
私の Dropbox へのリンクは次のとおりです:
https://www.dropbox.com/s/p43ssvp0gusmzeq/forticlientsslvpn_macosx_4.0.2297.dmg?dl=0
答え4
@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 を使用するようにユーザーに通知します。