はじめに

エンジニアの久保です。
最近プライベートで海外に行きました。
街中の無料wifiを使うとき、情報検索程度ならよいのですが個人情報を入力するときはセキュリティ面で少し心配です。
また、海外に行った場合は、国内の回線からインターネットに接続したくなることもあります。
そんなときのために、個人的に利用できるVPN(Virtual Private Network)を用意しました。

今回は AWS CLI を使って、Amazon Lightsail 上にVPNサーバをサクッと構築してみます。

利用したもの

Amazon Lightsail

AWSが提供するVPS(Virtual Private Server)サービスです。
同社の Amazon EC2 に対して次の特徴があります。

  • ストレージやネットワーク(ロードバランサ、DNSなど)の設定がパッケージされている
  • 月額固定料金

LightsailはEC2に対して、必要な設定が最初からパッケージとして含まれているため、初心者にとっては使いやすいサービスです。
他方で、高度な設定はできないため柔軟な設定を行いたい場合はEC2を使った方がよいでしょう。
個人的な用途などでカジュアルにサーバ構築をしたい場合は、Lightsail で十分といえるでしょう。
https://aws.amazon.com/jp/lightsail

IPsec VPN Server Auto Setup Scripts

ワンライナーで IPsec VPN server を構築できる IPsec VPN Server Auto Setup Scripts を利用しました。
https://github.com/hwdsl2/setup-ipsec-vpn/

手順

インスタンスの作成とVPSサーバの構築

Lightsail インスタンスの作成とVPNサーバのセットアップを行います。

$ aws lightsail create-instances \
  --instance-names kubovpn \
  --blueprint-id ubuntu_18_04 \
  --bundle-id nano_2_0 \
  --region ap-northeast-1 \
  --availability-zone ap-northeast-1a \
  --user-data "wget https://git.io/vpnsetup -O vpnsetup.sh && VPN_IPSEC_PSK='kubosecret' VPN_USER='kubo' VPN_PASSWORD='kubopass' sh vpnsetup.sh"

ここで、

  • --instance-names は、インスタンス名です。
  • --user-data は、インスタンス作成時に実行するスクリプトを指定できます。ここにVPNサーバをセットアップするためのスクリプトを入力しました。
  • VPN_IPSEC_PSK, VPN_USER, VPN_PASSWORD はそれぞれVPNサーバの事前共有鍵(pre-shared key)、ユーザ名、パスワードです。

ご自身の環境に合わせて変更してください。

インスタンスイメージには、Ubuntu 18.04 を利用しました。ほかにどんなイメージを利用できるかは次のコマンドで確認できます。

$ aws lightsail get-blueprints --region ap-northeast-1

インスタンスプランは、最低限の Nano を選択しています。ほかにどのようなタイプを選択できるかは次のコマンドで確認できます。

$ aws lightsail get-bundles --region ap-northeast-1

では、インスタンスの作成が終わったら、インスタンスが起動しているか確認してみましょう。

$ aws lightsail get-instance-state \
  --instance-name kubovpn \
  --region ap-northeast-1

{
    "state": {
        "code": 16,
        "name": "running"
    }
}

これでインスタンスのセットアップとVPNサーバのセットアップが終わりました(簡単ですね)。
次に、外部のネットワークからVPNサーバに接続できるようにポートの開放を行います。

ポートの開放

現在解放されているポートを確認してみましょう。

$ aws lightsail get-instance \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --query 'instance.networking.ports'

[
    {
        "protocol": "tcp",
        "accessType": "public",
        "commonName": "",
        "accessFrom": "Anywhere (0.0.0.0/0)",
        "fromPort": 80,
        "accessDirection": "inbound",
        "toPort": 80
    },
    {
        "protocol": "tcp",
        "accessType": "public",
        "commonName": "",
        "accessFrom": "Anywhere (0.0.0.0/0)",
        "fromPort": 22,
        "accessDirection": "inbound",
        "toPort": 22
    }
]

既にTCP80(HTTP)とTCP22(SSH)が解放されています。

では、IPsec VPN Server で利用するポートのUDP4500とUDP500を解放します。
また今回はSSH接続やHTTP接続をする必要がないので、TCP22とTCP80を閉じることにしました。

# ポートの開放(UPD500)
$ aws lightsail open-instance-public-ports \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --port-info fromPort=500,toPort=500,protocol=UDP

# ポートの開放(UDP4500)
aws lightsail open-instance-public-ports \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --port-info fromPort=4500,toPort=4500,protocol=UDP

# ポートの閉鎖(TCP22)
aws lightsail close-instance-public-ports \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --port-info fromPort=22,toPort=22,protocol=TCP

# ポートの閉鎖(TCP80)
aws lightsail close-instance-public-ports \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --port-info fromPort=80,toPort=80,protocol=TCP

終わったら反映されているか確認しておきます。

$ aws lightsail get-instance \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --query 'instance.networking.ports'

[
    {
        "protocol": "udp",
        "accessType": "public",
        "commonName": "",
        "accessFrom": "Anywhere (0.0.0.0/0)",
        "fromPort": 4500,
        "accessDirection": "inbound",
        "toPort": 4500
    },
    {
        "protocol": "udp",
        "accessType": "public",
        "commonName": "",
        "accessFrom": "Anywhere (0.0.0.0/0)",
        "fromPort": 500,
        "accessDirection": "inbound",
        "toPort": 500
    }
]

以上でVPNサーバに接続できるようになりました(ここまでの所要時間は5分くらいでした)。

IPアドレスの確認

VPNサーバに接続するために、インスタンスのIPアドレスを確認しておきます。

$ aws lightsail get-instance \
  --instance-name kubovpn \
  --region ap-northeast-1 \
  --query 'instance.publicIpAddress'

"13.114.XXX.XXX"

スマートフォンへの設定

VPNサーバが完成しました。手元のスマートフォンからVPNに接続出来るように設定してみます。
iOS12の場合、「設定」→「一般」→「VPN」→「VPN構成を追加…」と進みます。
タイプは「IPsec」を選択し、その他の項目は先ほど設定した内容を入力します。

入力が完了したら、「設定」に戻り、VPNをONにしましょう。

以上で完了です。

インスタンスの削除

インスタンスが不要になったら削除しましょう。

$ aws lightsail delete-instance \
  --instance-name kubovpn \
  --region ap-northeast-1

おわりに

今回は、AWS CLI と LightSail を使って、VPNサーバを構築してみました。
いままでは、VPNルータやRaspberry Pi、他社のVPSサービスを使ってVPNサーバを構築したことがありました。
これらの方法では構築手順を忘れてしまったり設定が煩わしく思っていましたが、今回の方法なら手軽に構築できて良さそうです。

また、Lightsail はユーザフレンドリーなWebコンソールも用意されています。
今回はVPNサーバの構築でしたが、Webサービスの構築なども容易に行えそうです(こちらは今度試してみます)。

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにお越しください!
株式会社ウエディングパークwantedly

参考文献

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る