読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

OS X での VPN 時に特定経路のみ、VPN にルーティングするには

Network macOS

VPN 接続時のトラフィック制御は以下 2 パターンに分類することが出来ます。

  1. 全てのトラフィックVPN 経由にするケース
    • 主に企業ユース。本社に FW や UTM があり、全トラフィックは必ずそこを経由させる… というパターン
  2. 特定の経路のみ、VPN 経由にするケース
    • 主に個人ユース。必要なトラフィックのみ VPN にルーティングし、その他のトラフィックは通常通り、デフォルトルートに向けたまま… というパターン

今回は後者の「特定経路のみを VPN にルーティングし、他トラフィックデフォルトゲートウェイに向けたまま」という設定を行います。OS X 10.10.2 で設定を行いました。

「すべてのトラフィックVPN 接続経由で送信」のオフ

まず、「環境設定 → ネットワーク」で VPN 接続の詳細を開き、「すべてのトラフィックVPN 接続経由で送信」のチェックボックスからチェックを外します。

f:id:sig9:20150305113003p:plain

VPN 接続確立時のルーティング追加スクリプト作成

VPN 接続確立時は /etc/ppp/ip-up というスクリプトが呼ばれます。このファイルを以下のように修正し、「ppp 接続時に必要な経路を追加する」というスクリプトにします(存在しない場合は新規作成します)。今回は例として「VPN にルーティングしたい経路」を「192.168.123.0/24」としています。

#!/bin/sh

if [ "$1" = "ppp0" ]; then
/sbin/route add -net 192.168.123.0/24 -interface ppp0
fi

スクリプトには以下のように実行権限を付与しておきます。

sudo chmod 744 /etc/ppp/ip-up

もし、複数の経路を VPN にルーティングしたい場合は以下のように route add を羅列します。ここでは以下の 3 経路を VPN にルーティングしています。

  1. 192.168.11.0/24
  2. 192.168.33.0/24
  3. 192.168.55.0/24
#!/bin/sh

if [ "$1" = "ppp0" ]; then
/sbin/route add -net 192.168.11.0/24 -interface ppp0
/sbin/route add -net 192.168.33.0/24 -interface ppp0
/sbin/route add -net 192.168.55.0/24 -interface ppp0
fi

今回はあくまで「例」ですが、経路を集約出来るのであれば集約すべきです。

VPN 接続断時の挙動

今回のスクリプトでは NextHop を ppp0 インターフェイスに指定しています。VPN が切断された場合、ppp0 への到達性が無くなる為、追加された経路は自動的に消滅します。よって、特別のアフターケアは必要ありません。

改善点

今回のスクリプトでは「複数VPN 接続先が登録された状態」で「宛先を見分け、追加する経路を変更する」という対策を実施していません。VPN の接続先は /etc/ppp/ip-up スクリプト中から $5 として取得することが出来ました。よって、「宛先を見分け…」を実現するには $5 によって条件分岐するスクリプトを書くことにより、実現可能と思われます。