🚀

【AWS】VPNスプリットトンネルについて学びつつ、VPN環境を構築してみる

2022/04/27に公開1


はじめに

ご覧いただきありがとうございます。阿河です。

会社内で毎日勉強会をやっていますが、先日「VPN環境の構築とスプリットトンネルの考え方」について学ぶ機会がありました。

動作検証を兼ねて、クライアントVPN環境を構築してみたので、情報共有させていただきます。

対象者

  • AWSを運用中
  • 簡単にVPN環境を構築したい
  • 快適なVPN環境が欲しい

概要

(★)がついているところは、手を動かして頂く項目です。

  1. スプリットトンネルについて
  2. Clinet VPNについて
  3. 今回のハンズオン構成
  4. ハンズオンのための下準備(★)
  5. 証明書の作成(★)
  6. VPNエンドポイント作成(★)
  7. VPN接続のための準備(★)
  8. 検証(★)

なお今回説明しているVPNは「クライアントVPN」を指しています。

事前準備

  • AWSアカウント作成
  • AdministratorAccessを付与したIAMユーザーの作成
  • 既存のVPN接続があれば、切断しておいてください。

1.スプリットトンネルについて

スプリットトンネルの設定をしていない場合

  • 社外秘のデータがあったり、外部公開禁止のサーバにアクセスする場合、インターネット経由でアクセスさせない仕組みをとっている会社は多いと思います。そういった場合、閉じられたネットワークにVPNを使って接続するという手段があります。

  • 例えばリモートワーカーは、自宅PCにクライアントVPNソフトを入れて、社内のネットワークにVPN接続します。VPNを繋げていない場合、端末からの外部通信はインターネットに接続を行います。一方でVPN接続を行うと、VPNを繋げた先に接続を行います。

  • VPNに接続した状態だと、接続がインターネットへ向かなくなるため、インターネット接続を行いWeb検索を行うことができなくなってしまいます。PCは、社内のネットワークを経由して外部に接続する必要があります。
    このようなVPNの接続方式を「フルトンネル」といいます。

スプリットトンネルの設定をした場合

  • 通信を分けることができます。社内サーバにアクセスする場合はVPNを経由するが、それ以外の通信はインターネット向けに接続を行うことができます。

  • 例えばVPNを張った状態でPCからWeb検索する場合は、わざわざ社内のネットワークに接続する必要がないため、VPN経由でなくインターネット側に接続を行います。

  • AWSのClient VPNでは、スプリットトンネルを有効/無効にするかを簡単に設定できます。

  • VPNは一般的に帯域が広くないため、リモートワーカーが増えて皆が一斉に同じVPNに接続をすると、VPNのキャパシティが足りなくなります。

  • スプリットトンネルを活用すれば、仮にリモートワーカーが一斉にWebサイトを閲覧したとしても、個人個人がインターネット経由で接続を行うため、VPNのキャパシティ不足は避けられます。

2.Client VPNについて

AWS Client VPNは、クライアントベースのマネージドVPNサービスです。


クライアント VPN を使用すると、OpenVPN ベースのVPN クライアントを使用して、どこからでもリソースにアクセスできます。

公式ドキュメントによると、設定方法は下記の通りです。

  • サーバおよびクライアント証明書とキーの作成
  • クライアントVPNエンドポイントを作成する
  • クライントのVPN接続を有効にする
  • クライアントのネットワークへのアクセスを承認する
  • クライアントVPNエンドポイント設定ファイルをダウンロードする
  • クライアントVPNエンドポイントに接続する

3.今回のハンズオン構成

まずは今回のハンズオンで作成する構成を紹介します。

  • VPC(172.20.0.0/16)
  • Public Subnet(172.20.1.0/24)、Private Subnet(172.20.2.0/24)
  • VPNエンドポイント作成
  • Public Subnet内にNAT Gatewayを配置
  • Private Subnet内にWindows Serverを1台作成

やりたいことは以下の通りです。

  • 自身のPCからVPNを繋げた状態で、Private Subnet内にあるWindows ServerにRDP接続を行う
  • Windows Serverからインターネット接続を行い、Web検索を行う
  • VPN接続を継続した状態で、自身のPCからWeb検索を行う

セキュアな環境でWindows Serverを操作しつつ、自身のPCでも快適にWeb検索を行える環境を構築します。

4. ハンズオンのための下準備

VPC作成

IPv4 CIDR: 172.20.0.0/16

Public Subnet/Private Subnet

  • Public Subnet

VPC ID: 先ほど作成したVPCを選択
AZ: ap-northeast-1a
IPv4 CIDR: 172.20.1.0/24

  • Private Subnet

VPC ID: 先ほど作成したVPCを選択
AZ: ap-northeast-1a
IPv4 CIDR: 172.20.2.0/24

インターネットゲートウェイ作成

インターネットゲートウェイを作成したら、アクションから「VPCにアタッチ」を選択して、VPCに紐づけてください。

NAT Gateway作成

  • サブネット: 作成したPublic Subnetを選択。
  • 接続タイプ: パブリック
  • Elastic IP割り当てID: Elastic IPを割り当て

ルートテーブル設定

  • Public Subnetのルートテーブルに、インターネットゲートウェイ宛てのルートを追加
    送信先: 0.0.0.0/0,
  • Private Subnetのルートテーブルに、NAT Gateway宛てのルートを追加

Windows Serverを作成

  • AMI: Windows_Server-2019-Engilish-Full-Base
  • インスタンスタイプ: t2.micro
  • キーペア:新しいキーペアの作成
  • VPC: 作成したVPCを選択
  • サブネット: 作成したPrivate Subnetを選択
  • パブリックIPの自動割り当て: 無効
  • セキュリティグループ: インバウンド通信(RDP,ソース 0.0.0.0/0)
  • ストレージ: 30GB、gp3

上記の設定で作成。

5. 証明書の作成

OpenSSLツールのダウンロード

  • CloudShellでコマンド実行

右上にあるCloudShellマークを押すと、CloudShell画面に移動します。

$sudo yum -y install openssl

OpenSSLをインストールします。

相互認証の手順

  • AWSドキュメントに従って、証明書/秘密鍵の生成を進めます。ClientVPNで相互認証するために認証局を建てて証明書を発行します。

今回はeasy-rsaによる自己署名証明書の作成を行います。

#easy-rsaのインストール
#カレントディレクトリにeasy-rsaディレクトリが作成され、関連ファイルが配置される
$git clone https://github.com/OpenVPN/easy-rsa.git
$cd easy-rsa/easyrsa3

#pkiを初期化。ディレクトリ配下にpkiディレクトリが作成される
$./easyrsa init-pki

#認証局の構築。pkiディレクトリ配下に ca.crtファイル(認証機関のルート証明書)が作成される
$./easyrsa build-ca nopass

#サーバ証明書を発行
#pki/issued配下およびpki/private配下に、サーバー証明書と秘密鍵が生成される
$./easyrsa build-server-full server nopass

#クライアント証明書を発行
#pki/issued配下およびpki/private配下に、クライアント証明書と秘密鍵が生成される
$./easyrsa build-client-full client1.domain.tld nopass

#ディレクトリを作成して、作成したファイルをディレクトリにコピーする
 $mkdir ~/custom_folder/
 $cp pki/ca.crt ~/custom_folder/
 $cp pki/issued/server.crt ~/custom_folder/
 $cp pki/private/server.key ~/custom_folder/
 $cp pki/issued/client1.domain.tld.crt ~/custom_folder
 $cp pki/private/client1.domain.tld.key ~/custom_folder/
 $cd ~/custom_folder/
 
  • 証明書と秘密鍵をACMにアップロード
#サーバ証明書と秘密鍵をACMにアップロード
$aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt

#クライアント証明書と秘密鍵をACMにアップロード
$aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt

AWSマネジメントコンソールでACMのページに移動しましょう。
アップロードされていることが分かります。

-クライアント証明書と秘密鍵をローカルにコピー

CloudShell右上のACtions⇒Download file

~/custom_folder/client1.domain.tld.crt
~/custom_folder/client1.domain.tld.key
ファイルのダウンロードにはパスが必要です。

それぞれパスを入力し、ファイルをダウンロードします。

6.VPNエンドポイントの作成

(AWSマネジメントコンソール上の操作) VPC⇒クライアントVPNエンドポイント⇒クライアントVPNエンドポイントの作成

  • クライアントIPV4 CIDR: 172.30.0.0/16
  • サーバ証明書ARN: 今回作成したサーバ証明書を選択
  • 認証オプション: 相互認証の使用
  • クライアント証明書ARN: 今回作成したクライアント証明書を選択
  • スプリットトンネルを有効にする

スプリットトンネルを有効にすることを忘れないでください。

上記の設定で、VPNエンドポイントを作成する。
さらに追加設定を行う。

  • クライアントVPNエンドポイントの関連付けタブで、VPCとPrivate Subnetを選択。

  • 認証タブ⇒受信の承認

認証タブで、受信の承認を選択。
アクセスを有効にする送信先ネット: 0.0.0.0/0
アクセスを付与する対象: すべてのユーザーにアクセス許可する。

以上でVPNエンドポイントの設定は完了です。

クライアントVPNエンドポイントの作成完了後に、クライアント設定のダウンロードを実行します。

7.VPN接続のための準備

  • クライアント設定ファイルの編集

前回「クライアント設定のダウンロード」でローカルに取り込んだファイルを、テキストエディタで開きます。

<cert>
-----BEGIN CERTIFICATE-----
(※記載省略)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(※記載省略)
-----END PRIVATE KEY-----
</key>

次に5の工程でダウンロードしたclient1.domain.tld.crtファイルを開きます。
[-----BEGIN CERTIFICATE-----]から[-----END CERTIFICATE-----]まですべてコピーしてください。
コピーした情報を<cert> </cert>の間に貼り付けます。

同じ手順で
ダウンロードしたclient1.domain.tld.keyファイルを開きます。
[-----BEGIN PRIVATE KEY-----]から[-----END PRIVATE KEY-----]まですべてコピーしてください。
コピーした情報を<key> </key>の間に貼り付けます。

最終的には上記のような状態になっていればOKです。

  • VPNクライアントソフトウェアをダウンロード
    こちらのページから、環境に応じてソフトウェアをダウンロード/インストールしてください。

  • VPNクライアントの設定

VPNクライアントを起動して、ファイル⇒プロファイルの管理⇒プロファイルの追加。
表示名は適当な名前。
VPN設定ファイルは先ほど編集したクライアント設定ファイルを選択します。

ここまでの作業で、VPN接続の準備が完了しました。

ではVPN接続を試してみましょう!

  • VPN接続の実行

接続ボタンをクリック。

接続できました!
VPNが繋がったことを確認できたら、次の工程に進みます。

8.検証

  • Windowsサーバの接続

(AWSマネジメントコンソール上の操作) EC2サーバ⇒接続⇒RDP接続

「リモートデスクトップファイルのダウンロード」から接続用クライアントツールをダウンロードします。
パスワードの取得にはキーペアが必要です。

接続用クライアントツールから、RDP接続を実施します。

  • Windowsサーバからインターネット接続を実行

Windowsサーバからインターネットに接続してください。
問題なくWeb検索ができます。

  • ローカルPCからWebブラウザでWebサイトを閲覧できるかを確認

VPN接続をした状態のまま実施します。
問題なく、インターネット通信が可能です。

では最後にスプリットトンネルを無効にして、変化があるかを確認してみます。

  • スプリットトンネルを無効にする

(AWSマネジメントコンソール上の操作) VPC⇒クライアントVPNエンドポイント⇒アクション⇒クライアントVPNエンドポイントの変更

スプリットトンネルを無効にしてください。

VPNを張りなおして、ローカルPCからWeb検索ができるかを確認してください。

Windows Server側からはインターネットに接続できますか?
最後に試してみましょう。

問題なく接続できるはずです。

さいごに

以上で検証は完了になります。
Client VPNを使えば、快適なVPN環境を手に入れることができます。
スプリットトンネルの設定も1クリックで有効化/無効化できます。

以上です。
お疲れ様でした!!

MEGAZONE株式会社 Tech Blog

Discussion

MChanMChan

いい文読みました! リンクトインのJiHwanHyunさんの文を通じて知りました。

文を読んで質問が一つできました。 最後の構築後に使用するクライアントプログラムを「AWSVPNClient」ではなく「OpenVPNGUI」を使用しても、後で大きな差はないのでしょうか?

現在AWSClientVPNを使用するとき、OpenVPNGUIを使用しています。 それで、文に使用された他のVPNクライアントプログラムを初めて見たので、クライアントVPNによって支払わなければならない購読料やシステムに変化が生じるのではないかと思って質問します。

もしよろしければnargene@gmail.comに返事を頂ければ幸いです。 zennを初めて使うので確認が遅くなることがあるからです。
コメントを読んでくださってありがとうございます。