コンピュータネットワークにおいて、トンネリングプロトコルとは、あるネットワークから別のネットワークへデータを転送することを可能にする通信プロトコルです。例えば、プライベートな通信をパブリックネットワーク(インターネットなど)経由で送信したり、カプセル化と呼ばれるプロセスを通して、互換性のないネットワーク上で異なるネットワークプロトコルを伝送したりすることができます。
トンネリングは、トラフィックデータを別の形式に再パッケージ化するものであり、場合によっては暗号化が標準となるため、トンネルを通過するトラフィックの性質を隠蔽することができる。
トンネリングプロトコルは、パケットのデータ部分(ペイロード)を使用して、実際にサービスを提供するパケットを伝送することで機能します。トンネリングは、OSIやTCP/IPプロトコルスイートのような階層型プロトコルモデルを使用しますが、ネットワークが通常提供しないサービスをペイロードを使用して伝送する場合、通常は階層構造を無視します。一般的に、配信プロトコルは、階層モデルにおいてペイロードプロトコルと同等またはそれ以上のレベルで動作します。
例えば、トンネリングプロトコルは、IPv4上でIPv6を実行するなど、特定のプロトコルをサポートしていないネットワーク上で、別のプロトコルを実行できるようにする場合があります。
もう一つの重要な用途は、基盤となるネットワークサービスのみを使用して提供することが非現実的または安全でないサービスを提供することです。例えば、物理的なネットワークアドレスが企業ネットワークの一部ではないリモートユーザーに、企業ネットワークアドレスを提供する場合などが挙げられます。
ユーザーは、ファイアウォールが通常ブロックするプロトコルを、ファイアウォールがブロックしないプロトコル(HTTPなど)で「ラップ」して使用することで、トンネリングを利用してファイアウォールを「すり抜ける」こともできます。ファイアウォールポリシーでこの種の「ラップ」が明示的に除外されていない場合、この手法は意図したファイアウォールポリシー(または相互に連動するファイアウォールポリシーのセット)を回避するために機能します。
別の HTTP ベースのトンネリング方式では、HTTP CONNECT メソッド/コマンドを使用します。クライアントは HTTP プロキシに HTTP CONNECT コマンドを発行します。プロキシは特定のサーバー:ポートに TCP 接続を確立し、そのサーバー:ポートとクライアント接続の間でデータを中継します。[ 1 ]これはセキュリティホールとなるため、CONNECT 対応の HTTP プロキシでは、通常 CONNECT メソッドへのアクセスを制限します。プロキシは、HTTPS の場合は 443 など、特定のポートへの接続のみを許可します。[ 2 ]
ネットワークファイアウォールを回避できる他のトンネリング方式では、DNS [ 3 ] MQTT [ 4 ]やSMS [ 5 ]などのさまざまなプロトコルが利用されます。
ネットワーク層の上にネットワーク層を重ねる例として、 IP( IPプロトコル番号47)上で動作するプロトコルである汎用ルーティングカプセル化(GRE )は、RFC 1918で規定されたプライベートアドレスを持つIPパケットを、パブリックIPアドレスを持つ配信パケットを用いてインターネット経由で伝送するために使用されることが多い。この場合、配信プロトコルとペイロードプロトコルは同じだが、ペイロードアドレスは配信ネットワークのアドレスと互換性がない。
データリンク層を使用して接続を確立することも可能です。レイヤ2トンネリングプロトコル(L2TP)を使用すると、2つのノード間でフレームを送信できます。トンネルはデフォルトでは暗号化されていません。セキュリティレベルは、選択されたTCP/IPプロトコルによって決まります。
SSHはポート22を使用して、インターネットなどの公共ネットワーク接続を介して送信されるペイロードのデータを暗号化し、VPN機能を提供します。IPsecはエンドツーエンドのトランスポートモードを備えていますが、信頼できるセキュリティゲートウェイを介したトンネリングモードでも動作可能です。
トンネリングによって課される特定のプロトコルスタックを理解するには、ネットワークエンジニアはペイロードと配信プロトコルの両方のセットを理解する必要がある。
TCPカプセル化ペイロード ( PPPなど) を TCP ベースの接続 (SSH のポート転送など) 上でトンネル化することは「TCP over TCP」として知られており、そうすることで伝送性能が劇的に低下する可能性があり、これは TCP メルトダウン問題として知られています[ 6 ] [ 7 ]そのため、仮想プライベートネットワーク(VPN) ソフトウェアでは、トンネル接続に TCP よりも単純なプロトコルを使用する場合があります。
TCP over TCP 接続のスループットは、内部 TCP と外部 TCP の制御ループが互いに破壊的に干渉するため低下する可能性があります。[ 8 ] [ 9 ] TCP はパケットの順序通りかつ完全な配信を保証するように設計されているため、外部 TCP は接続の状態を内部 TCP から隠蔽します。通常の TCP 動作では、受信側がシーケンス内で欠落したパケットより前に受信したパケットに対して重複ACKで応答すると、パケットの損失が検出されます。これに応じて、送信側は失われたパケットを再送信し、輻輳ウィンドウ(CWND) を半分にします。TCP over TCP では、外部 TCP は再送信と CWND の削減によって失われたパケットを通常どおり処理します。しかし、内部 TCP は接続の遅延を示す情報を受け取っていないため、現在の CWND によって制御されるレートでパケットを送信し続けます。
内部TCPのCWNDが外部TCPのCWNDよりも大きいため、外部TCPの送信バッファは最終的に満杯になります。バッファが肥大化するにつれて、パケットは送信前にキューイング遅延がより長く、変動も大きくなるため、外部TCPの測定ラウンドトリップタイム(RTT)とRTTの変動が増加します。これにより、再送タイムアウト(RTO)も大きくなります。送信バッファが満杯になると、トンネルプロセスは内部TCPのACKを転送できなくなるため、内部TCPは確認応答を全く受信しなくなります。
内部TCPはACKを受信しなくなるため、RTOが期限切れとなり、最も古い未確認セグメントを再送信してRTOを倍増させます。その後、タイムアウトのたびにRTOが倍増し、リセットするためのACKも受信されないため、内部TCPのRTOは指数関数的に増加します。
TCPメルトダウンの結果、外側のTCPはCWNDが著しく減少し、RTOが膨張し、送信バッファが満杯になります。これは、内側のTCPが書き込みできず、ACKが双方向に送信されていないことを示しています。
Secure Shell (SSH) トンネルは、 SSH プロトコル接続を介して作成される暗号化されたトンネルで構成されます。ユーザーは、暗号化されたチャネルを介してネットワーク上で暗号化されていないトラフィックを転送するために、SSH トンネルを設定できます。これは、ネットワークセキュリティに対するソフトウェアベースのアプローチであり、結果として透過的な暗号化が実現します。[ 10 ]
例えば、Microsoft Windows マシンは、暗号化されていないプロトコルであるサーバーメッセージブロック(SMB) プロトコルを使用してファイルを共有できます。インターネット経由でリモートから Microsoft Windows ファイルシステムをマウントした場合、接続を傍受している人は転送されたファイルを見ることができます。Windows ファイルシステムを安全にマウントするには、すべての SMB トラフィックを暗号化されたチャネル経由でリモートファイルサーバーにルーティングする SSH トンネルを確立します。SMB プロトコル自体には暗号化機能はありませんが、そのトラフィックが通過する暗号化された SSH チャネルによってセキュリティが確保されます。
SSH接続が確立されると、トンネルが開始され、リモートホストまたはローカルホスト上のポートでSSHがリッスンします。このポートへの接続はすべて、相手側(前述のとおり、リモートホストまたはローカルホスト)から指定されたアドレスとポートに転送されます。
TCPメルトダウンの問題は、OpenSSH のポート転送を使用する場合、多くの場合問題になりません。これは、多くのユースケースで TCP over TCP トンネルが使用されないためです。メルトダウンは、OpenSSH クライアントがローカルのクライアント側の TCP 接続を処理して実際に送信されるペイロードを取得し、そのペイロードをトンネルの独自の TCP 接続を介してサーバー側に直接送信し、OpenSSH サーバーが同様にペイロードを「アンラップ」して最終宛先にルーティングするために再び「ラップ」するため回避されます。[ 11 ]当然、このラップとアンラップは双方向トンネルの逆方向にも発生します。
SSHトンネルは、特定のインターネットサービスを禁止するファイアウォールを回避する手段を提供します。ただし、サイトが発信接続を許可している場合に限ります。たとえば、組織は、組織のプロキシフィルタを経由せずにインターネットのウェブページ(ポート80)に直接アクセスすることをユーザーに禁止する場合があります(プロキシフィルタは、組織がユーザーがウェブ上で何を見ているかを監視および制御する手段を提供します)。しかし、ユーザーは、組織のプロキシフィルタによってウェブトラフィックが監視またはブロックされることを望まない場合があります。ユーザーが外部のSSHサーバーに接続できる場合、ローカルマシンの特定のポートをリモートウェブサーバーのポート80に転送するSSHトンネルを作成できます。リモートウェブサーバーにアクセスするには、ユーザーはブラウザでローカルポート(http://localhost/)にアクセスします。
SSHクライアントの中には、ユーザーがSOCKS 4/5プロキシを作成できる動的ポートフォワーディングをサポートするものがあります。この場合、ユーザーはアプリケーションを設定してローカルのSOCKSプロキシサーバーを使用できます。これは、前述のように単一ポートへのSSHトンネルを作成するよりも柔軟性が高くなります。SOCKSを使用すると、事前に定義されたリモートポートとサーバーにしか接続できないという制限から解放されます。アプリケーションがSOCKSをサポートしていない場合は、プロキシファクターを使用してアプリケーションをローカルのSOCKSプロキシサーバーにリダイレクトできます。Proxycapなどの一部のプロキシファクターはSSHを直接サポートしているため、SSHクライアントは不要です。
OpenSSHの最新バージョンでは、両端でトンネリング機能が有効になっている場合、レイヤ2またはレイヤ3のトンネルを作成することもできます。これにより、接続の両端にtun(レイヤ3、デフォルト)またはtap(レイヤ2)の仮想インターフェースが作成されます。これにより、通常のネットワーク管理とルーティングが使用可能になり、ルーターで使用する場合は、サブネットワーク全体のトラフィックをトンネリングできます。一対のtap仮想インターフェースは、接続の両端を接続するイーサネットケーブルのように機能し、カーネルブリッジに参加できます。
長年にわたり、トンネリングとデータカプセル化は、保護されたネットワーク外で悪意を持って通信を行う目的で、ごくまれに悪用されてきた。
この文脈では、既知のトンネルには、 HTTP [ 12 ] SSH [ 13 ] DNS [ 3 ] [ 14 ] MQTT [ 4 ]などのプロトコルが含まれます。
TCP転送コードもかなり高速です。質問に事前に答えておくと、sshはTCPをデカプセル化して再カプセル化するため、従来のTCP over TCPの問題は発生しません。