AWS
OpenVPN
ubuntu16.04

AWSにVPNサーバを立てる


はじめに

お仕事でちょっとVPN環境を作ってという依頼があり、VPN環境を作ってみましたが、ちょくちょくハマってしまったので、

手順やポイントなどをまとめておきます。


やりたいこと


  • AWS上にubuntu16.04のインスタンスを作成し、openvpnでVPNサーバにする

  • CAはeasyrsaで簡易的な認証局をVPNサーバー上に作成する

  • クライアント(Windows)にもopenvpnをインストールして複数台接続する

  • VPNサーバに接続したクライアント同士で通信できる

  • ユーザ名とパスワードじゃなくてクライアント証明書で認証する

  • VPNサーバはどうしてもubuntuでやりたい

ようするに下の絵のようなことがやりたい。

image.png


対象とする読者


  • VPNの仕組みは知っているが、openvpnを使ったことはない

  • AWSでLinuxインスタンスは作れる

  • AWSのLinuxにログインはできる


AWSに認証局を作ろう

OSはubuntu16.04です。CentOSでも似たようなものなので参考にはなるかと思いますが、適宜コマンドは置き換えて読んでください。

認証局を作るといってもなんちゃって認証局(easy-rsa)です。

作業はほとんどrootでやるので、sudo -iでroot化し、ライブラリをインストールしましょう[CA手順1]。


CA手順1

sudo -i

apt-get update
apt-get install openvpn libssl-dev openssl easy-rsa

インストールできたら認証局用のディレクトリを作成します[CA手順2]。


CA手順2

make-cadir /etc/openvpn/easy-rsa

cd /etc/openvpn/easy-rsa

[手順2]を実行したあとlsコマンドを実行すると、varsというファイルが出来上がります。

varsファイルを編集します。これは証明書を作成するときのCA自体の情報になります。

viエディタなどで編集します[CA手順3]。


CA手順3

vi vars


varsファイルの以下の部分をそれらしい情報に編集します。なんちゃって証明書の元になるだけなので適当でOKです[CA手順4]。


CA手順4

export KEY_COUNTRY="JP"              #国

export KEY_PROVINCE="KANAGAWA" #都道府県
export KEY_CITY="EBINA" #市
export KEY_ORG="KONISHI" #組織(会社?)
export KEY_EMAIL="konishi@mail.com" #メアド
export KEY_OU="MyOrganizationalUnit" #部署名?

編集できたら、シェルに設定内容を反映します[CA手順5]。


CA手順5

source ./vars

./clean-all

CAの鍵と証明書を作成します[CA手順6]


CA手順6

./pkitool --initca


実行し、[手順7]のような出力が出れば成功です。


CA手順7

Using CA Common Name: KONISHI CA

Generating a 2048 bit RSA private key
................................................+++
....................+++
writing new private key to 'ca.key'

次にDHパラメーターを作成します[CA手順8]。


CA手順8

./build-dh


実行し、正常に動作した場合は以下のような出力が確認できます。

image.png

実行後、/etc/openvpn/easy-rsa/keysの下に以下のファイルが作成されているはずです[CA手順9]


CA手順9

ls /etc/openvpn/easy-rsa/keys

ca.crt ca.key dh2048.pem index.txt serial

これで認証局の設定は完了です。


VPNサーバとVPNクライアントの証明書や鍵を作ろう

認証局にVPNのサーバ証明書や鍵を作ってもらいます。[SC手順1]。


SC手順1

./pkitool --server server


実行すると、/etc/openvpn/easy-rsa/keysの下に以下のファイルが作成されます。


  • server.crt

  • server.key

静的共有鍵もいるらしいので、[SC手順2]を実行してキーを生成します。


SC手順2

openvpn --genkey --secret ta.key


実行すると、/etc/openvpn/easy-rsaの下にta.keyが作成されます。

これでサーバー側に必要なキーと証明書が作成されたことになります。


VPNサーバの設定をしよう

CAに作ってもらったサーバの鍵をopenvpnのパスに配置します[openvpn_sv手順1]。


openvpn_sv手順1

cd /etc/openvpn/easy-rsa/keys

cp ca.crt server.crt server.key dh2048.pem /etc/openvpn
cd /etc/openvpn/easy-rsa/ta.key
cp ta.key /etc/openvpn

VPNサーバの設定を行います。まず、サーバの設定ファイルを用意します[openvpn_sv手順2]。


openvpn_sv手順2

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf


/etc/openvpn/server.confを編集します。変更箇所に★をつけています。


server.confの変更箇所

port 443 

# TCP or UDP server?
proto tcp
;proto udp

dev tap
;dev tun
;dev-node MyTap

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

server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248

;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
;push "redirect-gateway def1 bypass-dhcp"
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
cipher AES-256-CBC
comp-lzo
;max-clients 100
;user nobody
;group nogroup
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
;log-append openvpn.log
verb 3
;mute 20



ファイアウォールの設定

本設定ではSSLのポート番号を使用してVPN接続を行います。

AWSのセキュリティグループ、ubuntu自体のファイアウォールでポート443を通過できるように設定します。


AWSでの設定

インスタンスに該当するセキュリティグループを選択し、以下のようにインバウンドの設定で443を通過できるようにします。

image.png


ubuntuでの設定

ubuntuの場合、デフォルトではファイアウォールは無効なはずですが、AWSのインスタンスは有効になっているものもある?みたいです。

以下のコマンドを実行してinactiveになっている場合は設定不要です。


ファイアウォールのステータス確認

ufw status


activeだった場合は次のようにして443を通過できるようにします。


ファイアウォールで443を通過させる

ufw allow 443

ufw reload
ufw status


openvpnの起動

以下のコマンドでopenvpnを起動します。


起動コマンド

service openvpn@server start


/etc/openvpn/openvpn.logにログが出力されます。次のコマンドを実行して

ログを確認してください。


起動確認

cat /etc/openvpn/openvpn.log


以下のメッセージが出力されていれば起動できています。


メッセージの確認

Sun Aug 12 11:32:29 2018 Initialization Sequence Completed



VPNクライアントの設定をしよう

openvpnをダウンロードします。

ダウンロード先はここのURLです。

https://openvpn.net/index.php/open-source/downloads.html

以下の赤枠で囲んでいるopenvpn_install-2.4.6-1602.exeをダウンロードします。

image.png

インストールはインストーラーが表示するデフォルトを選択していけばOKです。

インストールが完了したら、VPNサーバでクライアント認証用のキーと証明書を作成します。

TeraTermなどでVPNサーバにログインし、次のコマンドを実行します。


キー作成

sudo -i

cd /etc/openvpn/easy-rsa
./pkitool mycli1(1台目のクライアントのキーと証明書作成)
./pkitool mycli2(2台目のクライアントのキーと証明書作成)

クライアントのopenvpnに必要な認証ファイル、キーファイルは以下です。


  • ca.crt

  • mycli1.crt(1台目の場合)

  • mycli1.key(1台目の場合)

  • mycli2.crt(2台目の場合)

  • mycli2.key(2台目の場合)

  • ta.key


  • これらのファイルをVPNサーバからWindowsにダウンロードします。
    ダウンロードする際、ファイルのパーミッションが足りず、ダウンロードできないファイルがあるので
    次のようにファイルをホームディレクトリにコピーし、こちらをダウンロードします。


権限の変更

cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu

cp /etc/openvpn/easy-rsa/keys/mycli1.crt /home/ubuntu
cp /etc/openvpn/easy-rsa/keys/mucli1.key /home/ubuntu
cp /etc/openvpn/easy-rsa/keys/mycli2.crt /home/ubuntu
cp /etc/openvpn/easy-rsa/keys/mucli2.key /home/ubuntu
cp /etc/openvpn/easy-rsa/ta.key /home/ubuntu
chmod 777 /home/ubuntu/ca.crt
chmod 777 /home/ubuntu/mycli1.crt
chmod 777 /home/ubuntu/mycli1.key
chmod 777 /home/ubuntu/mycli2.crt
chmod 777 /home/ubuntu/mycli2.key
chmod 777 /home/ubuntu/ta.key

TermTermを使用する場合、[ファイル]→[SSH_SCP]を使用してファイルをダウンロードできます(下図参照)。

image.png

[SSH_SCP]をクリックすると下図のダイアログが表示されるので、赤枠の部分にファイル名を入力してダウンロードします。

image.png

ダウンロードができたら以下のファイルは削除します。


削除

rm /home/ubuntu/ca.crt

rm /home/ubuntu/mycli1.crt
rm /home/ubuntu/mycli1.key
rm /home/ubuntu/mycli2.crt
rm /home/ubuntu/mycli2.key
rm /home/ubuntu/ta.key

C:\Users\<ユーザー名>\OpenVPN\configに次のファイルを配置しましょう。

PCごとにクライアントのキーと証明書は異なる必要があります。

(同じにしてしまうと、本設定ではみんな同じIPアドレスが割り当たってしまう)


1台目のPC

ca.crt

mycli1.crt
mycli1.key
ta.key


2台目のPC

ca.crt

mycli2.crt
mycli2.key
ta.key

次にC:\Program Files\OpenVPN\sample-config\client.ovpnファイルを

C:\Users\<ユーザー名>\OpenVPN\configにコピーし、編集します。

変更するパラメーターを以下に記します。


client.ovpn設定

dev tap

;dev tun
proto tcp
;proto udp
remote ec2-xx-xx-xx-xx.compute-1.amazonaws.com 443 xx-xx-xx-xxAWSのホスト名
cert mycli1.crt
key mycli1.key
comp-lzo

編集終了後、デスクトップに表示されるopenvpnのアイコンを[右クリック]→[管理者として実行]を選択して起動します。

下図参照。

image.png

タスクバーにopenvpnのアイコンが表示されます。

openvpnのアイコンをダブルクリックするか、右クリックしたあと、「接続」を選択するとつながります。