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


はじめに

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

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

remote.itを使うと

それができます。
remote.itがどんなサービスかというのは、こちらの@u___skさんの記事で紹介されていますので、併せてご覧ください。

インターネット世界の「どこでもドア」 remote.it

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

1. まずは普通にAWSのサーバを用意する

AWSでサーバを用意する

ubuntuサーバを用意して、apache 2 をインストールしました。(この辺の手順はQiitaに優れた記事がたくさんあると思いますので割愛します。)
また、このサーバのパブリックIP(グローバルIP)が 54.248.15.144 であることが分かります。

セキュリティグループでポートを開ける

Webサーバなので80番を開けました。sshの22番もいったんそのままです。 Hello world!

Webサーバにアクセスしてみる

先ほど確認した 54.248.15.144 にアクセスでき、apacheのデフォルトページが表示されました。(当たり前)

2. remote.itアカウントを作る

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

remote.it

アカウントを作成し、サインインすると以下のようになります。

3. remote.itをインストールする

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

$ 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

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

$ 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アカウントにサインインします。

$ sudo remtoeit signin

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

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

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

$ 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:」の中に、httpconnected になっていることが確認できます。

$ sudo remoteit status
 ✓ Fetching status

Username: [email protected]

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番ポート)も登録してみました。SSHconnected になっていることが分かります。

$ sudo remoteit status
 ✓ Fetching status

Username: [email protected]

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:

これで準備は完了です。

5.remote.itを使って接続する

セキュリティグループでポートを全閉じする

AWSのコントロールパネルに戻って、ubuntuサーバのインバウンドポートを全部閉じます。ちょっとドキドキします。

閉じました。これで世界から遮断されました。Good-bye world!

念のため、ブラウザから 54.248.15.144 へアクセスしますが、応答はありません。(当たり前)

当然ですが、sshも遮断され応答がありません。

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

でも接続できます。 remote.itならね。

remote.itのWebポータルにサインインすると、デバイスリストに先ほど登録したubuntuサーバが表示されています。

デバイス名をクリックすると、先ほど登録したhttpとsshのサービス名があります。
HTTPの方をクリックすると・・・

Webサービスにつながりました。(どーん!)

同じようにSSHをクリックすると、こちらはURLとポート番号が生成されます。
この接続先を使ってターミナルでSSHコマンドを叩くと・・・

マジック! SSHにもつながりました。

まとめ

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

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

2019.8.20追記
続きを書きました。

続・インバウンドポートを全閉したAWSのサーバに接続する方法 〜P2P編〜