これは魔法か？！ インバウンドポートを全閉したAWSのサーバに接続する方法

#はじめに
AWSのサーバに（AWSに限らずですが）インターネット経由で接続する場合、接続したいアプリケーションが待ち受けているポートに対するアクセスを許可する必要があります。Webサーバであれば80番、sshで乗り込みたければ22番といった具合です。
当然これらはインターネットに対して公開されていますので、意図しない人からもアクセスされる可能性があります。（ので、普通は送信元で制限したり、アプリケーションで認証を要求したりします。）

では、全くポートを開かずに、魔法のように接続できるとしたらどうでしょう？！

#remote.itを使うと
それができます。
remote.itがどんなサービスかというのは、こちらの@u___skさんの記事で紹介されていますので、併せてご覧ください。
>[インターネット世界の「どこでもドア」　remote.it](https://qiita.com/u___sk/items/e0df9581d2e58891ec8a)

:::note info
2021.9.27 追記
これ以降の手順を、最新のCLIを使う手順に更新し、画面なども差し替えました。
:::

#1. まずは普通にAWSのサーバを用意する
####AWSでサーバを用意する
ubuntuサーバを用意して、apache 2 をインストールしました。（この辺の手順はQiitaに優れた記事がたくさんあると思いますので割愛します。）
また、このサーバのパブリックIP（グローバルIP）が `54.248.15.144` であることが分かります。
![スクリーンショット 2021-09-27 17.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/7d0eab6a-0db3-856f-ec0e-7e9023571aaa.png)



####セキュリティグループでポートを開ける
Webサーバなので80番を開けました。sshの22番もいったんそのままです。 Hello world!
![スクリーンショット 2021-09-27 17.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/7f50ffb9-3fc0-4b3a-c813-f509f885ce7e.png)


####Webサーバにアクセスしてみる
先ほど確認した `54.248.15.144` にアクセスでき、apacheのデフォルトページが表示されました。（当たり前）
![スクリーンショット 2021-09-27 17.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/686ec9d9-90de-9aee-a965-b0ac81365a72.png)


#2. remote.itアカウントを作る
ubuntuサーバへremote.itをインストールする前にremote.itアカウントを作る必要があります。
remote.itのWebサイトにアクセスし、「Get Started」からアカウントを登録してください。

[remote.it](https://remote.it/)

アカウントを作成し、サインインすると以下のようになります。
![スクリーンショット 2021-09-27 17.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/2a1a1fe0-730f-531e-37b4-63897078efa2.png)



#3. remote.itをインストールする
今回はremote.itのCLI（Command Line Interface）を使う方法を紹介します。
ubuntuサーバにsshなどで接続し、以下のコマンドを順に実行してremote.itのCLIを取得してインストールします。（ダウンロードURLはremote.itのWebサイトの「[ダウンロード](https://remote.it/download/)」から、自身のプラットフォームに適合するものを確認できます。）

```console
$ curl -LkO https://downloads.remote.it/cli/v1.7.48/remoteit_linux_x86_64
$ sudo cp ./remoteit_linux_x86_64 /usr/bin/remoteit
$ sudo chmod +x /usr/bin/remoteit
```

続けて、以下のコマンドでシステムサービスと関連バイナリをインストールします。

```console
$ sudo remoteit agent install
 ✓ Agent installed and started successfully
$ sudo remoteit tools install
 ✓ Installing tools
 ✓ Tools installed to: '/usr/bin'
```

#4.ubuntuサーバをremote.itのデバイスとして登録する
remote.itを使って接続できるように、ubuntuサーバと接続したいサービス（アプリケーション）を登録します。

まず、サインインコマンドでremote.itアカウントにサインインします。

```console
$ sudo remtoeit signin
```

次に、以下のコマンドでremote.itを使って接続するターゲットとして登録します。
このubuntuサーバをremote.itに登録するための名前の入力を求められますので、任意の名前を入力します。

```console
$ sudo remoteit register
Device name: demo-ubuntu20
 ✓ REGISTER in progress ...
 ✓ NEXT-ACTION: run 'remoteit add' to add services to this device
```

続けて、以下のコマンドで接続するサービス（アプリケーション）を登録します。

```console
$ sudo remoteit add
```

対話形式で登録できるアプリケーションのリストが表示されます。
Webサービスを登録するので `7` を選びます。（`1`を選べばTCPのアプリケーションを何でも登録できます。）

```
Service Type is not specified or invalid. This is a list of valid service types 

 ID      | Name                | Default Port   | Protocol   | Description               
-------------------------------------------------------------------------------------------
 32770   | WireGuard           | 51820          | UDP        | WireGuard VPN server      
 32771   | Minecraft Bedrock   | 19132          | UDP        | Minecraft Bedrock server  
 5       | RDP                 | 3389           | TCP        | Microsoft remote desktop  
 8       | HTTPS               | 443            | TCP        | Secure web protocol       
 37      | NxWitness           | 7001           | TCP        | Nx Witness VMS            
 43      | Terraria            | 7777           | TCP        | Terraria server           
 38      | Nextcloud           | 443            | TCP        | Nextcloud hub             
 32769   | UDP                 | 0              | UDP        | Generic UDP               
 1       | TCP                 | 0              | TCP        | Generic TCP               
 7       | HTTP                | 80             | TCP        | Web protocol              
 28      | SSH                 | 22             | TCP        | Secure shell terminal     
 34      | SMB/CIFS            | 445            | TCP        | Internet file sharing     
 41      | Minecraft           | 25565          | TCP        | Minecraft server          
 42      | Admin Panel         | 29999          | TCP        | remote.it admin panel     
 4       | VNC                 | 5900           | TCP        | VNC remote desktop        
 39      | OpenVPN             | 1194           | TCP        | OpenVPN server            

Enter Service Type ('ID' or 'Name', not case sensitive, default is 'ssh'): 7
```

接続先のポート番号の入力を求められれますので `80` を入力します。（任意のポート番号に変更している場合は、その番号を入力してください。）

```
Enter Port (default is '80'): 80
```

今度はサービス（アプリケーション）に対して登録する名前を入力します。
アプリケーションかプロトコルが分かるようにするのがお勧めです。ここでは `http` としました。

```
Enter Service Name (default is 'MyService'): http
 ✓ ADD in progress ...
 ✓ NEXT-ACTION: run 'remoteit add' to add more services
```

登録が完了しました。以下のコマンドを実行して、登録状態を確認します。

```
$ sudo remoteit status
```

「Services:」の中に、`http` が `connected` になっていることが確認できます。

```
$ sudo remoteit status
 ✓ Fetching status

Username: your@mail.address

Device:
 UID                        | Name                             | Type              | Status       | Address                 
------------------------------------------------------------------------------------------------------------------------------
 80:00:00:00:01:1B:87:94    |                                  | device            | connected    | 127.0.0.1:65535         


Services:
 UID                        | Name                             | Type              | Status       | Address                  | Enabled  
-----------------------------------------------------------------------------------------------------------------------------------------
 80:00:00:00:01:1B:87:A2    | http                             | HTTP (7)          | connected    | 127.0.0.1                | true     


Connections:
```

続けて、同じ手順を繰り返して、ssh用のサービス（22番ポート）も登録してみました。`SSH` も `connected` になっていることが分かります。

```
$ sudo remoteit status
 ✓ Fetching status

Username: your@mail.address

Device:
 UID                        | Name                             | Type              | Status       | Address                 
------------------------------------------------------------------------------------------------------------------------------
 80:00:00:00:01:1B:87:94    |                                  | device            | connected    | 127.0.0.1:65535         


Services:
 UID                        | Name                             | Type              | Status       | Address                  | Enabled  
-----------------------------------------------------------------------------------------------------------------------------------------
 80:00:00:00:01:1B:87:A2    | http                             | HTTP (7)          | connected    | 127.0.0.1                | true     
 80:00:00:00:01:1B:87:AB    | ssh                              | SSH (28)          | connected    | 127.0.0.1:22             | true     


Connections:
```
これで準備は完了です。

#５.remote.itを使って接続する
####セキュリティグループでポートを全閉じする
AWSのコントロールパネルに戻って、ubuntuサーバのインバウンドポートを全部閉じます。ちょっとドキドキします。
![スクリーンショット 2021-09-27 18.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/50076745-8a27-2fde-91a5-a39aa3fc9624.png)


閉じました。これで世界から遮断されました。Good-bye world!
![スクリーンショット 2021-09-27 18.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/b26dfa98-88e1-3ca5-7c77-38fcc2b12bc4.png)


念のため、ブラウザから `54.248.15.144` へアクセスしますが、応答はありません。（当たり前）
![スクリーンショット 2021-09-27 18.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/13b35865-a551-ba1a-9d00-81697e5bdc7d.png)


当然ですが、sshも遮断され応答がありません。
![スクリーンショット 2019-07-25 19.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/8064d9ee-81d9-ee01-a796-dc80861f295e.png)

**ぜひ `54.248.15.144` にポートスキャンしてみてください:wave:**


####でも接続できます。 remote.itならね。
remote.itのWebポータルにサインインすると、デバイスリストに先ほど登録したubuntuサーバが表示されています。
![スクリーンショット 2021-09-27 18.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/78a047be-722c-535d-1658-7b4c6d9f5a2d.png)


デバイス名をクリックすると、先ほど登録したhttpとsshのサービス名があります。
HTTPの方をクリックすると・・・
![スクリーンショット 2021-09-27 18.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/e657cae0-3900-6ae3-aef1-a9c48a066017.png)


Webサービスにつながりました。（どーん！）
![スクリーンショット 2021-09-27 18.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/2df2d94a-6aab-8ca2-3028-2dbce2d9d73c.png)


同じようにSSHをクリックすると、こちらはURLとポート番号が生成されます。
この接続先を使ってターミナルでSSHコマンドを叩くと・・・
![スクリーンショット 2021-09-27 18.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/d18fde98-e97a-c663-ba19-9039c3d8418e.png)


マジック！ SSHにもつながりました。
![スクリーンショット 2021-09-27 18.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/8c0a5efe-4a66-a0e4-46f4-e2fcae88e95f.png)


#まとめ
ご覧のとおり、remote.itを使うことでサーバはセキュアな状態（というかインターネットから全くアクセスできない）にありながら、自分だけはアクセスすることができるという非常に面白い状態を作り出すことができます。
実は、今回紹介した接続方法は、remote.itがクラウドにホストしているProxyサーバ経由で接続しています。この他にも P2P（Peer-to-Peer）で接続する方法も用意されています。また次の機会に紹介したいと思います。

一度使い方が分かるとかなり便利です。VPNより簡単にセキュアに接続できますので、ぜひ試してみてください！

*2019.8.20追記*
続きを書きました。
> [続・インバウンドポートを全閉したAWSのサーバに接続する方法 〜P2P編〜](https://qiita.com/tkhmhiroc/items/7afe26c945b5e2b9be01)