AWSIaCLinuxWindows

AWS上のEC2でOpenVPNサーバを構築する

AWS

AWS上にEC2インスタンスを作成したら、セットアップのためにコンソールへアクセスが必要になります。実際にSSHやRDPなどでEC2インスタンスへ接続する方法としては以下の方法があげられるかと思います。

  1. AWS Systems Managerのセッションマネージャ経由での接続
  2. (オンプレミスなどの)ネットワーク単位でのSite間のVPN接続
  3. Ineternet経由でのSSHやRDPでの接続(踏み台サーバを利用)
  4. Internet経由でClientVPNへ接続したのちSSHやRDPでの接続(これも踏み台ともいえる)

1や2の方法がInternetに直接ホストを公開しない方法なのでセキュリティ的には良いかと思います。

ただ、全員がマネージメントコンソールにアクセスできない環境やテレワークなどでAWS内部のリソースだけを使いたい場合は、まだまだ3もしくは4の方法で運用をされている方も多くいるかと思います。

今回は4のClinetVPNの方法を行うためにEC2上でOpenVPNサーバを構築する手順についてまとめました。 2021年8月時点での手順となります。

※ec2インスタンスについては利用料金が発生する可能性がありますので、自分の環境を確認しながら実施ください。あくまで自己責任でお願いします。

1. AWS Client VPNの検討

「AWS Client VPN」というAWSマネージドサービスを利用する方法もあります。

こちらの方がOpenVPNサーバを管理/運用をしなくてよいですし、冗長性などのメリットがあるため選択肢としてまずは検討すべきです。

※ちなみに2021年8月時点では大阪リージョンではサービス提供されていないようです。

1.1. AWS Client VPNのコスト

AWS Client VPN の利用料金についてですが、アクティブなクライアント接続の数と Client VPN に関連付けられているサブネットの数に対してそれぞれ 1 時間単位の料金が発生します。

東京リージョンだと以下の料金でした。

  • AWS Client VPN エンドポイントアソシエーション … 0.15USD/時間
  • AWS Client VPN 接続 … 0.05USD/時間

例として、サブネットを1つ割り当て(こちらは24/365で利用)して、 50人が1日8時間接続を20日すると1か月あたり以下の様な料金になります。

  • AWS Client VPN エンドポイントアソシエーション : 0.15USD/時間 * 24時間 * 30日 = 108USD
  • AWS Client VPN 接続 : 0.05USD/時間 * 50人 * 8時間 * 20日 = 400 USD
  • 合計 : 508USD

10人の場合には以下の料金ですね。

  • AWS Client VPN エンドポイントアソシエーション : 0.15USD/時間 * 24時間 * 30日 = 108USD
  • AWS Client VPN 接続 : 0.05USD/時間 * 10人 * 8時間 * 20日 = 168 USD
  • 合計 : 276USD

利用人数によって料金が変わってきます。大人数になればなるほど料金はかかってしまいますね。

いかがでしょうか、思ったより料金がかかりそうですね。

1.2. AWS Client VPN と EC2でOpenVPNサーバを構築した際のコストの比較

EC2インスタンスタイプをオンデマンドのt4g.medium(vCPU:2/メモリ4GiB)でOpenVPNサーバを構築した場合と比較してみました。

料金(東京リージョン)は以下になります。

  • t4g.medium … 0.0432 USD/時間

1か月あたりの料金を計算してみます。

  • 0.0432 USD/時間 * 24時間 * 30日 = 31.104 USDとなります。

上のインスタンスであれば10人程度は接続できると思いますのでEC2上でOpenVPNを構築すると月に245USD程度のコスト安という事になります。(運用費用などを考えると単純ではありませんが・・・)

小規模であればEC2インスタンスで構築するのがいいかもしれません。

と、いうことでEC2インスタンス上にOpenVPNサーバを構築していきます。

2. 前提条件

  • AWSアカウントが取得できていること
  • EC2インスタンス(AmazonLinux2)がありSSHなどでコンソールアクセスできる事
    • 今回は構築がメインのためt3.microで構築します。
  • EC2インスタンスからインターネットアクセス(HTTP/HTTPS)ができる事
    • OpenVPNのインストールで利用するため
  • 今回VPNポートとしてTCP 443ポートを利用する
    • Internetからアクセスできるようにセキュリティグループの設定がされていること。
    • 企業からアクセスする場合はFirewallで穴あけを依頼するのが大変なので。という理由です。
  • 接続するクライアント側のOSはWindowsとする(OpenVPN GUIを利用する)
    • LinuxやMacでも接続できますが割愛します。

3. 構成図

構成図は以下となります。自宅からAWS上にあるEC2にVPN接続します。

VPNに接続した後に、それぞれのサブネットへ導通確認用のインスタンスへping疎通ができるところまで確認したいと思います。

4. OpenVPNサーバ構築

4.1. OpenVPNインストール

では、早速EC2インスタンスへOpenVPNサーバをインストールしていきます。

Amazon LinuxのExtras Libraryからepelを有効にしてからOpenVPNをインストールします。

$ sudo su -
# amazon-linux-extras install -y epel
# yum install -y openvpn

4.2. 認証局の作成

OpenVPNのインストールだけではVPN接続はできません。

VPN接続には認証のために証明書を利用します。証明書を認証するためには認証局が必要となるため、作成するためにeasy-rsaインストールします。

wgetで取得してからしかるべきディレクトリ(/usr/local/EasyRSA/)に配置しています。

※2021年8月時点では3.0.8が最新だったのでそのバージョンをインストールします。

// easy-rsaのインストール
# wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
# tar -xvzf EasyRSA-3.0.8.tgz 
# mv EasyRSA-3.0.8 /usr/local/EasyRSA
# cd /usr/local/EasyRSA/

認証局の初期化をします。 パスワードが聞かれるので適宜入力してください。Common Nameなども適宜設定してください。

# ./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/local/EasyRSA/pki

認証局の作成を行います。

# ./easyrsa build-ca
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017

Enter New CA Key Passphrase: (パスワード入力)
Re-Enter New CA Key Passphrase: (パスワード入力)
Generating RSA private key, 2048 bit long modulus
......+++
............................................+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/local/EasyRSA/pki/ca.crt

DHパラメータを生成していきます。DHはDiffie-Hellmanの略です。

ディフィー・ヘルマン鍵共有(ディフィー・ヘルマンかぎきょうゆう、Diffie–Hellman key exchange、DH)、あるいはディフィー・ヘルマン鍵交換(かぎこうかん)とは、事前の秘密の共有無しに、盗聴の可能性のある通信路を使って、暗号鍵の共有を可能にする、公開鍵暗号方式の暗号プロトコルである。

# ./easyrsa gen-dh
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.+............................+.......................................................................................+.........
.
(略)
.
DH parameters of size 2048 created at /usr/local/EasyRSA/pki/dh.pem

4.3. 秘密鍵と証明書の作成

引き続きサーバ用とクライアント用の証明書(+秘密鍵)を作成します。

  • サーバ証明書
# ./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
.........+++
.....................+++
writing new private key to '/usr/local/EasyRSA/pki/easy-rsa-6645.2zKEWp/tmp.wCr629'
-----
Using configuration from /usr/local/EasyRSA/pki/easy-rsa-6645.2zKEWp/tmp.CShfPn
Enter pass phrase for /usr/local/EasyRSA/pki/private/ca.key: (パスワード入力)
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Nov 20 05:54:00 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated
  • クライアント証明書
# ./easyrsa build-client-full client1 nopass
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
........................................................................+++
................+++
writing new private key to '/usr/local/EasyRSA/pki/easy-rsa-6735.kYreUE/tmp.DX50oL'
-----
Using configuration from /usr/local/EasyRSA/pki/easy-rsa-6735.kYreUE/tmp.5v3r0i
Enter pass phrase for /usr/local/EasyRSA/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1'
Certificate is to be certified until Nov 20 05:55:15 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

ta.keyを作成します。TLSの認証時に使用するファイルです。

# openvpn --genkey --secret /etc/openvpn/ta.key

5. OpenVPNの設定(サーバ側)

ここまでで作成した証明局関連のファイルをopenvpnの設定フォルダへコピーします。

# cp pki/ca.crt /etc/openvpn/
# cp pki/issued/server.crt /etc/openvpn/
# cp pki/private/server.key /etc/openvpn/
# cp pki/dh.pem /etc/openvpn/dh2048.pem

openvpnの設定ファイルのひな形もコピーします。

openvpn-2.4.11の部分はインストールされているopenvpnのバージョンに合わせてください。

# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server.con

OpenVPNの設定ファイルを編集します。

# vi /etc/openvpn/server.conf
port 443

proto tcp
;proto udp

#server 10.8.0.0 255.255.255.0
server 192.168.100.0 255.255.255.0

push "route 10.1.0.0 255.255.0.0"
push "dhcp-option DNS 10.1.10.2"
push "dhcp-option DNS 10.1.20.2"

log         openvpn.log
log-append  openvpn.log

explicit-exit-notify 0

変更点について説明します。

  • ポートを443に変更
  • udpではなくtcpに変更
  • tcpだとexplicit-exit-notify 0に設定が必要
    • そうしないと、OpenVPNサーバのサービスが起動しません。
  • VPN接続時に割り当てられるIPを192.168.100.0/24に変更
    • Defaultの10.8.0.0/24でも問題はないです。VPCや家庭LAN、企業LAN内のIPとバッティングしなければOKです。
  • push routeはVPC内のネットワークを指定します。
  • dhcp optionは後で利用する(かも)ためです。実は今回の接続については不要です。
  • Logを有効化しています。
    • /etc/openvpnにファイルが作成されます。/var/log/openvpnとかに保管したければ適宜変更してください。

5.1. パケットフォワーディング設定

OpenVPNサービスを起動する前に、パケットの転送を有効にします。

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

// サービス先起動で有効化
# sysctl -p

5.2. OpenVPNサービスの起動

OpenVPNサーバのサービスを起動します。合わせて自動起動の設定も追加します。

# systemctl start openvpn@server
# systemctl status openvpn@server
# systemctl enable openvpn@server

5.3. OpenVPNのENI設定(AWS側で設定)

次にAWS側の設定になります。

OpenVPNがルータのような役割になるので、OpenVPNインスタンスの「Source/Dest Check」を「Disabled」に変更する必要があります。

5.4. VPCのルーティング設定(AWS側で設定)

次にVPNで接続したインスタンスからの戻りの経路設定を追加します

VPN接続時にクライアントに付与されるIPは192.168.100.0/24なので、これに対する宛先(Target)としてOpenVPNのインスタンスを指定します。

まず、VPNのインスタンスIDを確認して 192.168.100.0/24 の経路をルートテーブルに追加します。

※もしVPC内で複数のRouteTable(PublicとPrivateなど)がある場合にはそれぞれ追加します。

6. OpenVPNクライアント(Windows)の設定

サーバ側の準備が整ったのでクライアント側の設定を行っていきます。

6.1. OpenVPN GUI(Windows版)インストール

以下のページからOpenVPN GUIをダウンロードしてクライアントOS(windows)インストールします。

ダウンロード | OpenVPN.JP
最新のOpenVPNのWindows版パッケージ、ソースコードがダウンロードできます。

6.2. クライアント証明書ファイルのコピー

VPN接続に必要となるファイルをコピーします。

作成した以下の4つのファイルを「C:\Program Files\OpenVPN\config」フォルダにコピーします。

  1. /usr/local/EasyRSA/pki/ca.crt
  2. /usr/local/EasyRSA/pki/private/client1.key
  3. /usr/local/EasyRSA/pki/issued/client1.crt
  4. /etc/openvpn/ta.key

※SFPなどで直接C:\Program Files\OpenVPN\configフォルダにコピーはできない(管理者権限が必要なため)ので一旦デスクトップにコピーしてください。

// /home/ec2-user/ディレクトリに一旦コピーしてから権限を変更している例です。
# cp /usr/local/EasyRSA/pki/ca.crt /home/ec2-user/
# cp /usr/local/EasyRSA/pki/private/client1.key /home/ec2-user/
# cp /usr/local/EasyRSA/pki/issued/client1.crt /home/ec2-user/
# cp /etc/openvpn/ta.key /home/ec2-user/
# cd /home/ec2-user/
# chmod 644 ./*

6.3. OpenVPN設定ファイルの修正(クライアント側)

C:\Program Files\OpenVPN\sample-config」フォルダ内にサンプルとなるclient.ovpnファイルがあります。

これをC:\Program Files\OpenVPN\configフォルダにコピーしてきて設定ファイルとして編集します。

変更点は以下となります。

  • TCPに変更
  • remote のIPはVPNサーバのPublicIPを設定してください(Public DNSでも可です)
  • client1.crt と client1.key のファイル名に合わせて変更
proto tcp
;proto udp

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 13.xxx.xx.xx 443

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
ca ca.crt
cert client1.crt
key client1.key

7. 仮想アダプタの追加(TAP-Windows)

VPNに接続用の仮想アダプタを追加します。

TAP-Windowsは、OpenVPNという仮想ネットワークを構築することのできるオープンソースソフトウェアに付属する仮想ネットワークドライバです。

OpenVPN GUIをインストールすると以下のメニューが追加されているのでクリックしてください。

8. VPN接続、動作確認

では、実際にVPN接続を行います。OpenVPNのアイコンから接続します。

接続が正常にできたら実際に動作確認を行います。

// VPN接続時に192.168.100.xxが割り振られていること
> ipconfig
.
(略)
.
不明なアダプター OpenVPN TAP-Windows6:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.100.6


// 導通確認用のインスタンスへPing疎通ができる事
PS C:\Users\user> ping  10.1.10.243
PS C:\Users\user> ping  10.1.10.138

ここまで確認できればOpenVPNサーバ構築は完了となります。 結構長い手順になりました。

9. まとめ

EC2上でOpenVPNサーバを構築する手順についてまとめました。 2021年8月時点での手順となります。

皆様の参考になれば幸いです。

次はAWS内の名前解決をするようにしてIPアドレスではなくDNS名で接続できるようにしたいと思います。

追記:

以下の記事で最終的にCloudFormationとAnsibleを組み合わせてみました。

CloudFormationとAnsibleでEC2インスタンス構築時にOpenVPN構築してみた。
https://syachiku.net/cloudformation-ansible-userdata/

ansibleで構築する方法についても紹介しています。

AnsibleでOpenVPNのインストールをコード化する 
https://syachiku.net/ansible-openvpn-install/

10. 参考サイト

幾つか非常に参考となる記事があったのでかなり参考にさせていただきました。ありがたいですね。

https://dev.classmethod.jp/articles/ec2-ssl-vpn-use-openvpn/
https://toripiyo.hatenablog.com/entry/2020/05/14/212154
https://blog.katsubemakito.net/aws/openvpn_server

AWSを効率的に学習する方法

私が効率的にAWSを学習するために実施した方法は以下の通りです。
 ①最初に書籍(ハンズオンができる)を購入、座学でAWSの基礎を学習
 ②AWS資格試験を取得ための学習

※私の場合は①と②を合わせて2か月でソリューションアーキテクトを取得できました。

①AWS基礎学習

最初に購入した書籍は「Amazon Web Services 基礎からのネットワーク&サーバー構築」です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

この本では、AWSの基本サービスを利用したハンズオンを通じて、AWSの基礎を学習することができます。

また、タイトル通りAWSのネットワークやインフラに関しても網羅しているため、もともとインフラ系の技術者ではない人たちにとっても分かりやすい内容だと思います。

とりあえずAWS上にサーバーを設定して開発を行うための準備までするには最良の一冊です。

Amazon Web Services 基礎からのネットワーク&サーバー構築

②AWS資格取得

AWSの基礎をある程度学習することができたら、次はAWS資格を取得しましょう。まずはAWSソリューションアーキテクトを目指しましょう。

資格勉強のための問題集をひたすら解きながら、AWSの知識を積み重ねて習得していきましょう!

苦行ではありますがこの問題集を3周ほどすればAWS用語や構成に関しても習得できているはずです。

AWS認定ソリューションアーキテクト-アソシエイト問題集

今回は以上となります。

コメント