VPNで外部通信を直接インターネットにルーティングする




# はじめに
SoftEther VPNサーバーでL2TPプロトコルを利用する際、全トラフィックをVPN経由で送信するのが一般的ですが、帯域が限られている場合には速度低下を招くことがあります。この問題を解決するため、スプリットトンネリングの設定を行うことで、VPNが不要な通信を直接インターネットにルーティングする方法を紹介します。

# 方法概要
DHCPを使用しているL2VPN環境では、デフォルトでは全てのデータがVPNサーバーを通じてルーティングされます。これに対し、DHCPのクラスレス静的ルート（RFC 3442）機能を用いて、VPNクライアントに対して特定の通信ルートのみVPNを経由させるよう設定することができます。たとえば、企業の内部ネットワークへはVPNを通じてアクセスし、一般的なインターネット接続は直接行うように設定することが可能です。この設定を「スプリットトンネリング」と呼びます。これにより、内部ネットワークへはVPNを通じて、その他のアクセスは直接インターネットに繋がるようになります。


スプリットトンネリングを設定可能なVPNサーバーアプリは多数存在しますが、本記事ではSoftEtherを使用した設定手順に焦点を当てます。具体的には、SoftEtherの仮想DHCP機能を利用してクライアントへ特定の静的ルーティング情報を提供します。この方法で、内部ネットワークの特定IP範囲へのアクセスをVPN経由でルーティングし、それ以外の通信を直接インターネットに送ることが可能です。


# 実験

この実験では、SoftEther VPNを使用し、DHCP設定を通じてVPNクライアントのルーティングテーブルにどのような変化が生じるかを観察します。具体的には、`DhcpSet` コマンドを用いて以下の設定を行います：

- **デフォルトゲートウェイ (`GW`) オプション:** このオプションを `none` に設定して、VPNクライアントのデフォルトゲートウェイを上書きしないようにします。
- **プッシュルート(`PushRoute`) オプション:** 特定の内部ネットワークに対するカスタマイズされたルーティング情報を設定します。この情報は「IPネットワークアドレス/サブネットマスク/ゲートウェイIPアドレス」の形式で追加します。複数のIP帯域はカンマまたはスペースで区切ります。

例えば、`192.168.0.0/255.255.0.0/192.168.30.1,172.16.0.
0/255.240.0.0/192.168.30.1,10.0.0.0/255.0.0.0/192.168.30.1` のようにプライベートIPのセグメントを設定することができます。



```s
VPN Server/BRIDGE>DhcpSet /START:192.168.30.10 /END:192.168.30.200 /MASK:255.255.255.0 /EXPIRE:7200 /GW:none /DNS:192.168.30.1 /DNS2:none /DOMAIN:none /LOG:yes /PushRoute:192.168.0.0/255.255.0.0/192.168.30.1,172.16.0.
0/255.240.0.0/192.168.30.1,10.0.0.0/255.0.0.0/192.168.30.1
DhcpSet command - Change Virtual DHCP Server Function Setting of SecureNAT Function
The command completed successfully.

VPN Server/BRIDGE>DhcpGet
DhcpGet command - Get Virtual DHCP Server Function Setting of SecureNAT Function
Item                           |Value
-------------------------------+----------------------------------------------------------------------------------------------------------
Use Virtual DHCP Function      |Yes
Start Distribution Address Band|192.168.30.10
End Distribution Address Band  |192.168.30.200
Subnet Mask                    |255.255.255.0
Lease Limit (Seconds)          |7200
Default Gateway Address        |None
DNS Server Address 1           |192.168.30.1
DNS Server Address 2           |None
Domain Name                    |
Save NAT and DHCP Operation Log|Yes
Static Routing Table to Push   |192.168.0.0/255.255.0.0/192.168.30.1, 172.16.0.0/255.240.0.0/192.168.30.1, 10.0.0.0/255.0.0.0/192.168.30.1
The command completed successfully.
```
設定の結果、 `DhcpGet` で設定が意図通り反映されたことが確認できました。次に、このVPNサーバーにクライアント(macOS)から接続し、ルーティングテーブルの変化を観察します。結果は以下の通りです。

![Screenshot 2024-05-01 at 19.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/7acf3d10-4ce2-3bc1-7531-939e5e224547.png)


1. **デフォルトルートの変化**: `default` ルートが2つ存在します。一つは従来通り `192.0.0.1` をゲートウェイに `en0` を経由しており、もう一つは `ppp0` インターフェイスを通じて新しく設定されたものです。この新しいルートはVPN接続を通じてトラフィックをルーティングする役割を担います。
2. **VPN関連のルート**: `PushRoute` で指定した3つのプライベートネットワーク `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` へのルートが `ppp0` を通じて設定されています。これにより、これらのネットワークへのトラフィックがVPNを介してルーティングされるようになります。
3. **リンクローカルアドレスの追加**: `192.0.0.2` が `ppp0` インターフェイスに関連付けられ、有効期限が2290秒で設定されています。これはVPN接続が確立されたことを示しています。
4. **マルチキャストアドレスの拡張**: `224.0.0/4` のマルチキャストルートが `ppp0` に追加されています。これによりVPN接続がマルチキャストトラフィックも処理できるようになります。

以上の結果から、設定が意図した通りに反映されていることが確認できました。


# SoftEther Bridgeで使ってみる

スプリットトンネリングは、リモートワークを行う企業にとって非常に有効です。VPNを介して特定の社内リソースやIP帯域にアクセスすることを可能にし、必要なデータのみをVPN経由で処理することで、大量のトラフィックを効率的に管理できます。

一方で個人用途では、VPNを使用してプライベートネットワークへの通信のみをルーティングし、一般的なインターネットトラフィックは通常通り処理するだけで充分な場合が多いです。以前にSoftEther VPNサーバの構築方法を紹介しましたが、今回は特にスプリットトンネリングを設定するための追加情報を提供します。以下の `docker-compose.yml` ファイルの環境変数 `ROUTE_PRIVATE_IPS_ONLY=true` を設定することで、VPNを通じてプライベートネットワークの通信のみをルーティングし、その他のトラフィックは直接インターネットに送るSoftEter Bridgeの構築が簡単に行えます。

https://qiita.com/sammrai/items/fc167b11ae5b0d71fe32

```yml
version: "3"

services:
  softether-bridge:
    image: sammrai/softether-bridge:latest
    container_name: softether-bridge
    environment:
      - USERNAME=vpnname
      - PASSWORD=vpnpassword
      - PSK=vpnsecret
      - VPN_SERVER=your.vpn.server:5555
      - ROUTE_PRIVATE_IPS_ONLY=true

```

L2TP/IPsecおよびMS-SSTPクライアントを使用する場合、IPv4の設定でデフォルトゲートウェイをVPNサーバーに設定しないようにする必要があります。具体的には、下記iOSとmacOSの設定例のように、クライアントの設定で「すべてのトラフィックをVPN接続経由で送信」を無効にする必要があります。

![cropped_IMG_95082.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/7ca24be9-7fa2-ef0f-429d-97697382fc12.png)

![Screenshot 2024-05-01 at 20.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/7b8d3529-2146-ad06-2366-47d1a28e6b41.png)

# さいごに

この記事で紹介した設定は、SoftEtherのブリッジ機能を用いた例ですが、SoftEtherサーバーでも同様の設定が可能です。詳細な設定方法については、下記のGitHubリポジトリが参考になるかもしれません。

https://github.com/sammrai/softether-bridge

# 参考

https://tools.ietf.org/html/rfc3442

https://qiita.com/kawaz/items/772350b9741f190605c3