LightsailにOpenVPNサーバーを立てる


環境

参考


国内のVPNサービスを契約していたのですが
同時に1デバイスしか接続できないし、回線がめっちゃ遅かったので
自前でVPNサーバーを立てることにしました。

AWSのLightsail上にOpenVPNでサーバーを立てて
Linux Mint, Android, iPhoneで接続できるようにします。

インスタンス設定

新規インスタンス作成

Lightsailのページにて『インスタンスの作成』をクリックします。
https://lightsail.aws.amazon.com/ls/webapp/home/instances

インスタンスイメージとして以下を選択します。

インスタンスプランはVPNの利用予定に合わせて選びます。
個人でちょっと使う程度であれば最安のプランでよいと思います。

インスタンス名を適当につけて「インスタンスを作成」をクリックします。

静的IPの設定

インスタンス一覧画面に戻るので
先程作成したインスタンスの「︙」から『管理』をクリックします。

ネットワーキングタブを開き、「静的IPの作成」をクリックします。

静的IPの設定画面になるので、適用するインスタンス(今作ったインスタンス)と
静的IPの名前を決めて「作成」をクリックします。

ポート開放

対象インスタンスの『ネットワーキング』タブを開きます。
ファイアウォールの「+追加」をクリックし、TCPの1194ポートを開きます。

Lightsailへの接続

インスタンス一覧にて再度「︙」から『接続』をクリックします。

別ウィンドウでターミナル調のブラウザが立ち上がるので、以降の作業を実施します。
手元のターミナルからsshで繋いでも良いです。

Lightsailの時刻を日本時間に合わせる

念の為タイムゾーンを日本にしておきます。

sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
sudo service rsyslog restart
sudo service crond restart

OpenVPN設定

OpenVPNインストール

以下コマンドを実行します。

sudo yum install openvpn

認証局の作成

以下コマンドを実行します。

wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
tar -xf EasyRSA-3.0.4.tgz
sudo mv EasyRSA-3.0.4 /usr/local/EasyRSA
cd /usr/local/EasyRSA/
./easyrsa init-pki
./easyrsa build-ca

実行後に以下の質問をされるので入力してください。

入力項目 入力内容
Enter PEM pass phase: 適当なパスフレーズ
Verifying - Enter PEM pass phrase: 上と同じもの
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: 適当なドメイン(例:xxxxx.com)

DHパラメータを生成

./easyrsa gen-dh

サーバー用の証明書&秘密鍵を生成

./easyrsa build-server-full server nopass

実行後にパスフレーズを聞かれるので、さきほど設定したパスフレーズを入力してください。

クライアント用の証明書&秘密鍵を生成

以下コマンドを接続する利用者分実施します。
同じ利用者でも、PCとスマホの両方から同時接続するのであれば別クライアントとして証明書&秘密鍵を生成する必要があります。

./easyrsa build-client-full {クライアント名} nopass
#例) ./easyrsa build-client-full client1 nopass

実行後にパスフレーズを聞かれるので、さきほど設定したパスフレーズを入力してください。 クライアント名は接続者が識別できるような任意の名前にしてください。

VPNサーバーのIPアドレス&ネットマスクの確認

以下のコマンドを実行します。

ip a

この出力結果のeth0のinetを確認しておく。
(以下のxxx.xxx.xxx.xxx/xxの部分)

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:7a:be:17:01:aa brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/xx brd 172.26.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::47a:beff:fe17:1aa/64 scope link 
       valid_lft forever preferred_lft forever

設定ファイル修正

生成したサーバー用ファイルを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

※dhだけファイル名を変更しています

次に設定ファイルを編集します。

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

編集後の設定は以下のようになります。
push "route xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy" の部分は
さきほど確認したVPNサーバーのIPアドレス&サブネットマスクにします。

$ grep -v "^$" /etc/openvpn/server.conf | grep -v "^#" | grep -v "^;"
port 1194
proto tcp
dev tun
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
push "redirect-gateway def1 bypass-dhcp"
push "route xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 0

元のサンプルファイルとの差分は以下のようになっています

$ diff /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn/server.conf
35,36c35,36
< ;proto tcp
< proto udp
---
> proto tcp
> ;proto udp
192c192,193
< ;push "redirect-gateway def1 bypass-dhcp"
---
> push "redirect-gateway def1 bypass-dhcp"
> push "route xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy"
200,201c201,202
< ;push "dhcp-option DNS 208.67.222.222"
< ;push "dhcp-option DNS 208.67.220.220"
---
> push "dhcp-option DNS 208.67.222.222"
> push "dhcp-option DNS 208.67.220.220"
287c288
< status openvpn-status.log
---
> status /var/log/openvpn/openvpn-status.log
296,297c297,298
< ;log         openvpn.log
< ;log-append  openvpn.log
---
> log         /var/log/openvpn/openvpn.log
> log-append  /var/log/openvpn/openvpn.log
315c316
< explicit-exit-notify 1
---
> explicit-exit-notify 0

設定したログ出力ディレクトリも作成しておきます。

sudo mkdir /var/log/openvpn
sudo chmod 0600 /var/log/openvpn

ta.keyの作成

sudo openvpn --genkey --secret /etc/openvpn/ta.key

パケット転送を有効にする

sudo sed -i -e "s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g" /etc/sysctl.conf
sudo sysctl -p

ルーティングを変更する

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo service iptables save

OpenVPNを起動

sudo chkconfig openvpn on
sudo service openvpn start

クライアントの設定

VPNサーバーで生成したファイルのうち、クライアントの設定用に必要なファイルは以下4点です。

また、AndroidやiPhoneで設定するには拡張子ovpnのファイルが必要なので作成しておく。
(hogehoge.ovpn)

ovpnファイルに記載する内容は以下の通りです。
証明書や鍵の情報はovpnファイルに埋め込んでしまった方が便利なので、埋め込んでしまいます。
※xxx.xxx.xxx.xxxはVPNサーバーのグローバルIPアドレスに置き換えてください。

client
dev tun
proto tcp
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
key-direction 1
cipher AES-256-CBC
verb 3
<ca>
〜上記ca.crtの中身をそのまま貼り付ける〜
</ca>
<key>
〜上記{クライアント名}.keyの中身をそのまま貼り付ける〜
</key>
<cert>
〜上記{クライアント名}.crtの中身をそのまま貼り付ける〜
</cert>
<tls-auth>
〜上記ta.keyの中身をそのまま貼り付ける〜
</tls-auth>

Linux Mint

標準でネットワーク設定画面よりOpenVPNの設定ができるので
そこで上記ファイルの設定をすれば接続できるようになります。

設定画面のキャプチャを貼っておきます。



Android

ovpnファイルをAndroid端末にメール添付などで送付しておきます。

GooglePlayにてOpenVPNアプリをインストールします。
https://play.google.com/store/apps/details?id=net.openvpn.openvpn

インストールしたOVPNアプリを開き、『OVPN Profile』を開きます。
するとovpnファイルの選択画面になるので、ovpnファイルを選択して「IMPORT」をタップします。

次の画面で「ADD」をタップします。

これで設定は完了です。
作成された接続のスイッチをONにすればVPN接続が完了します。

iPhone

ovpnファイルをiPhone端末にメール添付などで送付しておきます。

AppStoreにてOpenVPNアプリをインストールします。
https://apps.apple.com/jp/app/openvpn-connect/id590379981

メーラーにて送付してあるovpnファイルをダウンロードして、そのまま開きます。
すると開き方の選択肢にインストールしたOpenVPNアプリがあるので、それを選択します。

OpenVPNアプリが開き、さきほどダウンロードしたovpnファイルが表示されるので「ADD」をタップします。

次の画面でも「ADD」をタップします。
警告ポップアップが出ますが「Allow」をタップして進んでください。

これで設定は完了です。
作成された接続のスイッチをONにすればVPN接続が完了します。