このブログ記事ではネットワークにおけるトンネリングについて紹介します。

トンネリングとは、クライアントとサーバー間で、仲介サーバーを介して匿名かつ安全な通信を可能にする手法のことです。 本記事では、いくつかのトンネリングの方法とその用途について説明します。
TCPトンネリング
TCPトンネリングとは、データパケットをTCP接続内にカプセル化することです。外側のTCP接続が仲介サーバーに送信され、 仲介サーバーが外側のTCP接続を通じて送信されたリクエストをデカプセル化し、それを宛先サーバーに転送します。 仲介サーバーはまた、宛先サーバーからのレスポンスをカプセル化し、外側のTCP接続を通じてレスポンスを返送します。
このトンネルを使用することで、ファイアウォールやISPプロキシはクライアントが仲介サーバーとだけ通信していると誤認し、 リモートネットワーク上のブロックされたサービスにアクセスすることが可能になります。 具体的には、TCPトンネリングはブロックされたサービスに接続するトンネルの入り口として、クライアントのローカルポートを使用する、ローカルポートフォワーディングトンネルを確立するために使用されたり、 ローカルサーバーがクライアントのためにトンネルを設定しローカルで実行されているサービスを公開するリバースポートフォワーディングトンネルを確立するために使用されます。
さらに、TCPトンネリングはSOCKSプロキシトンネリング (ダイナミックポートトンネリング)にも使用されます。 この場合、クライアントから行われるすべてのネットワーク接続がリモートサーバーを経由し、 リモートサーバーがクライアントに代わって宛先サーバーにリクエストを送信します。SOCKSはレイヤー5プロトコルであり、 HTTPやSSHなど、TCPを使用するレイヤー5以上のプロトコル(SOCKS5はUDPもサポート)をサポートするため、 任意の高レベルプロトコルを使用した任意の種類のリクエストを行うためのトンネルとして設定できます。 また、ローカルポートフォワーディングとは異なり、SOCKSプロキシでは宛先を直接指定できます。
TCPメルトダウン
TCPトンネリングは一見なんの問題なく動作するように見えますが、1つのTCP接続が別のTCP接続内でカプセル化される場合(TCP-over-TCPトンネリング)、 混雑制御や順序制御のメカニズムに問題が生じます。TCPは、基盤となるプロトコルが信頼できず、パケット順序が保証されないと仮定して混雑制御を行います。 このため、2つのTCP接続が互いに干渉し合い、TCPメルトダウンと呼ばれる現象が発生します。

上記はTCPメルトダウンの例です。パケット#1のようにパケットがデカプセル化およびカプセル化されるのが理想ですが、 パケット#2のように一部のパケットが失われることは避けられません。この場合、内部および外部の両方のTCPアルゴリズムが反応し、 クライアントがパケットを無駄に2回再送信することになります。この反応により、パケット#3のような後続のパケットに連鎖的な影響が生じ、 パケットを失うたびに障害がさらに悪化することがあります。そのため、VPNなどでTCPトンネリングが確立される際には、 通常TCP-over-TCPトンネリングは避けられます。(VPNは通常UDP上のTCPを使用しますが、その詳細はこの記事の範囲外です。)
SSHトンネリング
SSHトンネリングは、パブリックSSHサーバーを使用して、リモートサーバーにアクセスしたり、 リモートサーバーを公開するためにローカルおよびリモートポートフォワーディングを確立します。 しかし、SSHサーバーは通常、TCPメルトダウンの問題を抱えていません。これは、パブリックSSHサーバーがクライアントに代わってリクエストを行うことが多く、 リクエストをカプセル化しないためです。さらに、SSHには暗号化と認証があるため(ネットワーク #6 - SSHで説明)、 トンネリングが比較的安全に行えます。
HTTP CONNECT
HTTP CONNECTは、クライアントとサーバーの間にエンドtoエンドのTCP接続を確立するようプロキシに指示するHTTPメソッドです。 接続が確立されると、プロキシはクライアントとサーバー間のパケットを自動的に中継し、実質的にHTTPトンネルを作成します。 また、TLSハンドシェイクもエンドtoエンドで行われます。これは、TLSフォワードプロキシが2つのハンドシェイクを行い、 2つの別々のシークレットを生成するのとは異なります。この方法は安全で効率的ですが、一部の高度なロードバランシング機能は利用できません。 しかしHTTP CONNECTは、通常のHTTPプロキシが対応していない、WebSocketのようなエンドtoエンドの通信を必要とするプロトコルもサポートできます。
結論
この記事では、TCPトンネリングの仕組み、用途、そしてTCP-over-TCPトンネリングが確立されたときに生じるTCPメルトダウンのリスクについて説明しました。 また、SSHトンネリングがTCPメルトダウンを回避しながら、暗号化と認証を提供しつつ、TCPトンネリングと同じ目的を達成できることも紹介しました。 最後に、HTTP CONNECTについても触れ、クライアントとサーバー間のHTTPトンネルとエンドツーエンド通信を実現する方法を説明しました。 その他にも多くの触れていない話題(SMTP、SOCKS、IPSec、VPNなど)がありますが、この記事とシリーズを通じて、トンネリングの仕組みとネットワークの基礎について理解が深まったことを願っています。
リソース
- Computerphile. 2020. TCP Meltdown - Computerphile. YouTube.
- Nasser, H. 2019. TCP Tunneling Applications Pros and Cons (Explained by Example). YouTube.
- Nasser, H. 2020. SSH Tunneling - Local & Remote Port Forwarding (by Example). YouTube.
- Nasser, H. 2021. How HTTP Tunneling works, The CONNECT method, Pros & Cons and more. YouTube.