AWS上にIKEv2対応のVPNサーバを立てた
必要にかられて、AWS上に IKEv2 対応の VPN サーバーを構築しました。
目的は、
- Android12 から固定IPアドレスによるアクセス
- IPv6 環境から固定IPアドレスによるアクセス
です。
備忘録として作業したことを残しておきます。
はじめに
経緯
Android12、使える VPN のタイプめっちゃ減ってる。L2TP 使えなくなったんか。困る。
— りゅーた@田舎でエンジニアと子育て (@ryuta461) November 4, 2021
検証端末として Pixel 6 (Android12) の端末を買ったのですが、Android12 で使える VPN の種別が制限されていることに気づきました。
アプリ開発時の検証用に固定IPを通過できるようにサーバ側に設定してもらっていたりするのですが、
Android12 だと PPTP/L2TP にしか対応してない VPN サービスが使えなくなっており、VPN で IP固定することができなくなってしまいました。
Android12 で VPN 設定しようとすると、IKEv2 しか選べない感じになっていたので、Android12 でも使える VPN サーバーを調達しようと思い、せっかくなので自分で立てることにしました。
IKEv2 対応 VPN の使いみち
前述の通り、Android12 で固定IPするのがメインの目的でした。
しかし、実はもう一つすでに困ったことがあり、それが 家の IPv6 環境(楽天ひかりの IPv6 クロスパス)の環境からだと PPTP/L2TP の VPNサービスも使えなくなっていた ことでした。
結果的に、今回 IKEv2 対応の VPNサーバを用意したことで 家の IPv6 環境からでも IPv4 の固定IPアドレスでアクセスすることができるようにはなりました。めでたしなのですが、なぜ IKEv2 で解決できたのか、よくわかってません。(誰か詳しい人教えてほしい)
とりあえず、今は問題が2つ同時に解決したのでこのまま運用していく予定です。
IKEv2 対応の VPN サーバを AWS 上に立てる手順
こんな感じになりました。
- AWS Lightsail で Linux サーバを作る
- サーバのネットワーク設定をする
- サーバに必要なソフトを入れる
- docker で VPN サーバを立ち上げる
- Android、iOS、Windows、Mac で VPN の設定をする
1. AWS Lightsail で Linux サーバを作る
まずは AWS 上でサーバを立てます。EC2 でもよかったのですが、今回は Lightsail を使いました。Lightsail は EC2 と違って月額固定の料金体系ですが、どうせ常時立ち上げてそうなので Lightsail 使うようにしました。
EC2 と同程度のスペックなら相対的に安そうですし。
実際今は月 $3.5 のインスタンスで問題なく使えてます。
AWSのコンソール にアクセスして、左上の検索ボックスから Lightsail を検索します。
Lightsail の管理画面に遷移したら、「Create Instance」でインスタンス作成の画面に入ります。
「Instance Location」で リージョン を変更できるので、お好きな場所を選択します。試していないですが、海外からのアクセスの検証をしたい時とかに使えるかもしれません。
リージョン以外の設定として、「Pick your instance image」で、「Linux/Unix」「OS Only」「Unbuntu 20.04 LTS」を選びます。
OS に関しては Ubuntu 以外の Linux OSでも問題ないかと思います。使い慣れているものがあればそれで。
続いて 「Choose your instance plan」でサーバのスペックを選択します。$3.5 のプランで問題ないかと思います。
最後に、自分でわかる名前つけて画面下部の「Create Instance」をクリックしてサーバの立ち上げは完了です。
Lightsail の管理画面上表示されるのが確認できるはずです(最初グレーアウトされてますが、少し待って立ち上げ完了すると選択できるようになります。)
2. サーバのネットワーク設定をする
続いて、サーバのネットワーク設定を行います。
Lightsail の管理画面で先程作成したインスタンスを選択し、「Networking」のタブを選択します。
IPアドレスが表示されている箇所の下に、「Create static IP」というボタンがあるので、それを選択します。
遷移後の画面で「Create」を選択すると、固定のIPアドレスが割り当てられます。欲しかった固定IPアドレスです。
遷移後の画面で IP アドレスが表示されますので、どこかにメモしておきましょう。
続いて、ポート設定をします。先程の Networking のタブの画面に戻り、IPv4 Firewall の「Add rule」でポートの設定を行います。
ここでは、
- UDP 500
- UDP 4500
でアクセスできるように追加します。
設定後は下の画像のような状況になります。
以上でネットワークの設定は完了です。
3. サーバに必要なソフトを入れる
サーバに SSH でログインして必要なソフトをインストールしていきます。
Lightsail の管理画面から直接 SSH のコンソールを使うこともできますが、後で scp 経由でファイルコピーするので今回は ssh キーを取得してターミナルから ssh でアクセスする方法でいきます。
デフォルトの設定で Lightsail でインスタンスを立ち上げると、AWS アカウントに紐付いている SSH のキーペアが使われています。まずはこれをダウンロードしてきます。
Lightsail コンソールの右上の Account を選択し、
SSH Keys のタブを選択します。
ここにリージョンごと?に SSH キーのダウンロードリンクがあるので、「Download」をクリックして自分の PC に SSH キーをダウンロードしてきます。
ダウンロードしたファイルをそのまま ssh コマンドで使うと、パーミッションが広すぎてエラーがでるかもしれませんので、自分以外読み書きできないように chmod
でパーミッション変えておきます。
ターミナルから下記コマンドを実行します。
1 2 |
$ chmod 600 ダウンロードしたSSHキーのパス |
その後、ssh でアクセスします。下記のような感じで
1 2 |
$ ssh -i ダウンロードしたSSHキーのパス ubuntu@メモしたIPアドレス |
接続できたら、必要なソフトウェアのインストールに入っていきます。
といっても、ほとんど docker のインストールだけです。
Ubuntu20.04 へのDockerインストール手順 を書いてくれているサイトがあるので、それに従ってコマンドを実行していきます。
1 2 3 4 5 6 7 |
$ sudo apt update $ sudo apt install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" $ apt-cache policy docker-ce $ sudo apt install docker-ce |
インストールが完了したら、docker が動いていることを確認しておきます。
1 2 |
$ sudo systemctl status docker |
うまく動いていれば active(running)
が表示されているはずです。この画面は q キーで閉じます。
ここまでで必要なソフトのインストールは完了です。
4. docker で VPN サーバを立ち上げる
いよいよ VPN サーバを立ち上げます。引き続き SSH で接続した状態でコマンドを実行していきます。
VPN サーバを docker で立ち上げるためのイメージを公開してくれていますので、それを使います。
ほぼ上記サイトにあるとおりですが、下記コマンドで立ち上がります。
1 2 3 4 5 6 7 8 9 |
$ sudo docker run \ --name ipsec-vpn-server \ --restart=always \ -v ikev2-vpn-data:/etc/ipsec.d \ -p 500:500/udp \ -p 4500:4500/udp \ -d --privileged \ hwdsl2/ipsec-vpn-server |
VPN サーバが立ち上がったら、ログイン情報を取得します。
ログインに関しての案内がログに出ているのでそれを表示させます。
下記コマンドを実行します。
1 2 |
$ sudo docker logs ipsec-vpn-server |
表示されたログの中に、下記のような表示があるかと思います。
1 2 3 4 5 6 7 8 9 |
Client configuration is available inside the Docker container at: /etc/ipsec.d/vpnclient.p12 (for Windows & Linux) /etc/ipsec.d/vpnclient.sswan (for Android) /etc/ipsec.d/vpnclient.mobileconfig (for iOS & macOS) *IMPORTANT* Password for client config files: (パスワード) |
docker コンテナ内の上記場所に、vpn クライアント向けの設定が保存されているという旨の内容です。
ここから必要なファイルをコピーしておきます。
また、上記(パスワード)と書いてある場所に、この設定ファイルを使うためのパスワードが表示されます。どこかに控えておきましょう。
docker コンテナからのコピーは、たとえば Androidだと下記コマンドでコピーできます。一旦ホームディレクトリ直下にコピーしています。
1 2 |
$ sudo docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.sswan ~/ |
この後 scp 経由でファイルを取得するので、所有者を ubuntu に変えておきます。
1 2 |
$ sudo chown ubuntu vpnclient.sswan |
サーバ側での作業は一旦以上です。あとはクライアントの方の設定に移ります。
5. Android、iOS、Windows、Mac で VPN の設定をする
ローカルPCの方のターミナルに移り、必要なファイルを AWS のサーバから持ってきます。scp コマンドを使います。
例えば、Android の設定ファイルの場合
1 2 |
$ scp -i ダウンロードしたSSHキーのパス ubuntu@IPアドレス:~/vpnclient.sswan ./ |
あとは、端末ごとに設定を行っていくことになります。いずれの場合でもダウンロードした設定ファイルを読み込む際に 4. で控えたパスワードを入力することになります。
Android の場合
strongSwan を使います。
アプリをインストールしたら、「Import VPN profile」で vpnclient.sswan を選択するか、ファイルマネージャで vpnclient.sswan を選択したら strongSwan が立ち上がるのでそこからインポートしていきます。
インポート時、パスワードが聞かれるので、4.で控えたパスワードを入力します。
iOS の場合
AirDrop などで vpnclient.mobileconfig を iOS端末に送ります。
設定 -> 「プロファイルをダウンロード済み」をタップして、インストールをタップします。
パスコードと 4.で控えたパスワードを順に入力していけば設定完了です。
Mac の場合
ダウンロードした vpnclient.mobileconfig をダブルクリックした後、システム環境設定 -> プロファイルと進むと、ダウンロード済みのところに設定が追加されています。
右のインストールからインストールします。パスワードを聞かれるので、4.で控えたパスワードを入力します。
Windows の場合
少し手順が複雑でした。
- 証明書のインストール
他の環境と同様に vpnclient.p12 ファイルを Windows PC 上でダブルクリックし、証明書のインストールを行います。パスワードを聞かれるので、4.で控えたパスワードを入力します。 - VPN設定の追加
設定 -> 「ネットワークとインターネット」-> 「VPN」-> 「VPN接続の追加」と進み、VPN 接続を追加します。下記のように入力します。- VPN プロバイダー: Windows(ビルトイン)
- 接続名: 好き名前
- サーバ名またはアドレス: VPNサーバのIPアドレス
- VPNの種類: IKEv2
- サインイン情報の種類: 証明書
- ユーザー名、パスワード: 空
- アダプターのオプション変更
VPN の設定画面にある「アダプターオプションの変更」をクリック
先程追加した VPN の設定があるので、右クリック -> 「プロパティ」
「セキュリティ」タブ内の認証で、「コンピュータの証明書を使う」を選択
- 必要なら暗号化の種類を変更
上記設定で接続した際に、「ポリシーの一致エラー」が表示されるようであれば、レジストリにて設定変更を行います。
こちらのブログ の手順に従って、レジストリを設定します。
使う暗号化の種類を変更するための設定のようです。
ここまで行った上で、VPNの接続を行って、問題なく接続することができるようになりました。
さいごに
ようやく固定IPアドレスで通信する環境を整えることができて、検証用サーバへの接続ができるようになりました。
おかげで Android12 での検証の問題と、IPv6 環境での検証の問題がクリアできそうで良かったです。まだ運用初めて間もないので、今後情報の追加や修正が発生したら修正していくつもりです。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする