【macOS】特定のドメインへの接続だけVPNを経由させる方法【Big Sur】

  • 2021年8月15日
  • Mac
  • 0件
Mac

macOSにおいてVPN接続をした場合、基本的にはVPN接続先ネットワークへのトラフィックのみがVPN接続を経由して送信されます。
それ以外の通信は(VPN接続ではない)通常のインターネット接続が使われるわけですが、場合によってはVPNを経由してほしいこともあるかと思います。
(VPN接続先のグローバルIPアドレスが使いたい場合など)

そういった場合はVPN接続の設定で「すべてのトラフィックをVPN接続経由で送信」をチェックすれば全てのトラフィックがVPN接続経由になります。

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

しかし、これだと文字通り全てがVPN接続先を経由してしまうのでそれはそれで問題になることもあるかと思います。

あるドメインへのアクセスだけVPN接続経由にしたい、という場合はどうすればいいのでしょうか。
この記事ではそういった場合の設定方法を説明します。

前提条件

  • CLIに慣れていること
  • VPN接続設定は済んでいること

手順

  1. VPN接続の設定で「すべてのトラフィックをVPN接続経由で送信」のチェックを外す。
    チェックを外す
  2. VPN接続を実行する。
  3. ターミナルで下記コマンドを実行してVPN接続のインターフェース名を見付ける。
    ifconfig

    うちの場合だと「ppp0」のようです。

    インターフェース名
  4. ターミナルで下記コマンドを実行してルートを追加する。
    sudo route add -net {VPN接続経由にしたいドメイン名 or IPアドレス} -interface {手順2.で見付けたインターフェース名}

これで当該ドメインもしくはIPアドレスについてはVPN接続経由になります。
VPN接続を切断すると上記手順4.で追加したルートが自動的に削除されてしまうため、VPN接続の度にコマンドを実行してルートを追加する必要がありますが、これを自動化することも可能です。

自動化の手順

VPN接続が確立したときにpppdが自動的にスクリプトを読み込んで実行してくれます。
そのスクリプトで上記コマンドを実行させれば自動的にルートが追加されます。

  1. /etc/pppディレクトリ内にip-upというファイルを作り、以下のような内容を記述する。
    #!/bin/zsh
    ROUTE=/sbin/route
    DOMAIN={VPN接続経由にしたいドメイン名 or IPアドレス}
    if [[ $4 =~ "^192\.168\.30\.[0-9]{1,3}$" ]]; then
        $ROUTE add -net $DOMAIN -interface $1
    fi

    Macに設定しているVPN接続が一つであれば無条件でroute addしていいのですが、複数ある場合はどのVPN接続が確立したかを判定する必要があります。
    $4にはインターフェースに割り当てられるプライベートIPアドレス、$5にはデフォルトゲートウェイのIPアドレスが入っているのでこれらを使って判定することができると思います。

    当方の環境だと$5は被ってしまうことがあったので$4を使って判定しています。
    DHCPでプライベートIPアドレスが割り当てられるので正規表現で判定しています。

  2. 上記ファイルに実行属性を付け、所有者をroot、パーミッションを755に変更する。

以降はVPN接続が確立すると上記のスクリプトが自動的に実行され、ルートが追加されます。


まとめ

以前からVPN接続時に明確にルートを分けたいと思っていたのですが、ようやく実現できました。
これで無用なトラフィックをVPNサーバーに流さなくてすみそうです。

この記事が同じように悩んでいる方の参考になれば幸いです。

VPNのプロトコルによっては上記手順がうまくいかない可能性もあります。
予めご了承ください。
当方が使っているVPNのプロトコルはL2TP/IPsecになります。