OpenVPN 2.4によるVPN接続環境をAWSで構築する
まいど、大阪の市田です。
AWS上でOpenVPNを使ったVPN接続を行う際は下記のブログが参考になりますが、2017年9月現在ではこの内容ではVPN接続出来ません。今回はこちらの記事をアップデートする形でVPN環境を構築したいと思います。
(今回は暗号化の強度等については検証していません。デフォルトの設定で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でインストールします。
1 | # sudo yum -y install openvpn |
以前の記事でインストールされるOpenVPNは「2.3.6」ですが、今回は下記の通り「2.4.3」がインストールされました。この違いでデフォルトのコンフィグに差異が発生します。
1 2 | $ rpm -q openvpnopenvpn-2.4.3-1.19.amzn1.x86_64 |
easy-rsaのインストール
今回も証明書による認証方式を採用しますので、easy-rsaを利用して認証機関を自前で設置します。今回利用するeasy-rsaは最新バージョンの「3.0.3」です。下記ページから最新バージョンをダウンロードしましょう。
1 2 3 4 | $ 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/ |
自前認証機関の設置
自前の認証局を設置していきます。最初に初期化を行います。
1 2 3 4 | $ ./easyrsa init-pkiinit-pki complete; you may now create a CA or requests.Your newly created PKI dir is: /usr/local/EasyRSA/pki |
次に認証局を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ ./easyrsa build-caGenerating 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 incorporatedinto 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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.----- |
以前の記事同様にCommon Nameは適当につけてください。今回もデフォルトのままで進めています。
1 2 3 4 5 | 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パラメータを生成します。少し時間がかかるので気長に待ちます。
1 2 3 4 5 6 | $ ./easyrsa gen-dhGenerating DH parameters, 2048 bit long safe prime, generator 2This is going to take a long time......(中略)DH parameters of size 2048 created at /usr/local/EasyRSA/pki/dh.pem |
サーバ用の秘密鍵と証明書の作成
サーバ用の秘密鍵と証明書の作成、署名をまとめて行います。nopassオプションで「パスフレーズ無し」で作成します。必要に応じて変更して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ ./easyrsa build-server-full server nopassGenerating 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.cnfEnter pass phrase for /usr/local/EasyRSA/pki/private/ca.key:Check that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscommonName :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 entriesData Base Updated |
クライアント用秘密鍵/証明書の作成
同様にクライアント用の作業を行います。作成するクライアントの名前は前回と同じclient1にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ ./easyrsa build-client-full client1 nopassGenerating 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.cnfEnter pass phrase for /usr/local/EasyRSA/pki/private/ca.key:Check that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscommonName :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 entriesData Base Updated |
クライアント用の秘密鍵と証明書が下記の通り作成されますので、パスを控えておきましょう。CA証明書と同じで、後でダウンロードして使います。
- クライアント用の秘密鍵:
/usr/local/EasyRSA/pki/private/client1.key - クライアント用の証明書:
/usr/local/EasyRSA/pki/issued/client1.crt
OpenVPNサーバの設定
次にOpenVPNのサーバ設定を行います。
作成したCA証明書、サーバ用証明書、サーバ用秘密鍵、DHパラメータを/etc/openvpn以下にコピーします。
1 2 3 4 | $ 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をひな形からコピーして作成します。
1 | $ sudo cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/server.conf |
コンフィグの有効行は下記の通りです。以前のバージョン(2.3系)と比べると、デフォルトの内容が少し変わっていて、tls-authやcipherの指定が有効になっています。
また、push "route 192.168.1.0 255.255.255.0"の行については、コメントアウトされていたサンプルを編集して有効化しておきましょう。OpenVPNインスタンスがあるサブネットのネットワークを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | port 1194proto udpdev tunca ca.crtcert server.crtkey server.key # This file should be kept secretdh dh2048.pemserver 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txtpush "route 192.168.1.0 255.255.255.0"keepalive 10 120tls-auth ta.key 0 # This file is secretcipher AES-256-CBCpersist-keypersist-tunstatus openvpn-status.logverb 3explicit-exit-notify 1 |
tls-auth ta.key 0の設定が有効になっていますが、ta.keyが存在しないので作成します。
1 | $ sudo openvpn --genkey --secret /etc/openvpn/ta.key |
次に、/etc/sysctl.confを編集してパケットの転送を有効にします。
1 2 3 | net.ipv4.ip_forward = 0↓net.ipv4.ip_forward = 1 |
設定後はインスタンスを再起動するか、下記コマンドで設定を反映させて下さい。
1 | $ sudo sysctl -p |
以上でセットアップが完了したので、OpenVPNを起動します。自動起動設定も有効にしておきましょう。
1 2 | $ sudo service openvpn start$ sudo chkconfig openvpn on |
Security Groupの設定
OpenVPNはデフォルトでUDPの1194ポートを利用するので、これに対するアクセス許可を入れます。
今回は、VPN接続元の拠点IPに対してルールを設定しました。
OpenVPNのENI設定
OpenVPNがルータのような役割になるので、OpenVPNインスタンスの「Source/Dest Check」を「Disabled」に変更します。
VPCのルーティング設定
次にVPNで接続したインスタンスからの戻りの経路設定を追加します。クライアントに付与されるIPはデフォルトで10.8.0.0/24なので、これに対する宛先(Target)としてOpenVPNのインスタンスを指定して下さい。
以上で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を起動して「プロファイル」をクリックします。
「追加」をクリックしてプロファイルを追加します。
「一般設定」の画面で下記の通り設定します。
| 設定項目 | 設定内容 |
|---|---|
| プロファイル名 | 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)を下記のようにコメントインして下さい。
1 2 3 | ;comp-lzo↓comp-lzo |
バージョン2.4以降の新しいクライアントで圧縮設定を使う場合は「lz4-v2」を使います。
設定方法については、本記事の最後の方に「圧縮設定の補足」という章に記載したので、そちらを参照して下さい。
次に「詳細設定」をクリックして追加で設定を行います。OpenVPNのバージョンが2.4になったことで「詳細設定」が必要になりました。
| 設定項目 | 設定内容 |
|---|---|
| 暗号アルゴリズム | AES-256-CBCを選択して下さい。OpenVPNサーバの cipherで指定されているものを選択します。AES-256-CBCはデフォルトです。 |
| 追加セキュリティ設定 | 「TLS-Auth HMAC署名を使用」にチェックを入れて「共有鍵」にta.keyを指定して下さい。 |
設定できたら保存して「閉じる」をクリックします。
元の画面に戻ったら、作成したプロファイルを選択して「接続」をクリックして下さい。
タスクトレイにあるvpnuxのアイコンが緑色になって、接続できた旨のバルーンが表れたらOKです。
この状態でVPN接続ができているので、下記のようにVPN経由でアクセスできれば完了です。
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等と同じフォルダに保存して下さい。
client1.ovpnのデフォルトの有効行は下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | clientdev tunproto udpremote xxx.xxx.xxx.xxx 1194resolv-retry infinitenobindpersist-keypersist-tunca ca.crtcert client1.crtkey client1.keyremote-cert-tls servertls-auth ta.key 1cipher AES-256-CBCverb 3 |
上記の内、下記3点を修正します。
| 設定項目 | 設定内容 |
|---|---|
| remote | OpenVPNのインスタンスのElastic IP、ポートを指定して下さい。 |
| cert | クライアント用の証明書client1.crtを指定して下さい。 |
| key | クライアント用の秘密鍵client1.keyを指定して下さい。 |
もし暗号化アルゴリズムcipherを変更する場合は、サーバ側とクライアント側で同じものを指定するようにして下さい。
設定ファイルが作成できたら「OpenVPN GUI」をショートカットから起動します。
起動したらタスクトレイから「接続」をクリックします。
接続が成功すると下記にようなバルーンが表れます。
デフォルトで設定ファイル(client1.ovpn)をうまく指定できない場合は、「設定」をクリックして手動で指定できます。
「Advanced」タブで指定します。
Macの場合(Tunnelblickの設定)
続いてMacで接続する場合です。今回は「Tunnelblick」を使った方法です。Tunnelblickのインストールは下記ページを参考にして下さい。
先程と同じように、client1.ovpnファイルを作成します。内容は先程と同じです。
作成できたらovpnファイルをダブルクリックして、Tunnelblickを起動します。
利用ユーザの確認は「個人用」を選択します。
PCのログインパスワードを入力して下さい。
コンフィグのインストールが完了すると、成功した旨の表示が出ます。
次にTunnelblickの設定を修正します。Tunnelblickのアイコンをクリックして「VPNの詳細」を選択して下さい。
インストールした「client1」を選択して、「OpenVPNバージョン」から「2.4.3 - OpenSSL v1.0.2k」を指定して下さい。デフォルトは「2.3.17」になっているので、変更しないと接続できない為です。
これで準備完了です。先程と同じようにアイコンをクリックして「client1に接続」をクリックして接続します。
接続時に小さなウィンドウが現れます。この表示が下記のようになればOKです。
接続できれば、Tunnelblickのアイコンが下記の様に変わります。
圧縮設定の補足
圧縮設定を有効にする場合は、サーバ側の下記設定を有効にして下さい。
1 2 3 4 5 | ;compress lz4-v2;push "compress lz4-v2"↓compress lz4-v2push "compress lz4-v2" |
OpenVPN2.4より古いクライアントの場合はエラーになるかもしれないので、その場合は上記をコメントアウトしてcomp-lzoの方を有効にして下さい。
comp-lzo有効にしたら、クライアント側の設定も有効にして下さい。(vpnuxの場合は「LZO圧縮を有効にする」にチェックを入れます)
1 2 3 | ;comp-lzo↓comp-lzo |
最後に
個人的になぜかVPN関係の記事をよく書く為、最新情報にアップデートしてみました。
比較的大きなアップデートがあると、今回のように以前の方法ではうまくいかないかもしれません。今後も変更があればキャッチアップしてご紹介していきたいと思います。
以上です。