AWS ClientVPN接続時にAWS VPCを介さずインターネット・オンプレミスネットワークに接続する方法


# 1.概要

　AWS ClientVPNの登場によって、VPC上に構築したプライベートサブネットに対して容易にVPN接続が行えるようになりました。便利になった一方で、デフォルト設定ではVPN接続中インターネットに接続できない・社内ネットワークに接続できない、といったことがあります。
　本稿では、AWS ClientVPNにおけるVPN接続の仕組みを通じて、なぜインターネットに接続できないのか、そのとき何が起こっているのか、どのように設定すればよいかを解説します。

# 2.AWS ClientVPNデフォルト設定におけるルーティング

## 2-1. 前提

- AWS ClientVPNでは、AWS ConsoleよりOpenVPNの接続設定ファイル（XX.ovpn）をダウンロードすることができる。ここでは本設定ファイルを用いOpenVPNよりVPN接続を行う。
- AWSクライアントVPNサービスでは「スプリットトンネル」を無効（既定値）に設定すると、VPN上の全ての通信がVPNトンネルにルーティングされる。本稿「2」章の解説は「スプリットトンネル」が無効であることを前提としている。
- 同様に、本稿「3」章は「スプリットトンネル」が有効であることを前提としている。

## 2-2. OpenVPN TUNインタフェースによるL3レベルのルーティング動作メカニズム

　OpenVPNはVPN接続シーケンスにおいて、（1）「クライアント端末上に仮想NICデバイスを作成」し、（2）「仮想NICに対するルートテーブルのエントリを追加」するとともに（3）「VPNクライアントとClientVPNエンドポイント間のVPNトンネルを確立」する。
　AWSクライアントVPNサービスでは、仮想NICはTAPインタフェース（L2＝データリンク層におるブリッジ接続）でなく**TUNインタフェース（L3=ネットワーク層におけるルーティング）として構成される**。仮想NIC（TUN）があたかもルーターのように振る舞うことで、VPNクライアント上のパケットがAWS VPCへ送信されるのだ。
　ここで、OSルートテーブルを見てみよう。OSシェル上でルート表示コマンドを発行しルートテーブルを表示する。ポイントは下記の通り。

- 「ネットワーク宛先」に「0.0.0.0 mask 128.0.0.0」「128.0.0.0 mask 128.0.0.0」が追加されている
    - **デフォルトルートがAWSに向けられている！⇒全ての通信がVPNトンネルにルーティングされる**
    - AWS宛・社内ネットワーク宛・インターネット宛も含め、全てのパケットがVPNトンネルに送信される。VPNトンネルのAWS側、クライアントVPNエンドポイントで受け入れていない、AWS側ルートテーブルで宛先が特定できない場合パケットは破棄される（例：社内ネットワーク宛・インターネット宛）。
- 「0.0.0.0 mask 128.0.0.0」はアドレスレンジ「0.0.0.0～127.255.255」を、「128.0.0.0 mask 128.0.0.0」はアドレスレンジ「128.0.0.0～255.255.255.255」をあらわし、**2つのルートエントリをあわせてデフォルトルートを書き換える**ことを意味している。ルートテーブルでは**ネットワーク部がより具体的であるものが優先適用される**ため、上記2エントリは「0.0.0.0 mask 0.0.0.0」のような既存デフォルトルートエントリに優先して適用される。
- 「ネットワーク宛先」が「172.16.XX.XX」となっているものはVPNクライアント端末に割り当てられたIPアドレスであり、VPCアドレスブロックとは異なる。本稿の主旨とは関係ない。

```shell
>route print
===========================================================================
インターフェイス一覧
（省略）
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0    192.168.128.1  192.168.128.102     25
          0.0.0.0        128.0.0.0       172.16.1.1       172.16.1.2    281
   18.182.134.236  255.255.255.255    192.168.128.1  192.168.128.102    281
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    331
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    331
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
        128.0.0.0        128.0.0.0       172.16.1.1       172.16.1.2    281
       172.16.1.0  255.255.255.224            リンク上        172.16.1.2    281
       172.16.1.2  255.255.255.255            リンク上        172.16.1.2    281
      172.16.1.31  255.255.255.255            リンク上        172.16.1.2    281
    192.168.128.0    255.255.255.0            リンク上   192.168.128.102    281
  192.168.128.102  255.255.255.255            リンク上   192.168.128.102    281
  192.168.128.255  255.255.255.255            リンク上   192.168.128.102    281
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    331
        224.0.0.0        240.0.0.0            リンク上        172.16.1.2    281
        224.0.0.0        240.0.0.0            リンク上   192.168.128.102    281
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
  255.255.255.255  255.255.255.255            リンク上        172.16.1.2    281
  255.255.255.255  255.255.255.255            リンク上   192.168.128.102    281
===========================================================================
固定ルート:
  なし
```

## （参考）OpenVPN起動前のルートテーブル（VPNトンネル確立前）

```shell
>route print
===========================================================================
インターフェイス一覧
（省略）
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0    192.168.128.1  192.168.128.102     25
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    331
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    331
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
    192.168.128.0    255.255.255.0            リンク上   192.168.128.102    281
  192.168.128.102  255.255.255.255            リンク上   192.168.128.102    281
  192.168.128.255  255.255.255.255            リンク上   192.168.128.102    281
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    331
        224.0.0.0        240.0.0.0            リンク上   192.168.128.102    281
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
  255.255.255.255  255.255.255.255            リンク上   192.168.128.102    281
===========================================================================
固定ルート:
  なし
```

# 3.スプリット・トンネリングを有効にする

「スプリットトンネル」を有効にすることで、AWSクライアントVPNでAWS VPC宛のみVPNトンネルにルーティングし、それ以外のパケットはVPNクライアント上の通常NICにパケットを送信することができる。設定手順を説明する。

## 3-1. クライアントVPNエンドポイントの変更
クライアントVPNエンドポイントを選択し、「アクション」より「クライアントVPNエンドポイントの変更」を実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66448/004b24f2-b31a-214c-6323-ce87bb0070f6.png)

## 3-2. 「スプリットトンネル」設定を確認する
「スプリットトンネル」がオフの場合、**VPNクライアント端末の全ての通信はクライアントVPNエンドポイントへ送信される**。（「スプリットトンネル」はデフォルトオフになっている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66448/b1da491f-fe81-911d-8c2c-61861ce1f28f.png)

## 3-3. 「スプリットトンネル」をオンにする
「スプリットトンネル」**チェックボックスをオンにする**。オンにすることで、クライアントVPNエンドポイントに割り当てたルート宛のパケットのみVPNトンネルへ送られるようになる。それ以外のパケットはVPNクライアント端上の既定ルートテーブル設定でルーティングされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66448/608c827e-c23b-9d7f-12fd-c3f9aeddb022.png)

## 3-4. クライアントVPNエンドポイントの変更を適用する
「クライアントVPNエンドポイントの変更」より、変更を反映する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66448/49457ee3-fa30-d672-250f-151d324d2794.png)

## 3-5. クライアントVPNエンドポイントへの適用が完了
変更の適用が完了した。
適用が完了したら、**VPNクライアント端末上でVPNトンネルを再接続**する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66448/25f1874f-6858-1cbd-2c08-d5f654dcad65.png)


# 4. スプリット・トンネリング有効化の確認

OSルートテーブル表示コマンドを発行する。
確認のポイントは下記の通り。

- 「ネットワーク宛先」に「0.0.0.0」が追加されていない
    - **デフォルトルートがAWSに向いていない！**
    - これによって、AWS VPC以外のアドレスブロックがOS設定に則りルーティングされる。
- 「ネットワーク宛先」VPCのCIDRブロックが追加されている
    - クライアントVPNエンドポイントに割り当てられた**最小限のアドレスレンジのみVPNトンネルにルーティングされている**（例：「ネットワーク宛先」が「10.1.0.0 mask 255.255.0.0」となっているものが該当）。
- 「ネットワーク宛先」が「172.16.XX.XX」となっているものはVPNクライアント端末に割り当てられたIPアドレスであり、VPCアドレスブロックとは異なる。本稿の主旨とは関係ない。

```shell
>route print
===========================================================================
インターフェイス一覧
（省略）
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0    192.168.128.1  192.168.128.102     25
         10.1.0.0      255.255.0.0     172.16.0.129     172.16.0.130    281
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    331
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    331
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
     172.16.0.128  255.255.255.224            リンク上      172.16.0.130    281
     172.16.0.130  255.255.255.255            リンク上      172.16.0.130    281
     172.16.0.159  255.255.255.255            リンク上      172.16.0.130    281
    192.168.128.0    255.255.255.0            リンク上   192.168.128.102    281
  192.168.128.102  255.255.255.255            リンク上   192.168.128.102    281
  192.168.128.255  255.255.255.255            リンク上   192.168.128.102    281
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    331
        224.0.0.0        240.0.0.0            リンク上      172.16.0.130    281
        224.0.0.0        240.0.0.0            リンク上   192.168.128.102    281
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
  255.255.255.255  255.255.255.255            リンク上      172.16.0.130    281
  255.255.255.255  255.255.255.255            リンク上   192.168.128.102    281
===========================================================================
固定ルート:
  なし
```

# 5. 参考
1. https://superuser.com/questions/851462/understanding-routing-table-with-openvpn (Understanding Routing Table with OpenVPN)

以上。