追記
Amazon Linux 2 向けに新しく記事を書き直しました!
toripiyo.hatenablog.com
=============================================================
家のネットワークとAWS環境をVPNで繋ぎたくて、openvpnでVPN環境を構築してみました。いろんなサイトを参考にしながら構築しているので、その手順をまとめたいと思います。中小企業であれば、専用のVPN機器を購入しなくてもこれで十分ではないかと思います。VPNにかかるコストはt2.nanoの稼働コストのみなので、比較的安い費用でvpnを構築できます。
上図の構成の通り、VPNサーバをAWS環境上に構築します。この構成を取ることで、
- ユーザはVPNサーバを通してSSHやHTTP通信を行えるようになり、サービスを不必要に外部に公開しなくても良くなります。例えば、データベースサーバをMacなどから直接いじりたいときも、データベースサーバをインターネット環境に公開する必要はありません。
- ユーザ個別に証明書と鍵を発行することでプロジェクトから抜けたユーザがAWS環境にアクセス出来ないように個別にアクセス制御が出来ます。
このVPNサーバは、1個のVPCに1個構築するイメージで構築しています。ですので、複数のVPCでVPNサーバを利用したい場合は、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
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の再起動は不要