Edited at

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


はじめに

AWSのサーバに(AWSに限らずですが)インターネット経由で接続する場合、接続したいアプリケーションが待ち受けているポートに対するアクセスを許可する必要があります。Webサーバであれば80番、sshで乗り込みたければ22番といった具合です。

当然これらはインターネットに対して公開されていますので、意図しない人からもアクセスされる可能性があります。(ので、普通は送信元で絞ったり、アプリケーションで認証を要求したりします。)

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


remote.itを使うと

それができます。

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


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



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


AWSでサーバを用意する

ubuntuサーバを用意して、apache 2 をインストールしました。(この辺の手順はQiitaに優れた記事がたくさんあると思いますので割愛します。)

また、このサーバのパブリックIP(グローバルIP)が 13.115.29.34 であることが分かります。


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

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


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

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


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

ubuntuサーバへremote.itをインストールする前にremote.itアカウントを作る必要があります。

remote.itのWebサイトにアクセスし、「Sign up」からアカウントを登録してください。

remote.it - Virtual Private Internet

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


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

ubuntuサーバにsshなどで接続し、以下のコマンドを順に実行してremote.itのパッケージを取得してインストールします。

$ curl -LkO https://raw.githubusercontent.com/remoteit/installer/master/scripts/auto-install.sh

$ chmod +x ./auto-install.sh
$ sudo ./auto-install.sh


4.ubuntuサーバをremote.itのデバイスとして登録する

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

以下のコマンドで登録スクリプトを実行します。

$ sudo connectd_installer

"1" を選んで、先ほど登録したremote.itアカウントでサインインします。

********************* Sign In Menu *********************

1) Sign in to your existing remote.it account
2) Request a code for a new remote.it account
3) Enter a verification code received in e-mail
4) Exit

********************************************************

Choose a menu selection (1 - 4):
1

サインインに成功すると、このubuntuサーバをremote.itに登録するための名前の入力を求められます。

任意の名前を入力します。

Enter a name for your device (e.g. my_Pi_001).

The Device Name identifies your device in the remote.it portal.
Your services will be grouped under the Device Name.

Only letters, numbers, underscore, space and dash are allowed.

test-ubuntu18-web

メインメニューが表示されます。

続けて接続するサービス(アプリケーション)を登録しますので、1 を選びます。

=========================  Installed remote.it Services  ======================

Service Name | Protocol | LAN Address | Port | Application
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Device Name: test-ubuntu18-web Platform: x86_64-ubuntu16.04
Hardware ID: 06:4d:9c:bf:88:98-8qm9ukuR3vZEiCyPeso2

============================ Main Menu ============================

1) Attach/reinstall a remote.it Service to an application
2) Attach/reinstall a remote.it Service to a LAN application
3) Remove a remote.it Service from an application
4) Remove all remote.it Services, then exit
5) Exit

===================================================================
'application' is any TCP service (e.g. SSH, VNC, HTTP, etc.)
running on this device. 'LAN application' is a TCP service
running on another device on this LAN.
===================================================================
Choose a menu selection (1 - 5):
1

登録できるアプリケーションのメニューが表示されます。

Webサービスを登録するので 2 を選びます。(10を選べばTCPのアプリケーションを何でも登録できます。)

*********** Protocol Selection Menu ***********

1) SSH on port 22
2) Web (HTTP) on port 80
3) Secure Web (HTTPS) on port 443
4) VNC on port 5900
5) nxWitness on port 7001
6) Samba (SMB) on port 445
7) Remote Desktop (RDP) on port 3389
8) NextCloud on port 443
9) OpenVPN on port 1194
10) Custom (TCP)
11) Return to previous menu

***********************************************

You can change the port value during install

***********************************************

Choose a menu selection (1 - 11):
2

デフォルトのポート番号(80番)かどうかを確認されますので y を入力します。(変更している場合は n を選ぶことで任意のポート番号を入力できます。)

The default port for Web (http) is 80.

Would you like to continue with the default port assignment? [y/n]
y

今度はサービス(アプリケーション)に対して登録する名前を入力します。

例えば、デバイス名-プロトコル名 のように、どのデバイス(サーバ)のどのサービスか分かるようにすると良いと思います。

Enter a name for this remote.it service (e.g. web-Pi). 

This name will be shown in your remote.it Service List.

Only letters, numbers, underscore, space and dash are allowed.

test-ubuntu18-web-http80

登録が完了してメインメニューに戻ってきました。

メニューの上部に、HTTPOK になっていることが確認できます。

=========================  Installed remote.it Services  ======================

Service Name | Protocol | LAN Address | Port | Application
-------------------------------------------------------------------------------
test-ubuntu18-web-http80 | HTTP | localhost | 80 | OK
-------------------------------------------------------------------------------
Device Name: test-ubuntu18-web Platform: x86_64-ubuntu16.04
Hardware ID: 06:4d:9c:bf:88:98-8qm9ukuR3vZEiCyPeso2

============================ Main Menu ============================

1) Attach/reinstall a remote.it Service to an application
2) Attach/reinstall a remote.it Service to a LAN application
3) Remove a remote.it Service from an application
4) Remove all remote.it Services, then exit
5) Exit

===================================================================
'application' is any TCP service (e.g. SSH, VNC, HTTP, etc.)
running on this device. 'LAN application' is a TCP service
running on another device on this LAN.
===================================================================
Choose a menu selection (1 - 5):

続けて、同じ手順を繰り返して、ssh用のサービス(22番)も登録してみました。SSHOK になったことが分かります。

=========================  Installed remote.it Services  ======================

Service Name | Protocol | LAN Address | Port | Application
-------------------------------------------------------------------------------
test-ubuntu18-web-http80 | HTTP | localhost | 80 | OK
test-ubuntu18-web-ssh22 | SSH | localhost | 22 | OK: sshd
-------------------------------------------------------------------------------

これで準備は完了です。5 を選んで終了します。

============================ Main Menu ============================

1) Attach/reinstall a remote.it Service to an application
2) Attach/reinstall a remote.it Service to a LAN application
3) Remove a remote.it Service from an application
4) Remove all remote.it Services, then exit
5) Exit

===================================================================
'application' is any TCP service (e.g. SSH, VNC, HTTP, etc.)
running on this device. 'LAN application' is a TCP service
running on another device on this LAN.
===================================================================
Choose a menu selection (1 - 5):
5


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


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

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

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

念のため、ブラウザから 13.115.29.34 へアクセスしますが、タイムアウトします。(当たり前)

当然ですが、sshも遮断されました。

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


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

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

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

HTTPの方をクリックすると・・・

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

同じようにSSHをクリックすると、こちらはURLとポート番号が生成されます。

この接続先を使ってターミナルでSSHコマンドを叩くと・・・

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


まとめ

ご覧のとおり、remote.itを使うことで非常にセキュアな状態(というかインターネットから全くアクセスできない)でありながら、自分だけはアクセスすることができるという非常に面白い状態を作り出すことができます。

実は、今回紹介した接続方法は、remote.itがクラウドにホストしているサーバ経由で接続しています。この他にも Peer-to-Peer で接続する方法も用意されています。また次の機会に紹介したいと思います。

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

2019.8.20追記

続きを書きました。


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