ngrokでRaspberry Piのデスクトップをインタネットに公開

#導入
　[Raspberry Pi](https://www.raspberrypi.org/)は手軽に手に入れるIoTデバイスの代表として、技術者や愛好家の間で多く利用されています。そしてRaspberry Pi 3BはBlueToothとWiFiモジュールをハードの中に組み込んでいたことで、さらに使いやすくなっています。
　[ngrok](https://ngrok.com/)は、ローカルのポート(主にHttpやTCPプロトコルの)をインタネットに一時的に公開できるサービスです。windows,mac,linuxなどいろんなOSに対応でき、使い方も簡単です。使い慣れたら、本当に「文明の利器だ」という実感がわきます。
　[リモートデスクトップサービス(RDS)](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)は本来、Microsoft社が自社製品であるWindows Serverをより便利に管理できるために開発したサービスです(windowsのCUIの使い辛さを考えてみればわかる気がします)。その後開発が重なり、Remote Desktop Protocol （リモート デスクトップ プロトコル、RDP）と変貌して、linuxでも使えるようになりました。RDPプロトコルはTCPポート 3389 およびUDPポート3389を使用して接続します。

#本文
##材料：
* [セッテイング済み](http://qiita.com/jerrywdlee/items/4ffa93c1b37341db51fb)のRaspberry Pi 3B一台
* WIFI回線環境
* 接続用のパソコン、スマホ数台

##方法：
###1. ローカルでRDPを使う
まずはRaspberry Piと接続用のパソコンが同じWiFi回線に入っていることを確保します。
そして、IPスキャンアプリを使ってスキャンします
![Desctop screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/87438/4f66a286-b31c-ed9b-fb7d-89458dc4f598.png)
私の場合、Raspberry Piのホスト名を変更しましたが、変更していないRaspberry Piでは`raspberrypi.local`というホスト名です。
そのホスト名のIPアドレスを使ってsshで入ります。

```
ssh pi@RaspberryPiのIP
password:初期設定だと「raspberry」
```
こんな画面が出れば、SSHで入りました。Raspberry PiのCPUは弱小なので、出るまで時間かかる可能性があります。
![Desctop screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/87438/6b050bd8-f300-9c69-b57f-373d2c0e3fe7.png)

そして一刻も早く、RDPを使えるようにします
今回使うのは`xrdp`というアプリケーションです。「Raspberry Pi」「xrdp」をキーワードで検索すればたくさん情報が出ます。
早速インストールします。

```
sudo apt-get install xrdp
```
長い待ち時間の後、いよいよRDPが使えるようになりました。
####Windows編
　RDPはWindowsデフォルトの機能なので、スタートメニューで「RDP」を調べればすぐ出ます。後は案内メッセージに従ってセッテイングすれば繋がれます。

####Mac編
　MacではRDPのアプリケーションも多数存在します。ここは[CoRD](http://cord.sourceforge.net/)という無料アプリを使います。
　解凍して、「アプリケーション」フォルダーに移動して、起動します。
　起動した当初は何も出ませんが、下の図のように設定します。
![cord.gif](https://qiita-image-store.s3.amazonaws.com/0/87438/3f11a352-fcb0-8e6c-8930-02e8dfe6137f.gif)

* Lable:好きのラベルでいい
* Address:先ほどのIPアドレス
* Username:デフォルトは「pi」
* Password:デフォルトは「raspberry」
* その他:空白で結構です

　設定が終わったら、設定したラベルをクリックするとこんな風に繋がれます。
![cord02.gif](https://qiita-image-store.s3.amazonaws.com/0/87438/80bc264f-9619-bcc6-67fd-27073eefce92.gif)
　ローカルなので、実機とほとんど変わりません。

####スマホ編
　「RDP」でアプリを検索すればたくさん出ますので、ここでの説明は割愛いたします。接続した実機画面だけ出します。(機器:iPhone 6S,アプリ:RD Client)
![IMG_2813.PNG](https://qiita-image-store.s3.amazonaws.com/0/87438/5392e0cd-f665-989e-882e-823d7c0cb3fb.png)


###2. ngrokでSSHをつなぐ
　せっかくGUIでRaspberry Piと繋いているし、そのままRaspberry Piでngrokをダウンロードします。
![ngrok01.gif](https://qiita-image-store.s3.amazonaws.com/0/87438/7ef8c8ff-34ed-519d-a4a3-1be32e3777c7.gif)
Raspberry PiではLinux Arm版を使います

　ダウンロードしたものは`~/Download`配下にあります。そこでさっきダウンロードしたzipを解凍します。
　ここで一旦SSHの方に戻って、ngrokを実行します

```
cd ~/Download
./ngrok -help
```

　ここでngrokの大体な使い方を全部出ます。
![ngrok02.png](https://qiita-image-store.s3.amazonaws.com/0/87438/21301a77-aa7e-b53c-3d13-0aa643994221.png)

　ngrokでは、匿名ユーザーとしても使えますが、登録しない限り「HTTPのみ」となっています。今回使いたい「SSH」も「RDS」も、TCPプロトコルで走っているため、登録が必要です。
　GitHubのアカウント持っていれば、簡単に登録ができます。登録が成功したら、`authtoken`が発行されます。先ほどngrokを実行したフォルダーでそれを入れば、認証されます。
![ngrok03.png](https://qiita-image-store.s3.amazonaws.com/0/87438/c283b942-78ee-4d04-7711-5626a08197fe.png)

```
./ngrok authtoken あなたのauthtoken
```
　これでsshをインタネットで公開できます。SSHプロトコルはデフォルトではポート22番で走っていますので、そこをngrokに監視させばOKということです。

```
./ngrok tcp 22
```

　下記の画面が出れば、すでにリモートでSSH接続可能になっています。
![ngrok04.png](https://qiita-image-store.s3.amazonaws.com/0/87438/4f612639-06ba-7b49-4599-0f6670d8edc7.png)

　ここに書いている`tcp://0.tcp.ngrok.io:16504`にSSHで接続には、下記のコマンドを使います。ポート番号指定するには`-p ポート番号`は要です。また、無料アカウントだと、毎回アドレスとポート番号が変わります。

```
ssh pi@0.tcp.ngrok.io -p 16504
```

　成功すれば以下のようになります
![ngrok05.png](https://qiita-image-store.s3.amazonaws.com/0/87438/9f61d460-a90c-a7b4-ffba-5eab24470e5e.png)
　
　ngrokはデフォルトでUSサーバーを使いますので、今はアメリカに一周回って、自宅のRaspberry Piに接続したところです。

###3. ngrokでリモートデスクトップ
　いよいよ本番です。ngrokの無料アカウントができる接続は１つのみとなっていますので、まずはSSH用のngrokを`crtl+c`で切断します。
　そして先ほど紹介したように、RDPプロトコルはTCPポート3389を使用しています。なので、SSHと似た感じで、ngrokを3389を監視させばOKです。
　ただし、RDPはSSHより通信量が膨大であるため、さすがにアメリカへ一周回って接続するのは遅いです。なので、ここはngrokの`region`をアジア太平洋地区`Asia Pacific (ap)`にしていします。

```
./ngrok tcp -region=ap 3389
```
![ngrok06.png](https://qiita-image-store.s3.amazonaws.com/0/87438/14c4199f-de49-e42b-104b-3a2a36ce2875.png)
アジア太平洋地区になっています。

　そして、リモートデスクトップアプリを開き、`tcp://0.tcp.ap.ngrok.io:15734`に繋ぎます。
![cord03.gif](https://qiita-image-store.s3.amazonaws.com/0/87438/567581cb-1358-6936-bb73-203efd59967a.gif)

　アジア太平洋サーバーとはいえ、海外のサーバーを経由していたため、ローカルよりは若干遅いです。筆者は最初USサーバーを経由して繋いてみました。アジア太平洋サーバーより２倍ほど遅いでした。