remote.itを使用したAWSへのセキュアなリモートアクセス 

# 1. 今回の要約
* remote.it CLIを使用して、Linuxへremote.itをインストールする
* remote.itを使用して、AWSの踏み台サーバ(Bastion)へアクセスする
* remote.itを使用して、VPC Private SunbetのInstanceへアクセスする

AWSのBastion(Linux)にremote.itをインストールして、remote.itターゲット(デバイス)として利用します。remote.itを使用すると、Bastionへのアクセスにオープンポート(セキュリティグループでのInboundアクセス許可)が不要になります。またremote.itでは、接続先(サービス)をremote.itのインストールされたデバイスにする他に、そのデバイスに繋がれたネットワーク上の宛先にすることができます。これを利用すると、Bastionへのログインを省いて、目的のサーバへのダイレクトな接続が行えます。

# 2. 構成
<img width="80%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/120b77d9-7c7d-98fe-c7a0-8859cad6f51e.png">

* AWS VPC/Public Subnet上にあるBastionへremote.itをインストールします
* BastionのOSはAmazon Linux2とします (その他Linux OSでも可)
* 以下は事前に行われていることとします
  - remot.itアカウントの取得
  - 接続元Clientへのremote.it Desktop Appインストール

# 3. remote.itターゲットデバイス(Bastion)へのremote.itインストール
## remote.it CLIソフトウェアの取得
remote.it CLIソフトウェアを入手します。各種プラットフォーム用のremote.it CLIソフトウェアの入手先URLは、以下を確認ください。

* Windows
  - https://downloads.remote.it/cli/latest/remoteit_windows_x86.exe (32bit)
  - https://downloads.remote.it/cli/latest/remoteit_windows_x86_64.exe (64bit)
* macOS
  - https://downloads.remote.it/cli/latest/remoteit_mac-osx_x86_64 (64bit)
* Linux
  - https://downloads.remote.it/cli/latest/remoteit_linux_x86_64 (amd64)
  - https://downloads.remote.it/cli/latest/remoteit_linux_arm64 (arm64)
  - https://downloads.remote.it/cli/latest/remoteit_linux_armv7 (armhf v7)
  - https://downloads.remote.it/cli/latest/remoteit_linux_armv6 (armhf v6)
  - https://downloads.remote.it/cli/latest/remoteit_linux_armv5 (armhf v5)

* 今回は、Linux/amd64用のソフトウェアを使用します。AWSのBastionにログインをして、remote.it CLIをダウンロードしてください。

```bash
$ curl -LkO https://downloads.remote.it/cli/latest/remoteit_linux_x86_64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 2875k  100 2875k    0     0  5509k      0 --:--:-- --:--:-- --:--:-- 5509k
$
$ ls -l
total 2876
-rw-rw-r-- 1 ec2-user ec2-user 2944900 Oct 12 09:37 remoteit_linux_x86_64
```

* ダウンロードしたremote.it CLIを、実行パスの通ったディレクトリにコピーします(併せて、ファイル名を修正します)。コピーしたファイルに実行権限を付与してください。

```bash
$ sudo cp remoteit_linux_x86_64 /usr/bin/remoteit
$ sudo chmod +x /usr/bin/remoteit
$
$ ls -l /usr/bin/remoteit
-rwxr-xr-x 1 root root 2944900 Oct 12 09:45 /usr/bin/remoteit
```

* remote.it CLIが正しく配置されたことを確認します。

```bash
$ sudo remoteit version
1.6.5
```
## CLIサービスの登録と関連ツールのインストール
* remote.it CLIサービスをsystemdに登録します。

```bash
$ sudo remoteit agent install
 ? Installed and started system service successfully
$
$ systemctl status it.remote.cli.service
● it.remote.cli.service - remote.it agent, manages connections
   Loaded: loaded (/etc/systemd/system/it.remote.cli.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-10-12 09:53:31 UTC; 2min 25s ago
     Docs: https://docs.remote.it
 Main PID: 10206
   CGroup: /system.slice/it.remote.cli.service
           mq10206 n/a

Oct 12 09:53:31 ip-10-0-2-142.ap-northeast-1.compute.internal systemd[1]: Started remote.it agent, manages ....
Oct 12 09:53:31 ip-10-0-2-142.ap-northeast-1.compute.internal systemd[1]: Starting remote.it agent, manages....
Hint: Some lines were ellipsized, use -l to show in full.
```

* 次に、remote.it CLIを利用して、関連バイナリのインストールを行います。

```bash
$ sudo remoteit tools install
 ? Installing tools
 ? Tools installed to: '/usr/bin'
$
$ ls -l /usr/bin |grep -e remoteit -e connectd -e muxer
-rwxr-xr-x 1 root root      162872 Oct 12 09:57 connectd
-rwxr-xr-x 1 root root        7588 Oct 12 09:53 connectd_options
-rwxr-xr-x 1 root root        7909 Oct 12 09:53 connectd_task_notify
-rwxr-xr-x 1 root root       34808 Oct 12 09:57 demuxer
-rwxr-xr-x 1 root root       30712 Oct 12 09:57 muxer
-rwxr-xr-x 1 root root     2944900 Oct 12 09:45 remoteit
```

## remote.it へのサインイン
* 最後に、remote.itアカウントでのサインインを行います。

```bash
$ sudo remoteit signin
Username: xxxxxxxx@stylez.co.jp [remote.itアカウントを入力]
Password:
 ? SIGNIN in progress ...
 ? Login with remote.it account
 ? Download & install dependencies
 ? NEXT-ACTION: run 'remoteit register' to register this device into your remote.it account
```

* remoteit statusコマンドを使用すると、サインインされたことが確認できます。
※Usernameに、サインインされたアカウントが表示されます

```bash
$ sudo remoteit status
 ? Fetching status

Username: xxxxxxxx@stylez.co.jp

Device:
No device...

Services:

Connections:
```

以上で、remote.it CLIを使用するための準備が完了しました。
次に、remote,itにターゲットデバイスとサービスを登録していきます。
 
# 4. remote.it ターゲットデバイスとサービスの登録
## デバイスの登録
* デバイスをremote.itに登録します。デバイス名を登録できますので、任意の名前(今回はremoteit-Linux-Bation)を入力してください。

```bash
$ sudo remoteit register
Device name: remoteit-Linux-Bastion
 ? REGISTER in progress ...
 ? Login with remote.it account
 ? Register device 'remoteit-Linux-Bastion'
 ? Applying config
 ? NEXT-ACTION: run 'remoteit add' to add services to this device
```

* 登録したデバイスは、remoteit statusコマンドをjson(--json or -j)で表示させることにより確認することができます。

```json
$ sudo remoteit status --json
{
  "device": {
    "name": "remoteit-Linux-Bastion",
    "id": "xx:xx:xx:xx:xx:xx:xx:xx",
    "state": "connected",
    "error": {
      "message": ""
    },
    "address": "127.0.0.1:65535",
    "startedAt": "2020-10-13T04:31:44Z",
    "pid": "13701"
  },
  "services": [],
  "username": "xxxxxxxx@stylez.co.jp",
  "connections": []
}
```
 
## サービスの登録(デバイスローカル)
* remote.itでは、デバイスに対してアクセスさせたい通信(特定ポート宛てのリモート接続)をサービスとして登録します。まずは、このデバイス(Bastion)宛てのSSH(TCP/22)を登録してみます。サービス名を登録できますので、任意の名前(今回はSSH)を入力してください。
※希望のサービスタイプがメニューに無い場合には、tcpを選択してください

```bash
$ sudo remoteit add
× AVAILABLE TYPES
 ×     tcp - TCP
 ×     vnc - VNC
 ×     rdp - RDP
 ×     http-proxy - HTTP reverse proxy
 ×     https-proxy - HTTPS reverse proxy
 ×     ssh - SSH
 ×     http - HTTP
 ×     https - HTTPS
 ×     samba - Samba
 ×     bulk - Bulk
 ×     nx-witness - NX Witness
 ×     next-cloud - NextCloud
 ×     openvpn - OpenVPN
 ×     multiport - MultiPort
Service type: ssh
Port: 22
Service name: SSH
 ? ADD in progress ...
 ? Login with remote.it account
 ? Creating 'SSH' service named 'SSH' at '127.0.0.1:22'
 ? NEXT-ACTION: run 'remoteit add' to add more services
```

* 登録したサービスは、remoteit statusコマンドをjson(--json or -j)で表示させることにより確認することができます。

```json
$ sudo remoteit status --json
{
  "device": {
    "name": "remoteit-Linux-Bastion",
    "id": "xx:xx:xx:xx:xx:xx:xx:xx",
    "state": "connected",
    "error": {
      "message": ""
    },
    "address": "127.0.0.1:65535",
    "startedAt": "2020-10-13T04:31:44Z",
    "pid": "13701"
  },
  "services": [
    {
      "name": "SSH",
      "id": "xx:xx:xx:xx:xx:xx:xx:xx",
      "state": "connected",
      "error": {
        "message": ""
      },
      "address": "127.0.0.1:22",
      "startedAt": "2020-10-13T04:43:31Z",
      "pid": "13794",
      "disabled": false
    }
  ],
  "username": "xxxxxxxx@stylez.co.jp",
  "connections": []
}
```

## サービスの登録(デバイスリモート)
* remote.itのサービスはターゲットデバイス宛ての通信の他に、ターゲットデバイスを経由してそのデバイスに繋がれたネットワーク上にある、他のホスト宛ての通信(特定ポート宛てのリモート接続)を登録することができます。

* つぎに、リモートホスト宛てのSSH(TCP/22)を登録してみます。リモートホスト宛てにサービスを登録する場合には、remoteit addコマンドに--hostname [hostname/ipaddress]オプションで、リモートホストを指定してください。サービス名を登録できますので、先程とは異なる任意の名前(今回はRemoteHost1-SSH)を入力してください。
※希望のサービスタイプがメニューに無い場合には、tcpを選択してください

```bash
$ sudo remoteit add --hostname 10.0.5.224
 × AVAILABLE TYPES
 ×     tcp - TCP
 ×     vnc - VNC
 ×     rdp - RDP
 ×     http-proxy - HTTP reverse proxy
 ×     https-proxy - HTTPS reverse proxy
 ×     ssh - SSH
 ×     http - HTTP
 ×     https - HTTPS
 ×     samba - Samba
 ×     bulk - Bulk
 ×     nx-witness - NX Witness
 ×     next-cloud - NextCloud
 ×     openvpn - OpenVPN
 ×     multiport - MultiPort
Service type: ssh
Port: 22
Service name: RemoteHost1-SSH
 ? ADD in progress ...
 ? Login with remote.it account
 ? Creating 'SSH' service named 'RemoteHost1-SSH' at '10.0.5.224:22'
 ? NEXT-ACTION: run 'remoteit add' to add more services
```

* 登録したサービスは、先程同様にremoteit statusコマンドをjson(--json or -j)で表示させることにより確認することができます。

```json
$ sudo remoteit status –json
{
  "device": {
    "name": "remoteit-Linux-Bastion",
    "id": "xx:xx:xx:xx:xx:xx:xx:xx",
    "state": "connected",
    "error": {
      "message": ""
    },
    "address": "127.0.0.1:65535",
    "startedAt": "2020-10-13T04:31:44Z",
    "pid": "13701"
  },
  "services": [
    {
      "name": "SSH",
      "id": "xx:xx:xx:xx:xx:xx:xx:xx",
      "state": "connected",
      "error": {
        "message": ""
      },
      "address": "127.0.0.1:22",
      "startedAt": "2020-10-13T04:43:31Z",
      "pid": "13794",
      "disabled": false
    },
    {
      "name": "RemoteHost1-SSH",
      "id": "xx:xx:xx:xx:xx:xx:xx:xx",
      "state": "connected",
      "error": {
        "message": ""
      },
      "address": "10.0.5.224:22",
      "startedAt": "2020-10-13T05:11:46Z",
      "pid": "14076",
      "disabled": false
    }
  ],
  "username": "xxxxxxxx@stylez.co.jp",
  "connections": []
}
```

以上で、ターゲットデバイスとサービスの登録が完了しました。
次に、クライアントから登録されたターゲットとデバイスを確認して接続を行います。

# 5. remote.itクライアントからのリモート接続
* 接続元となるクライアント端末で、remote.itアプリを立ち上げログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/43186261-149d-85d4-321d-ca9be0bde547.png)

* Deviceタブに、登録したターゲットデバイス(remote.it-Linux-Bastion)が表示されています。接続するデバイス(remoteit-Linux-Bastion)をマウスで選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/e1024088-f863-d725-3659-e6020c952662.png)
 
* デバイスに登録したサービスが2つ表示されています。以下の例では、サービス「SSH」はターゲットデバイス(Bastion)のローカルのSSHポートへ接続するサービスで、もう一方のサービス「RemoteHost1-SSH」は、ターゲットデバイス(Bastion)のネットワークに接続されたリモートホスト(Private Subnet上のEC2 Instance)のSSHポートへ接続するサービスとして登録されています。

* サービス「SSH」の左にある緑色のCONNECTボタンをマウスで押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/60a8c031-67d5-da5a-8d3b-c8db1da12c56.png)

* サービスへの接続が施行され、ボタンが青色のDISCONNECTになれば接続完了です。この時、サービス名(SSH)の下にポート番号が表示されています(localhost:33000)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/79f619e2-d68e-f0ce-0caa-353fa2526061.png)

* SSHで接続を行うためのTerminalソフトウェアを実行し、接続先を先程remote.itで確認したlocalhost:33000としてください。
※ユーザIDやPassword/Keyなどは普段ご利用のものを使用してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/71d9584c-fc2e-1b7f-cd74-90b6e978252b.png)

* Bastionへの接続が行えました。remote.itがCONNECTしたBastionへの接続先をlocalhost:33000にマッピングしてくれています。そのため、remote.itを使用した場合には、Terminalの接続先がBastionのアドレスではなく、マップされたローカルのポートとなっています。
※このローカルのポートは、自動的に可変(33000以降)の番号が割り当てられるか、もしくは任意に設定ができます(一度接続したポート番号は次回接続時に再利用も可能です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/7a3d41f1-122d-0a33-4a28-61889ec109e8.png)

次に、もう一つ登録したサービス(Privateサブネット上のEC2 Instance)への接続を行ってみます。

* サービス「RemoteHost1-SSH」の左にある緑色のCONNECTボタンをマウスで押下してください。ボタンが青色のDISCONNECTになれば接続完了です。先程と同じように、サービス名(RemoteHost1-SSH)の下にポート番号が表示されています(localhost:33001)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/54f3ae62-5c90-af9a-4adb-01b5a004dc1e.png)

* SSHで接続を行うためのTerminalソフトウェアを実行し、今度は接続先を先程remote.itで確認したlocalhost:33001としてください。
※ユーザIDやPassword/Keyなどは普段ご利用のものを使用してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/2f333a27-0cc1-6fe1-835f-82f5030eda16.png)

* Private Subnet上にあるInstanceへの接続が行えました。Bastionのremote.itを経由して接続されていますので、Bastionへのログインは不要となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/bd911dad-9799-9822-59d1-169c5acd8665.png)

* 接続を終える場合には、クライアント端末のremote.itで、該当のDISCONNECTと表示されているボタンを押下します。ボタンが緑色のCONNECTになれば切断完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/ce64cb9a-6eb9-85f3-b76a-0721642f8aee.png)

* 一度接続したサービスは、Connectionsタブからでも接続が可能です。Connectionタブを使用することにより、目的のサービスを素早く見つけることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/98d9d2d2-46f0-9e70-0f87-9ea13add1186.png)

# 6. remote.it CLI その他の機能について
* remote.it CLIのその他のオプションは、remoteit --helpにて確認することができます。また、各コマンドの詳細オプションが知りたい場合には、各コマンドの最後に同様に--helpと入力してください。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771955/75ade7e0-2bf1-ed5a-757e-9fe85fe80ea5.png)

* インストールしたremote.itの各登録情報などを削除する場合には、以下のコマンドを使用してください。

|コマンド|実行内容|
|---|---|
|remoteit delete|サービスの登録削除|
|remoteit unregister|デバイスの登録削除|
|remoteit uninstall|登録情報とソフトウェアの削除|