T time

プログラミングや電子工作、各種ガジェットに関するブログです。

ngrok

f:id:tatur0u:20150615210427p:plain

ngrok - secure introspectable tunnels to localhost

ローカルWebサーバを簡単にインターネットに公開するためのアプリケーションを紹介します。

まえがき

私は、Pebble というスマートウォッチ用のアプリを作っています。

PebbleはiPhoneAndroidと接続し、Pebble上のアプリの設定をスマートフォン上のアプリから変更するのですが(ややこしい)、設定画面をHTMLで書いて外部サーバに置かなければならないという制約があります。
さらに、開発中もスマートフォンアプリ経由で設定画面を見る必要があるので、インターネットに公開されたサーバ上で開発するのが望ましいです。

Webサーバは Caddy が解決してくれましたが、私はインターネットに公開するサーバを持っていないので途方に暮れていました。

taturou.hatenablog.com

ngrokとは

ngrokはローカルWebサーバを簡単にインターネットに公開するためのアプリケーションです。

以下の特徴があります。

  • 設定無しでNATを超える
  • サブドメイン指定可能
  • HTTPをトンネル
  • TCPをトンネル
  • HTTPSに対応
  • アクセス制限に対応

設定無しでNATを超える

ローカルサーバは通常ファイアウォールの内側に居るため、ローカルサーバからインターネットにアクセスできても、インターネットからローカルサーバへはアクセスできません。
これを解決する技術がいわゆる「NAT超え」という技術です。 ngrokはローカルサーバが置かれた環境により適切な手段でNATを超えてくれます。

使う側は何も考えず

$ ngrok http 80

するだけです。
これで、インターネットからローカルの80ポートで待機しているWebサーバにアクセスできます。

サブドメイン指定可能

ngrokを起動すると、インターネットからローカルサーバへアクセスするためのURLが与えら得ます。しかし、それは http://1234abcd.ngrok.io などのランダムな文字列となります。
しかも接続するたびにURLが変わるのでなかなか使い勝手が悪いです。

そのために独自のサブドメインを指定する機能があります。

$ ngrok http 80 -subdomain myapp

これで、 http://myapp.ngrok.io/ に公開できます。

サブドメインを指定するためにはユーザー登録と認証が必要です。

HTTPSに対応

ngrokで公開したWebサーバには http:// でも https:// でもアクセスできます。 ローカルサーバが http 専用の場合でも(今どき無いと思いますが、開発用サーバだとhttpsの設定を行うのも面倒だったりするので)、セキュアにアクセス可能です。

アクセス制限に対応

開発中のWebアプリなので勝手にアクセスされては困る。ランダムなサブドメインだとリスクが少ないけど、わかりやすいサブドメインを付けたい。という場合はアクセス制限を書けることが出来ます。

$ ngrok http -auth "user:password" 80

Digest認証でアクセス制限が掛かるようです。
ただ、私の環境では「400 Bad Request」エラーでアクセスできませんでした。

提供方式

以下のプラットフォーム向けにバイナリが提供されています。

導入方法

Ubuntuに導入する方法です。 バイナリをダウンロードしてZIPを解凍するだけなので、他のプラットフォームでも同じような手順で導入できるはずです。

インストール

以下を適当なファイルに保存して実行するとインストールできます。
2016-06-16日現在の最新は 2.0.19 でしたが、新しいバージョンがリリースされている場合は version 変数の値を変更してください。

#!/bin/bash
# アプリ名
app="ngrok"
# バージョン
version="2.0.19"
# インストールパス
libpath="/opt/${app}/${version}/"
# 実行ファイルのパス
binpath="/usr/local/bin/"

# インストール先のディレクトリを作成
sudo mkdir -p $libpath
# ダウンロード
cd $libpath
sudo wget "https://dl.ngrok.com/ngrok_${version}_linux_amd64.zip"
# ダウンロードしたファイルを解凍
sudo unzip "ngrok_${version}_linux_amd64.zip"

# 実行ファイルへのシンボリックリンクを作成
cd $binpath
sudo ln -s "${libpath}/${app}"

ユーザー登録と認証

サブドメインを指定するためには認証が必要です。

ngrokのログイン画面 からログインすると、認証キーをもらえます。

f:id:tatur0u:20150616100416j:plain

これを実行すると認証が完了し、好きなサブドメイン名を指定することができます。

$ ngrok authtoken <認証キー>

あとがき

Caddyとngrokは「Pebbleアプリの設定画面を作る」という非常にニッチな受容を満たしてくれました。 Pebbleアプリ開発については、このブログでぼちぼち書いて行こうと思っています。

各社スマートウォッチをリリースしていますが、Pebble は歴史が長いだけあって使い勝手が良いですし、開発者にとっては「少ないリソースでいかに魅せるか」という点で腕の見せどころが多い面白いガジェットです。

そろそろ、新しくカラー画面に対応した Pebble Time がリリースされるので、よろしければ購入してみたらいかがでしょう。



こちらは古い白黒のやつ。 見た目の違いで2種類あります(性能は同じ)。

Pebble Steel (Brushed Stainless)

Pebble Steel (Brushed Stainless)