Amazon Ec2

EC2でOpenVPNサーバを構築してみた

はじめに

こんにちは、omkです。
今回はEC2でOpenVPNサーバを立てて、VPNサーバの同一VPC内の別サーバにVPNからSSHしてみました。VPNにはWindowsの端末から接続します。

やり方はあまりわかっていなかったので以下のサイトを参考にしながら構築しました。その中で詰まったところをご説明できればと思います。
https://linux-memo.net/aws/openvpnwithaws_top.html

記事が長くなったので、詰まったポイントは別の記事で説明します。
https://blog.denet.co.jp/ec2openvpnserverpoint/

※CentOS7を前提として進めていきます。

構築

AWS側の操作(端折ります)

まずAWS上でVPCやサブネット、インターネットゲートウェイを作り、VPNサーバを設置するサブネットにインターネットとのルートを作ります。
VPCは10.0.0.0/16で取ってます。

次にVPNサーバにするEC2インスタンスを立てます。セキュリティグループはOpenVPNで使用する1194番と構築に使うSSHの22番だけ開けます。1194はUDPで使用することにします。ソースは用途によりますが、今回はどちらも自分の拠点のみ許可しました。

また、EC2コンソールの「アクション」から「送信元/送信先チェック変更」で「ソース/宛先チェックを無効化」します。
VPCのルートテーブルで、送信先に「VPNで割り当てるIP」を入力してターゲットとしてVPCサーバのEC2に割り当てられているネットワークインターフェースを設定します。
これでVPC内でVPNとの通信ルートが確立されます。

SSH先のEC2も用意します。
こちらのセキュリティグループはVPN接続後に設定されるIPの範囲のみSSHを許可しておきます。

サーバ構築

各種インストール

ここからはEC2インスタンス内での操作です。OpenVPNを入れてサーバを構築していきます。

OpenVPNをインストールします。
epelからインストールするのでまずepelを入れます。

sudo yum install epel-release

本命のOpenVPNです。

sudo yum install openvpn

次にEasy-RSAをインストールします。こちらで証明書等を作成してVPCの接続に使用します。

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz

Easy-Rsaの設定

Easy-RSAのセットアップをしていきます。

cd EasyRSA-v3.0.6

CAや証明書の有効期限を設定します。

cp vars.examle vars
vi vars

有効期限の設定に関しては少しだけ以下の記事で触れているのでよろしければご確認ください(直接は関係ないです)。
https://blog.denet.co.jp/easy-rsa_validity/

初期化します。初期化以降はVPN構築に必要な証明書等を発行していきます。

./easyrsa init-pki

CAの作成

./easyrsa build-ca nopass

DHパラメータファイルの生成(よくわかってないです)

./easyrsa gen-dh

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

./easyrsa build-server-full server nopass

クライアントの作成

./easyrsa build-client-full client1 nopass

失効証明書の作成のために失効させるダミークライアントの作成

./easyrsa build-client-full dummy nopass

ダミークライアントの失効

./easyrsa revoke dummy

失効証明書の発行

./easyrsa gen-crl

以上でEasy-RSAでの操作は終了です。必要な証明書が揃ったので/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
sudo cp pki/crl.pem /etc/openvpn/

OpenVPNの設定

次にOpenVPNの設定をしていきます。

cd /etc/openvpn

OpenVPNのサーバ設定(server.conf)は以下の場所にテンプレートが用意されているのでこちらをコピーして使用します(パスにバージョンが含まれるので適宜ご確認ください)。

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

server.confを編集していきます。

sudo vi server.conf

今回VPN接続にはUDPで1194番ポートを使います。以下の設定を確認します。

port 1194
proto udp

先ほどEasy-RSAで作成した証明書類が正しい名前で配置されていることを確認します。

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

以下はVPN接続後に端末に割り当てられるIPアドレスの範囲です。VPCで使用している範囲と被らないように設定します。
私の場合、デフォルトの設定のままですが、VPCを10.0.0.0/16で取っていたのでこのまま使いました。

server 10.8.0.0 255.255.255.0

次にVPN接続後に通信できるIPの範囲を設定します。

;push "route 192.168.10.0 255.255.255.0"

⇒コメントアウトを外して書き換えます。
今回はVPC全域を許可することにしたのでVPCのIPの範囲(10.0.0.0/16)を指定しました。

push "route 10.0.0.0 255.255.0.0"

VPCでDNS解決を有効化しておけばVPC内のDNSを利用して名前解決が可能になります。VPCのネットワークの範囲+2がDNSのアドレスです。

;push "dhcp-option DNS 208.67.222.222"

⇒コメントアウトを外して書き換えます。

push "dhcp-option DNS 10.0.0.2"

デーモンを起動するユーザーをnobodyに変えます。nobodyは権限が弱くて比較的安全らしいです。

;user nobody
;group nobody

⇒コメントアウトを外します。

user nobody
group nobody

ログの出力先を指定します。

;log-append  openvpn.log

⇒コメントアウトを外してパスを指定します。

log-append  /var/log/openvpn.log

失効証明書を有効化します。以下を追記します。

crl-verify crl.pem

変更を保存してエディタを閉じます。

tls-authで使用する静的鍵を作成する必要があるそうなので作ります。

openvpn --genkey --secret ta.key

以上でサーバの設定は完了です。
OpenVPNのサービスを起動します。

sudo systemctl start openvpn@server.service

クライアント設定

次にクライアントとの設定をしていきます。
クライアントの設定ファイルをコピーします。

sudo cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/client.conf /tmp/client.conf

編集します。

sudo vi /tmp/client.conf

VPNの接続先をmy-server-1からVPNサーバのグローバルIPに書き換えます。

remote my-server-1 1194

remote ***.***.***.*** 1194

クライアント名を証明書発行時に設定したものへ変えます。

cert client.crt
key client.key

cert client1.crt
key client1.key

以上でクライアントの設定は完了です。
保存してエディタを終了します。

接続

  • {Easy-RSAの手前のパス}/EasyRSA-v3.0.6/pki/ca.crt
  • {Easy-RSAの手前のパス}/EasyRSA-v3.0.6/pki/issued/client1.crt
  • {Easy-RSAの手前のパス}/EasyRSA-v3.0.6/pki/private/client1.key
  • /etc/openvpn/ta.key
  • /tmp/client.conf

をそれぞれダウンロードします。

OpenVPNのクライアントソフトをVPNクライアントの端末にインストールします。
ここからインストーラーをダウンロードできます。
https://www.openvpn.jp/download/

インストール後、

C:\Users\ユーザー名\OpenVPN\config

にフォルダを作って先ほどダウンロードしたファイルをすべて入れます。
client.confはclient.ovpnに拡張子を変えます。

以上で接続設定が完了しているのでタスクバーでOpenVPNクライアントのアイコンを右クリックし、clientを選択して接続します。

以上でVPNへの接続が出来た場合はSSH先のローカルIPを用いてSSHで接続できると思います。

まとめ

一度構築してまとめてみるとすんなり進んでいるように感じますが色々と試行錯誤しながらの構築で苦労しました。
知らないことばかりで大変でしたが一度自分で作ってみたことで知識の会得と理解が進み、考えられることが増えたように思います。