無料で公衆WiFiからVPNする仕組みを作ってみた
背景
先日参加したカンファレンスでは、参加者が1000人以上ということもあり、大勢がテザリングをするとWiFiが干渉してみんな通信できない、ということで、公衆WiFiが準備されていました。
これ自体は他のセミナーなんかでもよくあることなんですが、誰がつないでいるかもわからないWiFiにつないで、盗聴されたり、攻撃されたりするのも嫌で使えませんでした。
短時間ならそれでもなんとかなるのですが、2、3日そこにいることを考えると、周りに迷惑をかけてテザリングするのもどうかだし、ちょっとそこまで長時間使えないとストレスなので、VPNを準備することにしました。
やり方の検討
結果を先に書くと、Google Cloud Platformの無料利用枠であるf1.microサーバにUbuntu16.04をインストールして、OpenVPNのパッケージをインストールすることで準備しました。
参考にさせていただいたサイト
インストールの仕方
候補としては、以下三つを検討したのですが、1.は無料で維持する方法がない(評価期間は可能)ので対象外としました。
次に2.ですが、多分時間をかければなんとかなると思うのですが、Mac用のクライアント設定(ovpnファイルの作成)がうまくいかずに悩んでいる間に、3.の方法でうまく行ったので、その内容を残します。
Azure以外に、AWSでもOpenVPN Access Serverのテンプレートは用意されているようです。
- AzureのOpenVPN Access Serverをデプロイする
- GCPでOpenVPN Community版をインストールする
- GCPでOpenVPN Access Serverをインストールする
ちなみに、OpenVPN Access ServerとCommunity版の違いです。
- 同時接続は2ユーザまで
- それ以上の場合は、追加ライセンスの購入が必要
- Community版は多分制限なし
- 認証局や証明書の設定がインストール時に自動的にできる
- Community版ではeasy-rsaなどを使って、証明書を用意する必要がある
- ユーザ管理などをWeb UIでできる
- Community版では、コマンドラインと設定ファイルで実施
- クライアント接続用設定ファイルを生成してくれる
これらを考えると、個人で利用するぶんにはAS版でいいかと思いました。
クラウドの比較
Azureのメリット、デメリット
- メリット
- デメリット
- 継続的に無料では使えない
GCPのメリット
- メリット
- 最小構成サーバ(f1.micro/CPU 1core/Mem 600MB/Disk 30GB)であれば無料枠で使い続けることができる。
- 固定IPがインスタンスに1つは無料で使える(ただし割り当てていないと課金される)
- デメリット
GCPの無料利用枠に関しては、公式サイトをご参照ください。
実装手順
GCP(Google Cloud Platform)の準備
1. VMの作成
Google Compute Engineで仮想サーバを作成します。
2. インスタンス名、OS、ディスクサイズの選択
- OSはUbuntu16.04を選ぶ
- Diskは30GBまで無料なので、30GB割り当てる
3. ネットワークの設定
- 固定IPを割り当てる
- IP転送をオンにする
- アクセス制御でhttpsのアクセスを許可する
4. ssh公開鍵の登録
- 手元の端末で作ってある公開鍵を登録する
Ubuntu16.04 OS設定
1. sshで接続
$ ssh user@publicip
2. Ubuntuパッケージの最新化
$ sudo apt-get update $ sudo apt-get upgrade
3. IP Forwardingの有効化(OS上のIP転送)
$ sudo vi /etc/sysctl.conf $ sudo sysctl -p net.ipv4.ip_forward = 1
OpenVPN ASのインストール
1. パッケージのダウンロードと転送
パッケージは以下のサイトから、Ubuntu16.04用のパッケージ(debファイル)をダウンロードする。
ダウンロードしたファイルは、sftpでサーバにアップロードする。
$ sftp user@publicip sftp> cd /tmp sftp> put openvpn-as-2.1.12-Ubuntu16.amd_64.deb Uploading openvpn-as-2.1.12-Ubuntu16.amd_64.deb to /tmp/openvpn-as-2.1.12-Ubuntu16.amd_64.deb openvpn-as-2.1.12-Ubuntu16.amd_64.deb 100% 31MB 4.0MB/s 00:07 sftp> quit
2. OpenVPN ASパッケージのインストール
移したパッケージをdpkgコマンドでインストールするだけ。楽で助かる。
$ cd $ mv /tmp/openvpn-as-2.1.12-Ubuntu16.amd_64.deb . $ sudo dpkg -i openvpn-as-2.1.12-Ubuntu16.amd_64.deb Selecting previously unselected package openvpn-as. (Reading database ... 67071 files and directories currently installed.) Preparing to unpack openvpn-as-2.1.12-Ubuntu16.amd_64.deb ... Unpacking openvpn-as (2.1.12-Ubuntu16) ... Setting up openvpn-as (2.1.12-Ubuntu16) ... The Access Server has been successfully installed in /usr/local/openvpn_as Configuration log file has been written to /usr/local/openvpn_as/init.log Please enter "passwd openvpn" to set the initial administrative password, then login as "openvpn" to continue configuration here: https://10.XXX.XXX.2:943/admin To reconfigure manually, use the /usr/local/openvpn_as/bin/ovpn-init tool. +++++++++++++++++++++++++++++++++++++++++++++++ Access Server Web UIs are available here: Admin UI: https://10.XXX.XXX.2:943/admin Client UI: https://10.XXX.XXX.2:943/ +++++++++++++++++++++++++++++++++++++++++++++++
3. openvpnユーザのパスワード変更
openvpnユーザのパスワードを変更するようにと言われるので、変更する。
これは、OS上のユーザで、デフォルトではOpenVPNへのログイン認証をPAM認証で行う。余裕があれば、2要素認証やPKI認証もやってみようと思う。(PKIは前にWindowsクライアントとの間で、Community版を使ってやったことがあるが特に問題なかった)
$ passwd openvpn Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Web UIでの設定
サーバーインストールの最後に、943/tcpの管理画面にアクセスせよ、と出るのですが、ローカルIPアドレスで指示が出ているので、アクセスできない場合はグローバルIPでアクセスする。
このために、GCP側のFirewallで943/tcpを許可する必要があるが、スクショを撮り忘れたので、機会があればまたとって更新します。
警告画面が出るが、自分の用意しているサイトなので無視して接続。
1. サーバー名
サーバー名の設定は、接続プロファイルに使われるので、インターネットからアクセスできる名前か外部IPアドレスを指定する。
変更後は、Updateするかどうか確認される。
2. ネットワーク設定
クライアントが全てのトラフィックをVPNに流す場合、それまで引いていたDNSが引けなくなるので、Google DNSを指定する。
3. ユーザ設定
openvpnユーザは、管理画面へのアクセス権しか持っていないので、VPNの権限を割り当てる。
本来は、管理者であるopenvpnユーザと別にVPN接続ユーザを作って分けて管理するのが望ましいと思う。今回は手間の関係でやっていない。
動作確認(Mac OS 10.12.6)
1. クライアント接続アプリのダウンロード
https://公開IP
に接続すると、以下の画面が表示される。
警告は無視する。
ONNECTのまま接続すると、クライアント接続アプリのダウンロードが始まる
2. クライアント接続アプリのインストール
ダウンロードしたファイルをダブルクリックでマウントし、インストーラを起動。 署名されていないので、ダブルクリックしてもひらけない。
システム環境設定のセキュリティから起動する
基本的に次へ次へで終わる。
3. 接続プロファイルのダウンロード
右上にアイコンが出たら、[Import] -> [from Server]を選ぶ。
接続先として、公開IPアドレスを指定すると、認証の後で設定ファイルがダウンロードされる
4. 接続
再度アイコンをクリックするとインポートしたプロファイルのおかげで、接続先の右矢印を辿ると、Connect as Userが選べる。
すると接続される。
5. IPアドレスが変わっていることの確認
本当にVPN経由となっているかどうか確認するため、確認くんでみてみる。
接続前は契約しているプロバイダだが、Googleに変わったので経由できているようだ。
6. ついでにiPhone7でもやってみた
AppStoreでOpenVPNクライアントをダウンロードして、インストールした。
起動すると、設定ファイルのインポート画面が出てくるので、グローバルIPを指定してダウンロードすると自動的にインポートされる。。
あとは、接続してみればあっさりつながった。
まとめ
Google Cloud Platformを使って、固定IPで無料のVPNサーバを立てることができた。すごい。固定IPを使うのにこれまでいくらかかっていただろう。
しかも、オープンソースのVPNサーバーを動かすリソースまでタダで使える。クラウドって素晴らしい。
逆に言うと、これぐらいの機能ではお金がもらえないってことなので、IT業界に勤める身としては複雑な心境です。