OpenVPN 2.4によるVPN接続環境をAWSで構築する

openvpn-logo

まいど、大阪の市田です。

AWS上でOpenVPNを使ったVPN接続を行う際は下記のブログが参考になりますが、2017年9月現在ではこの内容ではVPN接続出来ません。今回はこちらの記事をアップデートする形でVPN環境を構築したいと思います。

Amazon EC2とOpenVPNでサーバ-多拠点クライアント間通信をセキュアに行う

(今回は暗号化の強度等については検証していません。デフォルトの設定でVPN接続できることを目的としています。)

いきなりまとめ

  • 既存記事でVPN接続できない理由は、デフォルトでインストールされるOpenVPNのバージョンが変わったから
  • この影響でVPNクライアント「vpnux Client」の設定方法も変わる
  • 今回はMacでの接続方法も紹介

OpenVPNサーバの構築

今回もEC2インスタンスには、Amazon Linux(amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 (ami-4af5022c)を利用します。インスタンスの作成が完了したらElastic IPも付与しておきましょう。

OpenVPNのインストール

yumでインストールします。

# sudo yum -y install openvpn

以前の記事でインストールされるOpenVPNは「2.3.6」ですが、今回は下記の通り「2.4.3」がインストールされました。この違いでデフォルトのコンフィグに差異が発生します。

$ rpm -q openvpn
openvpn-2.4.3-1.19.amzn1.x86_64

easy-rsaのインストール

今回も証明書による認証方式を採用しますので、easy-rsaを利用して認証機関を自前で設置します。今回利用するeasy-rsaは最新バージョンの「3.0.3」です。下記ページから最新バージョンをダウンロードしましょう。

Releases · OpenVPN/easy-rsa

$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz
$ tar -xvzf EasyRSA-3.0.3.tgz
$ sudo mv EasyRSA-3.0.3 /usr/local/EasyRSA
$ cd /usr/local/EasyRSA/

自前認証機関の設置

自前の認証局を設置していきます。最初に初期化を行います。

$ ./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

Generating a 2048 bit RSA private key
...............................................................................................................................................+++
.............................................+++
writing new private key to '/usr/local/EasyRSA/pki/private/ca.key.DdCPecU3Sr'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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は適当につけてください。今回もデフォルトのままで進めています。

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

これでCA証明書が作成されました。後でダウンロードして使うのでパス/usr/local/EasyRSA/pki/ca.crtを控えておきましょう。

次にgen-dhコマンドでDHパラメータを生成します。少し時間がかかるので気長に待ちます。

$ ./easyrsa gen-dh

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

サーバ用の秘密鍵と証明書の作成

サーバ用の秘密鍵と証明書の作成、署名をまとめて行います。nopassオプションで「パスフレーズ無し」で作成します。必要に応じて変更して下さい。

$ ./easyrsa build-server-full server nopass

Generating a 2048 bit RSA private key
.............................................................+++
.................................................................+++
writing new private key to '/usr/local/EasyRSA/pki/private/server.key.67nnxh1pkn'
-----
Using configuration from ./openssl-1.0.cnf
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 Sep  3 10:10:23 2027 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

クライアント用秘密鍵/証明書の作成

同様にクライアント用の作業を行います。作成するクライアントの名前は前回と同じclient1にしています。

$ ./easyrsa build-client-full client1 nopass

Generating a 2048 bit RSA private key
....................................+++
......................+++
writing new private key to '/usr/local/EasyRSA/pki/private/client1.key.G6nYkAUCzj'
-----
Using configuration from ./openssl-1.0.cnf
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 Sep  3 10:12:21 2027 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

クライアント用の秘密鍵と証明書が下記の通り作成されますので、パスを控えておきましょう。CA証明書と同じで、後でダウンロードして使います。

  • クライアント用の秘密鍵:/usr/local/EasyRSA/pki/private/client1.key
  • クライアント用の証明書:/usr/local/EasyRSA/pki/issued/client1.crt

OpenVPNサーバの設定

次にOpenVPNのサーバ設定を行います。
作成したCA証明書、サーバ用証明書、サーバ用秘密鍵、DHパラメータを/etc/openvpn以下にコピーします。

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

サーバのコンフィグファイル/etc/openvpn/server.confをひな形からコピーして作成します。

$ sudo cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/server.conf

コンフィグの有効行は下記の通りです。以前のバージョン(2.3系)と比べると、デフォルトの内容が少し変わっていて、tls-authcipherの指定が有効になっています。

また、push "route 192.168.1.0 255.255.255.0"の行については、コメントアウトされていたサンプルを編集して有効化しておきましょう。OpenVPNインスタンスがあるサブネットのネットワークを指定します。

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.1.0 255.255.255.0"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1

tls-auth ta.key 0の設定が有効になっていますが、ta.keyが存在しないので作成します。

$ sudo openvpn --genkey --secret /etc/openvpn/ta.key

次に、/etc/sysctl.confを編集してパケットの転送を有効にします。

net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1

設定後はインスタンスを再起動するか、下記コマンドで設定を反映させて下さい。

$ sudo sysctl -p

以上でセットアップが完了したので、OpenVPNを起動します。自動起動設定も有効にしておきましょう。

$ sudo service openvpn start
$ sudo chkconfig openvpn on

Security Groupの設定

OpenVPNはデフォルトでUDPの1194ポートを利用するので、これに対するアクセス許可を入れます。
今回は、VPN接続元の拠点IPに対してルールを設定しました。

01-openvpn-port

OpenVPNのENI設定

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

03-change-source-dest

04-disable-source-dest-check

VPCのルーティング設定

次にVPNで接続したインスタンスからの戻りの経路設定を追加します。クライアントに付与されるIPはデフォルトで10.8.0.0/24なので、これに対する宛先(Target)としてOpenVPNのインスタンスを指定して下さい。

02-vpc-routes

以上でAWS側の作業は完了です。

クライアント設定

次にクライアント側の設定です。

Windowsの場合(vpnux Clientの設定)

前回の記事同様に「vpnux Client」を使ってみます。先程見た通り、OpenVPNのデフォルトのコンフィグが変わったので「vpnux Client」の設定も少し変わります。「vpnux Client」はインストール済みとします。

vpnux Client - OpenVPN client for Windows

OpenVPNサーバ上で作成した以下のファイルをサーバからクライアント側にダウンロードしておきます。
以前の記事との違いは、TLS認証鍵ta.keyもダウンロードしておくという点です。

  • /usr/local/EasyRSA/pki/ca.crt
  • /usr/local/EasyRSA/pki/private/client1.key
  • /usr/local/EasyRSA/pki/issued/client1.crt
  • /etc/openvpn/ta.key

これらを適当なフォルダにまとめて保存しておきましょう。

vpnux Clientの設定

vpnux Clientを起動して「プロファイル」をクリックします。

05-click-profile

「追加」をクリックしてプロファイルを追加します。

06-add-profile

「一般設定」の画面で下記の通り設定します。

07-config-basic-vpnx

設定項目 設定内容
プロファイル名 VPN接続の名称です。分かりやすいものを設定して下さい。
VPNサーバー OpenVPNインスタンスのElasic IPを指定して下さい。
LZO圧縮を有効にする デフォルトでチェックが入っているので、外して下さい。
CA証明書 ca.crtを指定します。
証明書認証(PKI)を使用 チェックを入れて下さい。
証明書認証(PKI):証明書 client1.crtを指定して下さい。
証明書認証(PKI):秘密鍵 client1.keyを指定して下さい。

LZO圧縮のcomp-lzoはOpenVPN2.4からはデフォルトでコメントアウトされました。古いクライアントでサポートされているものということなので、利用する場合はOpenVPNサーバの設定(/etc/openvpn/server.conf)を下記のようにコメントインして下さい。

;comp-lzo
↓
comp-lzo

バージョン2.4以降の新しいクライアントで圧縮設定を使う場合は「lz4-v2」を使います。
設定方法については、本記事の最後の方に「圧縮設定の補足」という章に記載したので、そちらを参照して下さい。

次に「詳細設定」をクリックして追加で設定を行います。OpenVPNのバージョンが2.4になったことで「詳細設定」が必要になりました。

08-config-advanced-vpnx

設定項目 設定内容
暗号アルゴリズム AES-256-CBCを選択して下さい。
OpenVPNサーバのcipherで指定されているものを選択します。AES-256-CBCはデフォルトです。
追加セキュリティ設定 「TLS-Auth HMAC署名を使用」にチェックを入れて「共有鍵」ta.keyを指定して下さい。

設定できたら保存して「閉じる」をクリックします。

09-complete-profile

元の画面に戻ったら、作成したプロファイルを選択して「接続」をクリックして下さい。

10-connect

タスクトレイにあるvpnuxのアイコンが緑色になって、接続できた旨のバルーンが表れたらOKです。

11-connected

この状態でVPN接続ができているので、下記のようにVPN経由でアクセスできれば完了です。

12-browser-windows

Windowsの場合(OpenVPN GUIの設定)

次は「OpenVPN GUI」を使った接続方法です。

「OpenVPN GUI」を使う場合は、別途OVPNファイルを作成する必要があります。「OpenVPN GUI」のインストールはインストーラを実行するだけなので割愛致します。下記ページを参考にしてインストールして下さい。

OpenVPN GUI for Windows | OpenVPN.JP

インストールできたら、サーバからクライアント用のサンプルをダウンロードしましょう。
サンプルファイルは/usr/share/doc/openvpn-2.4.3/sample/sample-config-files/client.confです。このファイルをclient1.ovpnとしてclient1.key等と同じフォルダに保存して下さい。

13-create-ovpn-file

client1.ovpnのデフォルトの有効行は下記の通りです。

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

上記の内、下記3点を修正します。

設定項目 設定内容
remote OpenVPNのインスタンスのElastic IP、ポートを指定して下さい。
cert クライアント用の証明書client1.crtを指定して下さい。
key クライアント用の秘密鍵client1.keyを指定して下さい。

もし暗号化アルゴリズムcipherを変更する場合は、サーバ側とクライアント側で同じものを指定するようにして下さい。

設定ファイルが作成できたら「OpenVPN GUI」をショートカットから起動します。

14-enter-opengui-icon

起動したらタスクトレイから「接続」をクリックします。

15-connect-vpn

接続が成功すると下記にようなバルーンが表れます。

18-success-vpn-connect

デフォルトで設定ファイル(client1.ovpn)をうまく指定できない場合は、「設定」をクリックして手動で指定できます。

16-change-config-file

「Advanced」タブで指定します。

17-change-config

Macの場合(Tunnelblickの設定)

続いてMacで接続する場合です。今回は「Tunnelblick」を使った方法です。Tunnelblickのインストールは下記ページを参考にして下さい。

【AWS】統合脅威管理「Sophos UTM」を使ってVPCへSSL-VPN接続する(MacOSX編)

先程と同じように、client1.ovpnファイルを作成します。内容は先程と同じです。
作成できたらovpnファイルをダブルクリックして、Tunnelblickを起動します。

19-tunnelbrick-wclick

利用ユーザの確認は「個人用」を選択します。

21-kojin

PCのログインパスワードを入力して下さい。

22-password

コンフィグのインストールが完了すると、成功した旨の表示が出ます。

23-success

次にTunnelblickの設定を修正します。Tunnelblickのアイコンをクリックして「VPNの詳細」を選択して下さい。

24-detail

インストールした「client1」を選択して、「OpenVPNバージョン」から「2.4.3 - OpenSSL v1.0.2k」を指定して下さい。デフォルトは「2.3.17」になっているので、変更しないと接続できない為です。

25-select-version

これで準備完了です。先程と同じようにアイコンをクリックして「client1に接続」をクリックして接続します。

26-connect-vpn

接続時に小さなウィンドウが現れます。この表示が下記のようになればOKです。

27-success-connect

接続できれば、Tunnelblickのアイコンが下記の様に変わります。

28-ok-icon

圧縮設定の補足

圧縮設定を有効にする場合は、サーバ側の下記設定を有効にして下さい。

;compress lz4-v2
;push "compress lz4-v2"
↓
compress lz4-v2
push "compress lz4-v2"

OpenVPN2.4より古いクライアントの場合はエラーになるかもしれないので、その場合は上記をコメントアウトしてcomp-lzoの方を有効にして下さい。
comp-lzo有効にしたら、クライアント側の設定も有効にして下さい。(vpnuxの場合は「LZO圧縮を有効にする」にチェックを入れます)

;comp-lzo
↓
comp-lzo

最後に

個人的になぜかVPN関係の記事をよく書く為、最新情報にアップデートしてみました。
比較的大きなアップデートがあると、今回のように以前の方法ではうまくいかないかもしれません。今後も変更があればキャッチアップしてご紹介していきたいと思います。

以上です。