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


導入

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

本文

材料:

方法:

1. ローカルでRDPを使う

まずはRaspberry Piと接続用のパソコンが同じWiFi回線に入っていることを確保します。
そして、IPスキャンアプリを使ってスキャンします

私の場合、Raspberry Piのホスト名を変更しましたが、変更していないRaspberry Piではraspberrypi.localというホスト名です。
そのホスト名のIPアドレスを使ってsshで入ります。

ssh pi@RaspberryPiのIP
password:初期設定だと「raspberry」

こんな画面が出れば、SSHで入りました。Raspberry PiのCPUは弱小なので、出るまで時間かかる可能性があります。

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

sudo apt-get install xrdp

長い待ち時間の後、いよいよRDPが使えるようになりました。

Windows編

 RDPはWindowsデフォルトの機能なので、スタートメニューで「RDP」を調べればすぐ出ます。後は案内メッセージに従ってセッテイングすれば繋がれます。

Mac編

 MacではRDPのアプリケーションも多数存在します。ここはCoRDという無料アプリを使います。
 解凍して、「アプリケーション」フォルダーに移動して、起動します。
 起動した当初は何も出ませんが、下の図のように設定します。

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

 設定が終わったら、設定したラベルをクリックするとこんな風に繋がれます。

 ローカルなので、実機とほとんど変わりません。

スマホ編

 「RDP」でアプリを検索すればたくさん出ますので、ここでの説明は割愛いたします。接続した実機画面だけ出します。(機器:iPhone 6S,アプリ:RD Client)

2. ngrokでSSHをつなぐ

 せっかくGUIでRaspberry Piと繋いているし、そのままRaspberry Piでngrokをダウンロードします。

Raspberry PiではLinux Arm版を使います

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

cd ~/Download
./ngrok -help

 ここでngrokの大体な使い方を全部出ます。

 ngrokでは、匿名ユーザーとしても使えますが、登録しない限り「HTTPのみ」となっています。今回使いたい「SSH」も「RDS」も、TCPプロトコルで走っているため、登録が必要です。
 GitHubのアカウント持っていれば、簡単に登録ができます。登録が成功したら、authtokenが発行されます。先ほどngrokを実行したフォルダーでそれを入れば、認証されます。

./ngrok authtoken あなたのauthtoken

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

./ngrok tcp 22

 下記の画面が出れば、すでにリモートでSSH接続可能になっています。

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

ssh [email protected] -p 16504

 成功すれば以下のようになります

 
 ngrokはデフォルトでUSサーバーを使いますので、今はアメリカに一周回って、自宅のRaspberry Piに接続したところです。

3. ngrokでリモートデスクトップ

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

./ngrok tcp -region=ap 3389


アジア太平洋地区になっています。

 そして、リモートデスクトップアプリを開き、tcp://0.tcp.ap.ngrok.io:15734に繋ぎます。

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