編集された回答

編集された回答

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 つの高レベルの操作を実行する必要があります。

  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

答え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-vpnVPNに接続した直後に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 を使用するようにユーザーに通知します。

関連情報