TORIPIYO DIARY

recent events, IoT, programming, security topics

openvpnを使ってaws環境にVPNサーバを比較的低コストで構築する方法

追記

Amazon Linux 2 向けに新しく記事を書き直しました!
toripiyo.hatenablog.com
=============================================================

家のネットワークとAWS環境をVPNで繋ぎたくて、openvpnVPN環境を構築してみました。いろんなサイトを参考にしながら構築しているので、その手順をまとめたいと思います。中小企業であれば、専用のVPN機器を購入しなくてもこれで十分ではないかと思います。VPNにかかるコストはt2.nanoの稼働コストのみなので、比較的安い費用でvpnを構築できます。

f:id:ha107chan:20170723204801p:plain

上図の構成の通り、VPNサーバをAWS環境上に構築します。この構成を取ることで、

  • ユーザはVPNサーバを通してSSHやHTTP通信を行えるようになり、サービスを不必要に外部に公開しなくても良くなります。例えば、データベースサーバをMacなどから直接いじりたいときも、データベースサーバをインターネット環境に公開する必要はありません。
  • ユーザ個別に証明書と鍵を発行することでプロジェクトから抜けたユーザがAWS環境にアクセス出来ないように個別にアクセス制御が出来ます。


このVPNサーバは、1個のVPCに1個構築するイメージで構築しています。ですので、複数のVPCVPNサーバを利用したい場合は、VPNサーバを各VPCごとに構築する必要がありますのでお気をつけください。

VPN 環境の構築

VPNサーバの構築

VPNサーバ用のEC2インスタンスを起動

そんなに高いスペックでなくても、数人のユーザで利用するのであれば負荷はほとんどなく利用できます。
spec

  • AMI:amzn-ami-hvm-2017.03.1.20170623-x86_64-gp2, SSD Volume Type
  • Subnet: subnet1 (subnet1は、インターネットと通信できるようにInternet Gatewayがルーティングテーブルに設定されている必要がある。)
  • instance type: t2.nano
  • root volume: ebs

security groupを設定
以下のInbound設定をする

# vpn接続で利用するポート
TCP/1194
# vpnサーバにsshログインして作業するために開ける、作業が終わったら閉じても構わない
SSH/TCP/22

elastic IPを設定
VPNサーバのグローバルIPアドレスを固定するために、AWSのコンソールから設定する

日本時間に修正

clockファイルの修正

vi /etc/sysconfig/clock

# ZONE="UTC"
ZONE="Japan"
UTC=true

シンボリックリンクの修正

ln -sf /usr/share/zoneinfo/Japan /etc/localtime
OS内のネットワーク設定の修正

ip forwardingの有効化

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -w net.ipv4.ip_forward=1
cat /proc/sys/net/ipv4/ip_forward # 1となっていることを確認

ip masqueradeの有効化

echo "iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE" >> /etc/rc.local (ip masqueradeの起動時の有効化)
openvpnのインストール

パッケージのアップデート

yum update -y

openvpnパッケージのインストール

yum install -y openvpn

easy-rsaパッケージのインストール

yum install easy-rsa -y --enablerepo=epel
証明書の作成

CA証明書と鍵の作成

cd /usr/share/easy-rsa/2.0
vi vars

# 組織情報とあうように適切な値を入力する
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Ota-ku"
export KEY_ORG="Cat Inc."
export KEY_EMAIL="admin@toripiyo.com"
export KEY_OU="Development Unit"

. ./vars
./clean-all # "NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/easy-rsa/2.0/keys" message will be shown.
./build-ca # use default value

サーバ証明書と鍵の作成

./build-key-server server  # set "common name" => vpn host name

クライアント証明書と鍵の作成

  • プロンプトが表示されたときは、基本的にそのままEnterを押していけば大丈夫
  • 下記では、tamaというユーザ向けのクライアント証明書と鍵を作成する例
./build-key tama

Diffie Hellmanパラメータの生成

# 少し生成に時間がかかる
./build-dh
証明書失効のための設定
  • ダミー証明書を作成して失効する、一度実施しないと証明書失効リストファイルが作成されない
cd /usr/share/easy-rsa/2.0
. ./vars
./build-key dummy # use default value
./revoke-full dummy (keys/crl.pem ファイルが作成される)
openvpnサーバの設定

server.confファイルの編集
protoをudpにしているサイトが多いけれど、tcpに変更したほうが接続が安定したのでtcpにしている

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

vi /etc/openvpn/server.conf

# 以下の設定で上書きする
port 1194
proto tcp
dev tun
ca /usr/share/easy-rsa/2.0/keys/ca.crt
cert /usr/share/easy-rsa/2.0/keys/server.crt
key /usr/share/easy-rsa/2.0/keys/server.key  # This file should be kept a secret
dh /usr/share/easy-rsa/2.0/keys/dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.1.0.0 255.255.0.0" #VPC内部のプライベートIPレンジが10.1.0.0/16の場合
keepalive 10 120
comp-lzo
max-clients 20
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
crl-verify /usr/share/easy-rsa/2.0/keys/crl.pem

openvpn自動起動の有効化

chkconfig openvpn on

openvpnサーバの起動

openvpn /etc/openvpn/server.conf

サーバ再起動

  • サーバを再起動してもopenvpnは正常に稼働するか確認するためにサーバを再起動
reboot

VPNクライアントの設定

VPNサーバを構築できたらVPNに繋げるようにクライアント側の設定をする

tunnelbrickのインストール

homebrewのcaskを利用してインストール

brew cask install tunnelblick
証明書と鍵を入手

(ユーザ名).key, (ユーザ名).crt, ca.crtの3ファイルが必要になるのでVPNサーバからscpなどで取得しておく

client.confファイルの作成
  • Macのhomeディレクトリの下に、.vpnというディレクトリを作成して、 (ユーザ名).key, (ユーザ名).crt, ca.crtの3ファイルを置く
  • .vpnディレクトリの配下などで、client.confファイルを作成する(ファイル名は好きな名前に変更しても大丈夫)
  • client.conf
client
dev tun
proto tcp
remote (vpnサーバのグローバルIPアドレス) 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca (ca.crtのファイルパス)
cert ((ユーザ名).crtのファイルパス)
key ((ユーザ名).keyのファイルパス)
remote-cert-tls server
comp-lzo
verb 3
tunnelbrickによる接続
  • tunnelbrickを起動する
  • client.confのファイルを画面右上のtunnelbrickのアイコンにドラッグアンドドロップする
  • 表示されてきたプロンプト画面でOnly Meをクリックする
  • Macのパスワード入力を求められるので入力する。これでVPNサーバとクライアントでコネクションを貼れるようになる。

VPNの運用

新しいクライアントの追加作業

新しくvpnを使うユーザが増えた場合は以下のように作業します。
生成された(新しいユーザ名) .crt, (新しいユーザ名) .key と ca.crtのファイルを新しいユーザに共有してあげてください。

cd /usr/share/easy-rsa/2.0
. ./vars
./build-key (新しいユーザ名) # use default value
* openvpnの再起動は不要

既存のクライアントの削除作業

退職したなどの理由で、特定のユーザがvpnを使えないようにするには以下のように作業します。

cd /usr/share/easy-rsa/2.0
. ./vars
./revoke-full (削除するユーザ 名) (keys/crl.pem ファイルが作成される)
* openvpnの再起動は不要