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アドレスブロックとは異なる。本稿の主旨とは関係ない。
>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トンネル確立前)
>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エンドポイントの変更」を実行する。
3-2. 「スプリットトンネル」設定を確認する
「スプリットトンネル」がオフの場合、VPNクライアント端末の全ての通信はクライアントVPNエンドポイントへ送信される。(「スプリットトンネル」はデフォルトオフになっている)
3-3. 「スプリットトンネル」をオンにする
「スプリットトンネル」チェックボックスをオンにする。オンにすることで、クライアントVPNエンドポイントに割り当てたルート宛のパケットのみVPNトンネルへ送られるようになる。それ以外のパケットはVPNクライアント端上の既定ルートテーブル設定でルーティングされる。
3-4. クライアントVPNエンドポイントの変更を適用する
「クライアントVPNエンドポイントの変更」より、変更を反映する。
3-5. クライアントVPNエンドポイントへの適用が完了
変更の適用が完了した。
適用が完了したら、VPNクライアント端末上でVPNトンネルを再接続する。
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アドレスブロックとは異なる。本稿の主旨とは関係ない。
>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. 参考
- https://superuser.com/questions/851462/understanding-routing-table-with-openvpn (Understanding Routing Table with OpenVPN)
以上。