無料で公衆WiFiからVPNする仕組みを作ってみた

背景

先日参加したカンファレンスでは、参加者が1000人以上ということもあり、大勢がテザリングをするとWiFiが干渉してみんな通信できない、ということで、公衆WiFiが準備されていました。

これ自体は他のセミナーなんかでもよくあることなんですが、誰がつないでいるかもわからないWiFiにつないで、盗聴されたり、攻撃されたりするのも嫌で使えませんでした。

短時間ならそれでもなんとかなるのですが、2、3日そこにいることを考えると、周りに迷惑をかけてテザリングするのもどうかだし、ちょっとそこまで長時間使えないとストレスなので、VPNを準備することにしました。

やり方の検討

結果を先に書くと、Google Cloud Platformの無料利用枠であるf1.microサーバにUbuntu16.04をインストールして、OpenVPNのパッケージをインストールすることで準備しました。

参考にさせていただいたサイト

blog.interstellar.co.jp

インストールの仕方

候補としては、以下三つを検討したのですが、1.は無料で維持する方法がない(評価期間は可能)ので対象外としました。

次に2.ですが、多分時間をかければなんとかなると思うのですが、Mac用のクライアント設定(ovpnファイルの作成)がうまくいかずに悩んでいる間に、3.の方法でうまく行ったので、その内容を残します。

Azure以外に、AWSでもOpenVPN Access Serverのテンプレートは用意されているようです。

  1. AzureのOpenVPN Access Serverをデプロイする
  2. GCPOpenVPN Community版をインストールする
  3. GCPOpenVPN Access Serverをインストールする

ちなみに、OpenVPN Access ServerとCommunity版の違いです。

  • 同時接続は2ユーザまで
    • それ以上の場合は、追加ライセンスの購入が必要
    • Community版は多分制限なし
  • 認証局や証明書の設定がインストール時に自動的にできる
    • Community版ではeasy-rsaなどを使って、証明書を用意する必要がある
  • ユーザ管理などをWeb UIでできる
  • クライアント接続用設定ファイルを生成してくれる
    • Community版では、別に用意する必要あり
    • Windows版はクライアントソフトでGUIで設定できたはず
    • Mac版はOVPNファイルを読み込ませる必要あり ← ここでつまづいた
    • Android/iOSは試していないが、多分OVPNファイル

これらを考えると、個人で利用するぶんにはAS版でいいかと思いました。

openvpn.net

クラウドの比較

Azureのメリット、デメリット

  • メリット
    • OpenVPN Access Serverのテンプレートがあるのでデプロイするだけでいい
    • 環境面での設定(FirewallやIP転送など)も完了済み
    • 固定IPは有料だが、Dynamic DNSで名前解決できる
  • デメリット
    • 継続的に無料では使えない

GCPのメリット

  • メリット
    • 最小構成サーバ(f1.micro/CPU 1core/Mem 600MB/Disk 30GB)であれば無料枠で使い続けることができる。
    • 固定IPがインスタンスに1つは無料で使える(ただし割り当てていないと課金される)
  • デメリット
    • OpenVPN Access Serverはテンプレートにないので、OSをインストールしてからパッケージインストールする作業が必要
    • 環境面の設定もしないといけない(FirewallやIP転送)
    • 特にIP転送はGCPの場合、インストール時に指定しておかないと、後から変更できない

GCPの無料利用枠に関しては、公式サイトをご参照ください。

cloud.google.com

実装手順

GCP(Google Cloud Platform)の準備

1. VMの作成

Google Compute Engineで仮想サーバを作成します。

f:id:sorapoo:20171112173339p:plain

2. インスタンス名、OS、ディスクサイズの選択

  • OSはUbuntu16.04を選ぶ
  • Diskは30GBまで無料なので、30GB割り当てる

f:id:sorapoo:20171112173525p:plain

3. ネットワークの設定

  • 固定IPを割り当てる
  • IP転送をオンにする
  • アクセス制御でhttpsのアクセスを許可する

f:id:sorapoo:20171112173618p:plain

4. ssh公開鍵の登録

  • 手元の端末で作ってある公開鍵を登録する

f:id:sorapoo:20171112173648p:plain

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ファイル)をダウンロードする。

openvpn.net

ダウンロードしたファイルは、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を許可する必要があるが、スクショを撮り忘れたので、機会があればまたとって更新します。

f:id:sorapoo:20171112173826p:plain

警告画面が出るが、自分の用意しているサイトなので無視して接続。

f:id:sorapoo:20171112173836p:plain

f:id:sorapoo:20171112173900p:plain

1. サーバー名

サーバー名の設定は、接続プロファイルに使われるので、インターネットからアクセスできる名前か外部IPアドレスを指定する。

f:id:sorapoo:20171112173915p:plain

変更後は、Updateするかどうか確認される。

f:id:sorapoo:20171112173939p:plain

2. ネットワーク設定

クライアントが全てのトラフィックVPNに流す場合、それまで引いていたDNSが引けなくなるので、Google DNSを指定する。

f:id:sorapoo:20171112174224p:plain

3. ユーザ設定

openvpnユーザは、管理画面へのアクセス権しか持っていないので、VPNの権限を割り当てる。

本来は、管理者であるopenvpnユーザと別にVPN接続ユーザを作って分けて管理するのが望ましいと思う。今回は手間の関係でやっていない。

f:id:sorapoo:20171112173954p:plain

動作確認(Mac OS 10.12.6)

1. クライアント接続アプリのダウンロード

https://公開IPに接続すると、以下の画面が表示される。

f:id:sorapoo:20171112174030p:plain

警告は無視する。

f:id:sorapoo:20171112174038p:plain

ONNECTのまま接続すると、クライアント接続アプリのダウンロードが始まる

f:id:sorapoo:20171112174048p:plain

2. クライアント接続アプリのインストール

ダウンロードしたファイルをダブルクリックでマウントし、インストーラを起動。 署名されていないので、ダブルクリックしてもひらけない。

f:id:sorapoo:20171112174104p:plain

システム環境設定のセキュリティから起動する

f:id:sorapoo:20171112174115p:plain

f:id:sorapoo:20171112174132p:plain

基本的に次へ次へで終わる。

f:id:sorapoo:20171112174153p:plain

3. 接続プロファイルのダウンロード

右上にアイコンが出たら、[Import] -> [from Server]を選ぶ。

接続先として、公開IPアドレスを指定すると、認証の後で設定ファイルがダウンロードされる

4. 接続

再度アイコンをクリックするとインポートしたプロファイルのおかげで、接続先の右矢印を辿ると、Connect as Userが選べる。

すると接続される。

5. IPアドレスが変わっていることの確認

本当にVPN経由となっているかどうか確認するため、確認くんでみてみる。

f:id:sorapoo:20171112174258p:plain

接続前は契約しているプロバイダだが、Googleに変わったので経由できているようだ。

6. ついでにiPhone7でもやってみた

AppStoreでOpenVPNクライアントをダウンロードして、インストールした。

起動すると、設定ファイルのインポート画面が出てくるので、グローバルIPを指定してダウンロードすると自動的にインポートされる。。

あとは、接続してみればあっさりつながった。

まとめ

Google Cloud Platformを使って、固定IPで無料のVPNサーバを立てることができた。すごい。固定IPを使うのにこれまでいくらかかっていただろう。

しかも、オープンソースVPNサーバーを動かすリソースまでタダで使える。クラウドって素晴らしい。

逆に言うと、これぐらいの機能ではお金がもらえないってことなので、IT業界に勤める身としては複雑な心境です。