ポート開放を不要にする最強の仕組みを考えた

福田です。ポートが開放できない、たとえばホテルのWi-Fiなどの環境下でもサーバを構築、外部からもアクセスできるように動かさせようと思っていた場面で思った、最強のポート開放せずにサーバを構築する構想をメモしておきます。まあどのみち一つはポートが開いているサーバを用意しないといけないのですが。

                       

ちなみに既存でありました。

コメント欄で教えていただいたのですが、ngrokというサービスがまんまそのままの機能を実現していました。やる気になればTCPレイヤーから転送できるし、加えてデバッグもできるのでこちらを使うことをお勧めいたします。オープンソースではなさそうなので残念ですが。

OpenVPNなどでiptablesをうまくいじったり、あとはそもそもUPnPとかルーターをいじればいいじゃないの、やらSTUN+WebRTCとかP2Pがあるじゃないの、という話が出てきそうですが許してください。無知は怖し。
また、技術的には可能だと思いますが完成はしていないので具体的な方法については触れていません。悪しからず。

準備

今回はHTTPサーバをポート開放せずに立ててみようというベースで考えています。
まずはポートが閉じられている(別に開いていてもいいのですが)環境下でのサーバを一台。
さらにポートが閉じられている(〃)環境下でのサーバを一台。
そして大事なのがポートが開けられる環境下のサーバを一台。

仕組み

  1. サーバ側が中継サーバにアクセス、仮想ドメインを通知。ドメインは所有権限認証済み(つまり現実のドメインも持っていないといけない)のもののみ受け付け、コネクションIDを生成して返したあと、コネクションのIDとドメインを結んでデータベースへ登録。以降クライアントが来るまで待ち。
  2. クライアント側も中継サーバへアクセス。閲覧したい仮想のドメインを通知。
  3. 中継サーバはドメインからコネクションIDを引いてコネクションIDの回線とクライアントの回線をプログラム上でパイプして繋げる。IPなどは変換される。パケットは一切加工せず届ける。
  4. ハンドオーバーでIP変更があった場合でコネクションが切れたなら、コネクションIDを中継サーバに渡すことで再度接続できる

図に表すと次のような感じになります。

ポート開放をせずにサーバにアクセスする仕組みの図

こんな感じです。単純でしょ?うまくやればTorもどきとかも作れそうです。
この場合はクライアントも専用ソフトが必要になりますが、やる気になればCNAMEなどで中継サーバのFQDNを指定するなどしてブラウザを使うことを可能にさせることもできると思います。

問題点

どこにでも設置できるので勝手に設置してプロキシにしてサイバー犯罪をする人が出る…?ことです。
まあ、これは元からその場所でやっていれば起きることなので変わらない気もします。
なので問題はなし、となります。あとはサーバがいつ接続が切れるかわからない点はこれは仕方がないです。それから、コネクション維持しっぱなしなので負荷が高いです。これも仕方がない。

今後この機能を実験します

とはいえいつになるかわかりませんが、今後この機能を実装したサーバをホテルや学校に設置してアクセスできるか試してみたいと思います。できたらWebにとどまらず各プロトコルやこの機能のセキュア機能やIPアドレス転送などの拡張も実装していく次第です。乞うご期待。多分来年以降になります。
どなたか作ってくださっても…。と思ったら似たようなことを考えている人がいました。
VPN over WebSocket
これを流用すれば似たようなことができる可能性が…?

この記事は最終編集から一年以上経過しております。この記事に書かれた内容をご利用・実践される際は十分ご注意ください。

Sponsored link

“ポート開放を不要にする最強の仕組みを考えた” への2件のフィードバック

  1. Fukuda Takuro より:

    賢いですね
    どうもありがとうございます。近々追記します