remote.itを使ってベアメタルに接続する

# はじめに
本記事は[Qiita Engineer Festa 2022](https://qiita.com/official-campaigns/engineer-festa/2022)の[remote.it を使って○○に接続してみた！](https://qiita.com/official-events/8a2ab08f6fa0f093ae39)に関する記事になります。

[remote.it](https://www.remote.it/)は自宅や工場など遠隔地に存在するエッジデバイスに対して、LAN環境のネットワーク設定を変更することなく、リモート接続ができるサービスです。

サービスのソリューションはとてもシンプルです。
ホームページの[導入事例](https://ja.remote.it/case-study)を見ると、課題解決の施策としてRemote.Itの様々な利用例が記載されています。

本記事では個人利用からの視点になりますが、実際にremote.itを用いて自宅にあるベアメタルに接続して、クラウドのようにリモートで使用するための方法について記載しています。
本記事で使用しているベアメタルについては以前、書いた[自作PCの組み立て方　ベアメタルで構築する俺のKALI【PC組み立て編】](https://qiita.com/Brutus/items/4d6da6a989f2a64ec9a2)を参照。

## remote.it概要
remote.itを利用するにあたり、ホームページに記載がある[価格](https://ja.remote.it/pricing)の通りに、個人利用でも5台までなら**無料**で利用できます。

[はじめに](https://ja.remote.it/connectivity/getting-started)を参考にしながら、remote.itを使用するためには以下の作業が必要です。

- [ ] アカウントの作成
- [ ] パッケージのインストール
- [ ] デバイス及びサービスの登録
- [ ] remote.itの接続

remote.itの接続は[プロキシ](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)と、P2P（略称）と呼ばれる[Peer to Peer](https://ja.wikipedia.org/wiki/Peer_to_Peer)利用した接続方式に大別できます。
remote.itの接続方式については、[Remote.It 技術概要](https://ja.remote.it/technology)を参照。（※以下の図は左記リンクより引用）

![](https://uploads-ssl.webflow.com/61a57169f8821a939056f42c/62564c6ee553abe0d7ccb955_Remote.It-Components-Cloud-Initiator-Target.png)

インターネットの世界ではグローバルIPアドレスを持つノードから、プライペートIPアドレス持つノードに対して通信を行うことはできません。
グローバルIPアドレスを持つノードから見た場合、通信先となるネットワークの宛先は１台のノードでしか認識できないためです。そのため、P2Pなどを用いて内部ネットワークのプライペートIPアドレス持つノード群と通信するためには、NAT越えと呼ばれる[NAT traversal](https://ja.wikipedia.org/wiki/NAT_traversal)の技術が使用されています。

remote.itの接続方式で使用されている技術についてより理解するためには、**NAT**に対する理解が重要です。
NATは**Full cone NAT**や、**Symmetric NAT**等複数の種類が存在します。

- 参考：[ネットワークアドレス変換](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%8F%9B)

:::note
remote.itはインターネットに接続するために必要となるグローバルIPアドレスや、VPN等を使用せずに課題解決を行なうことでリモートアクセスを実現しています。
:::

## アカウント作成
[remote.it](https://ja.remote.it/)にアクセスして「はじめる」を押します。

![スクリーンショット 2022-06-25 20.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e63804fd-02bb-89fc-ba83-134ed3e6268e.png)

「Sign Up」の画面に遷移するため、アカウント情報を登録します。

![スクリーンショット 2022-07-03 21.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8e1d058b-f3bb-6007-0e0b-fc5019db04b6.png)

登録したメールアドレス宛に「Remote.It new account email verification required」の件名で登録確認メールが届きます。確認してリンクを押します。

![スクリーンショット 2022-06-25 20.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4b228bfb-dba7-aa5e-8097-fd97cbc6771a.png)

リンクを押すと、アカウントが登録されます。

![スクリーンショット 2022-06-25 20.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/7659d86b-5774-8081-7155-3e7123fa5299.png)

アカウント登録が完了し、サインインを行うと以下の画面に遷移します。

![スクリーンショット 2022-06-25 20.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c72dc12e-0897-c358-5f5e-b07598787a79.png)

## demo
「Devices」を見ると、初回サインイン後の状態ではdemo用のマシンが登録されています。

![スクリーンショット 2022-06-25 21.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8bfcd842-aa68-d3d7-3805-80c2b674fcfa.png)

demo用のマシンを選択して「SERVICE」を見ると、複数のサービスが確認できます。試しに「SSH Instance」を選択し、「CONNECT」を押します。

![スクリーンショット 2022-06-25 21.28.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f3908870-13d3-7d25-647d-9a5156183259.png)

接続するためのリンクが生成されるため、リンクのアイコンを押してクリップボードにコピーします。

![スクリーンショット 2022-06-25 21.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/923851f6-da36-46d0-081b-863c955a1e7d.png)

ターミナルよりdemo用のマシンへのSSH接続が確認できました。

```console
     ___        ______                             _         _ _   
    / \ \      / / ___|   _ __ ___ _ __ ___   ___ | |_ ___  (_) |_ 
   / _ \ \ /\ / /\___ \  | '__/ _ \ '_ ` _ \ / _ \| __/ _ \ | | __|
  / ___ \ V  V /  ___) | | | |  __/ | | | | | (_) | ||  __/_| | |_
 /_/   \_\_/\_/  |____/  |_|  \___|_| |_| |_|\___/ \__\___(_)_|\__|

https://remote.it/solutions/remote-cloud
```

## remote.itの接続（プロキシ）
プロキシを使用してベアメタルのマシンにSSH接続できるか検証を行います。

まずは必要なパッケージをダウンロードするために[Supported Platforms](https://docs.remote.it/software/device-package/supported-platforms)を確認します。
本記事ではKali Linuxを使用しているため、Debian（amd64）のパッケージを使用します。
Debianは複数の種類がありますが、アーキテクチャが不明の場合、以下Debianのサイト「2.1.1. サポートするアーキテクチャ」が参考になると思います。

- 参考：[2.1. サポートするハードウェア](https://www.debian.org/releases/stable/armhf/ch02s01.ja.html)

### パッケージのインストール
amd64のパッケージをダウンロードするためには以下のコマンドを実行します。

`$ wget https://downloads.remote.it/remoteit/v4.14.1/remoteit-4.14.1.amd64.deb`

amd64のパッケージをダウンロード後、パッケージをインストールするために以下のコマンドを実行します。

`$ sudo apt install ./remoteit-4.14.1.amd64.deb`

- 参考：[Installation](https://docs.remote.it/software/device-package/installation)

<details><summary>出力例</summary>

```console
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
注意、'./remoteit-4.14.1.amd64.deb' の代わりに 'remoteit' を選択します
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libdav1d5 libdrm-intel1 libgeos3.10.2 liblttng-ust-ctl4 liblttng-ust0
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  jq libjq1 libonig5
以下のパッケージが新たにインストールされます:
  jq libjq1 libonig5 remoteit
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 2 個。
493 kB 中 388 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,165 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 /tmp/remoteit-4.14.1.amd64.deb remoteit amd64 4.14.1 [105 kB]
取得:2 http://linux3.yz.yamagata-u.ac.jp/pub/linux/kali kali-rolling/main amd64 libonig5 amd64 6.9.8-1 [188 kB]
取得:4 http://linux3.yz.yamagata-u.ac.jp/pub/linux/kali kali-rolling/main amd64 jq amd64 1.6-2.1 [64.9 kB]
取得:3 http://ftp.jaist.ac.jp/pub/Linux/kali kali-rolling/main amd64 libjq1 amd64 1.6-2.1 [135 kB]
388 kB を 1秒 で取得しました (375 kB/s)
以前に未選択のパッケージ libonig5:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 307133 個のファイルとディレクトリがインストールされています。)
.../libonig5_6.9.8-1_amd64.deb を展開する準備をしています ...
libonig5:amd64 (6.9.8-1) を展開しています...
以前に未選択のパッケージ libjq1:amd64 を選択しています。
.../libjq1_1.6-2.1_amd64.deb を展開する準備をしています ...
libjq1:amd64 (1.6-2.1) を展開しています...
以前に未選択のパッケージ jq を選択しています。
.../archives/jq_1.6-2.1_amd64.deb を展開する準備をしています ...
jq (1.6-2.1) を展開しています...
以前に未選択のパッケージ remoteit を選択しています。
/tmp/remoteit-4.14.1.amd64.deb を展開する準備をしています ...
remoteit (4.14.1) を展開しています...
libonig5:amd64 (6.9.8-1) を設定しています ...
libjq1:amd64 (1.6-2.1) を設定しています ...
jq (1.6-2.1) を設定しています ...
remoteit (4.14.1) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/connectd.service → /lib/systemd/system/connectd.service.

--------------------- Claim this device ---------------------

Use the code xxxxxxxx to register this device to your account

--------------------- Claim this device ---------------------

libc-bin (2.33-6) のトリガを処理しています ...
man-db (2.10.2-1) のトリガを処理しています ...
kali-menu (2022.3.0) のトリガを処理しています ...
```
</details>

### デバイスの登録
デバイスの登録を行うために「Devices」から「Linux & Raspberry Pi」を選択し、「CLAM CODE」にパッケージインストール後に出力されるコードを入力します。

![スクリーンショット 2022-06-25 21.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/49822eef-93b2-cc3c-1e9c-19b8ef7e71e7.png)

エージェントをインストールするためのコマンドを出力されるため、コピーしてターミナルなどから実行します。

![スクリーンショット 2022-06-25 21.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f92341be-aa8c-dde6-9465-d5737e6b42f1.png)

上記コマンドを実行後、デバイスが登録されたことが確認できます。
STATUSがOnlineと表示されているので、ターゲットについて正しく認識されていることが確認できます。

![スクリーンショット 2022-06-25 21.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/fce83646-073d-43ea-b074-7d2cc3f27576.png)

### サービスの登録
リモートから接続するためのサービスを登録するために、「+」を押します。
![スクリーンショット 2022-06-25 21.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/2d74d031-f0f7-90ff-ced1-64496a98ba3a.png)

「SERVICE TYPE」は「SSH」を選択し、設定値を確認して「SAVE」を押して保存します。

![スクリーンショット 2022-06-25 22.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b50d666b-febb-4f42-1e1a-2037c3244dd5.png)

### remote.itの接続

「USER NAME」にSSH接続するためのユーザー名を入力して、「CONNECT」を押します。

![スクリーンショット 2022-06-25 22.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f3b0cedf-d506-92ac-a98b-6baa05bfaafb.png)

接続用のリンクが生成されるため、コピーします。また、Connectionを見ると、**Public Proxy**と表示されていることが確認できます。
現在、どのようにして接続しているかはConnectionを見ると分かります。

![スクリーンショット 2022-06-25 22.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/feaafc42-0fe5-0b1e-f4b1-0c0eb87569be.png)

接続用のリンクをブラウザにペーストして、ターミナルを起動します。

![スクリーンショット 2022-06-25 22.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/5192fe9f-d62f-518e-ff90-42c98ea80a03.png)

「許可」を押します。

![スクリーンショット 2022-06-25 22.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c4ff9346-3ebf-0415-1e1f-86c9966cdbf5.png)

ターミナルが起動されてSSH接続ができました。

```console
┌──(username㉿hostname)-[~]
└─$ 
```

なお、上記で生成されるリンクは以下のコマンドと同等です。

`$ ssh -l ＜ユーザー名＞ ＜Proxy URL＞ -p ＜ポート番号＞`

## remote.itの接続（P2P）
P2Pで接続するためためには接続するためのクライアントとなるソフトウェアが必要です。
P2Pで接続するための手順について、Macを例に記載します。

### クライアントのインストール

[ダウンロード](https://ja.remote.it/download)画面にアクセスして「MacOS」のアイコンを押します。

![スクリーンショット 2022-06-26 20.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e0d7d99a-18ff-325d-9ae2-25fb6a91ecca.png)

デスクトップアプリから対象のCPUアーキテクチャを選択してダウンロードを行います。
CPUアーキテクチャが不明な場合は、ターミナルで`$ uname -m`コマンドを実行すると確認できます。

![スクリーンショット 2022-06-26 20.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/24cdcdd4-2bab-df99-3b2c-8798c069eca7.png)

ダウンロード後、デスクトップアプリをインストールします。

![スクリーンショット 2022-06-26 20.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/bb6043dc-3866-c6c0-4197-f4a2e04c782c.png)

### remote.itの接続
デスクトップアプリを起動後、サインインを行います。

![スクリーンショット 2022-06-26 20.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a2f1e6f7-261d-2cf6-bee3-652a79632915.png)

デスクトップアプリにサインイン後、P2P接続の設定を行うために「ADD TO NETWORK」を押します。

![スクリーンショット 2022-06-26 20.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/bd557336-70ac-96ff-ca95-f13b02869de4.png)

接続用のリンクが生成されるため、コピーします。

![スクリーンショット 2022-06-26 20.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6c72bafe-5e77-51b7-9b6a-37fb5e2dbfd9.png)

ターミナルを起動後、接続用のリンクをペーストしてSSH接続を行います。

```console
┌──(username㉿hostname)-[~]
└─$ 
```

P2Pの場合、Connectionが**Pear to pear**と表示されていることが確認できます。

![スクリーンショット 2022-06-26 22.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/01188ea8-b99b-78c5-657a-90c22c7eb2a5.png)

:::note
セキュリティとパフォーマンスの観点からPeer to Peer（P2P）接続が推奨されています。
:::

## 二要素認証
セキュリティを強化するために**二要素認証**を使用することを**推奨**します。

二要素認証を有効化するためには、アカウントの設定から「Security」を選択して、TWO-FACTOR AUTHENTICATIONの「TURN ON」を押します。

![スクリーンショット 2022-06-25 22.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/75134141-712e-c4a1-5566-bbc66f35f872.png)

「Authenticator app」を選択して「NEXT」を押します。

![スクリーンショット 2022-06-25 22.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/517a1f78-4b43-2afa-2c0e-96a29a38a49d.png)

QRコードが表示されるのでGoogle Authenticatorなどのアプリから読み取ってコードを入力します。
コード入力後、「SUBMIT」を押します。

![スクリーンショット 2022-06-25 22.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/fd1392f2-92c7-8d8c-12ca-8859b27a5e04.png)

:::note
以降、remote.itにサインインする際は二要素認証が有効になります。
:::

# おわりに
本記事ではペネレーションテストなどで使用されるKali Linuxがインストールされたベアメタルに接続しました。

リモートで接続するための目的は人それぞれ違いますが、remote.itを使用することでリモートから自宅のPCなどに接続して、クラウドのように自由にどこからでも作業を行うことができます。

セキュリティ観点で考えた場合に運用で考慮すべき点はありますが、利便性がある面白いサービスだと思います。
また、背景で使用されているネットーク技術に対しても興味深いものを感じました。

他のデバイスにも導入して使いたいと思います。
## 参考
- [エッジコンピュータを用いた遠隔監視サービスシステム向けセキュリティ技術](https://www.mhi.co.jp/technology/review/pdf/571/571090.pdf)