【remote.it】テレワークでも社内LAN(社内アプリ)にアクセスできる環境を自作する。

# remote.it とは

一言でいうと**簡単に利用できる、P2P接続サービス**になります。
リモートワークの普及に伴い、サイバーセキュリティに関心を置く会社も増えたのではないででしょうか？
そんな時remote.itを使うことで、セキュリティリスクを抑えてグローバルIPから社内LANに接続する仕組みを簡単に作ることができます！
「ポート解放が不要な点」や、「P2P接続するポートを制限することが可能」なため、かなりセキュアにアクセスすることができます。

今回はremote.itを使って「**安全に**」外部のインターネットから社内LANにアクセスしてみたいと思います。
(ついでにミニアプリを作ってみます。)
**※もちろん情シスからはOKを貰ってますよ！**

それではさっそく作っていきましょう！

https://ja.remote.it/

# 事前準備
[ハードウェア]
- [RaspberryPi 4B](https://www.switch-science.com/catalog/6370/) (**必須**)
- [SwitchBot](https://www.switchbot.jp/products/switchbot-motion-sensor) (**ミニアプリを作る場合必須になります。ラズパイへSSH接続するだけなら不要です。**)

[その他]
- remote.itのアカウント発行

https://app.remote.it/#/

# remote.itのインストール

[公式のDoc](https://support.remote.it/hc/ja/articles/4422713382413-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
)が充実しているので迷うことはないかもですが、パッケージのインストールからは書かれていなかったので以下の手順でインストールを進めてください！

まずはラズパイにremote.itをインストールします。
```sh
# remote.ioのインストール
$wget https://downloads.remote.it/cli/v1.8.8/remoteit.arm-v6-linux
$sudo cp ./remoteit.arm-v6-linux /usr/bin/remoteit
$sudo remoteit agent install
$sudo remoteit tools install

#インストールされているか確認
$remoteit version
1.8.8
```

その後、事前準備したremote.itのアカウントを使い、サインインとデバイスの登録を行います。
```sh
# サインイン
$sudo remoteit signin
Username: test@example.com
Password: ✓ SIGNIN in progress ...
✓ NEXT-ACTION: run 'remoteit register' to register this device into your remote.it account

# ラズパイをP2P接続できるように登録
$sudo remoteit register
Device name: RaspberryPi
 ✓ REGISTER in progress ...
 ✓ NEXT-ACTION: run 'remoteit add' to add services to this device
```

P2P接続を許可するポート番号を指定します。

```sh
# P2Pの設定を追加
$sudo remoteit add
Enter Service Type ('ID' or 'Name', not case sensitive, default is 'ssh'): 1
Enter Port (default is '0'): 3000
Enter Service Name (default is 'MyService'): Next.js

# SSHもついでに登録(対話形式でなくフラグでも登録できます)
$sudo remoteit add --name ssh --port 22 --type 28
```

以上でラズパイ側の設定は完了です！

[**公式Doc**]

https://support.remote.it/hc/ja/articles/4422713382413-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# P2P通信をしてみる

ここまで来たら後はP2P接続するだけです！

以下からremote.itの管理画面にログインしてください。

https://app.remote.it/#/

## SSH接続

ログインに成功すると以下のような管理画面に飛ぶと思います。
ラズパイの登録がうまくいっていれば、赤枠のように`Devices`へ登録されているはずです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469819/962b27b5-308d-3e9a-b3bf-98c1547cda88.png)

先ほど登録した「ssh」をクリックし、「Connectボタン」を押すと、赤枠にURLとポート番号が発行されますのでコピーしておきましょう！
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469819/cd4c1bc5-f752-837d-af32-30318c20fe2d.png)

発行されたURLとポート番号を使ってSSH接続を行います。

```sh
# リモートでSSHができるか確認
$ssh {ラズパイのユーザー名}@{発行されたURL + PORT番号}
password:

# 接続成功したら以下のようになります。
user@raspberrypi:~ $ remoteit version
1.8.8
```

コネクション切断が起きたら当然SSH接続も終了しますね。

```sh
# コネクション切断時
user@raspberrypi:~ $ Connection to proxy71.rt3.io closed by remote host.
Connection to proxy71.rt3.io closed.
```

## Webアプリへアクセス

今回は社内ミーティングルームの利用状況がわかるサンプルアプリを作りました。
(「**照度センサー**」を使い、明るさで人の有無を判定します。)

https://github.com/takusan64/remote-sensor-watch

先ほどのSSH接続と同様、**[管理画面](https://app.remote.it/#/) > RaspberryPi > 接続先(今回は「Next.js」) > Connectボタン** という流れでコネクションを確立すると URLが発行されますのでこれをコピーしブラウザからアクセスします！

![スクリーンショット 2022-07-16 19.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469819/ca369d76-46ee-0978-4568-1f21e14eca07.png)


コピーしたURLを貼り付けると、作成したアプリが表示されました。

「**ラズパイは社内LAN**」、「**PCは外部ネットワーク**」でアクセスしていますが、ミーティングルームのリアルタイム空室状況が確認できました！
(サンプルアプリを作ってたせいで、投稿ギリギリになってしまいました...)

![Qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469819/09783c68-c936-9e7d-9f38-9bc142a92d55.gif)

# 最後に
QiitaEngineerFesta2022のテーマとして「remote.it」の記事を書きましたが、めちゃめちゃ便利なサービスですね！
会社だけでなく、個人で使う場合もたくさんの使い道がありそうだなと感じました！

https://qiita.com/official-campaigns/engineer-festa/2022