7. IPパケット処理
本書は、概念的にはIPリンクであるトンネリングメカニズムを定義する。ただし、リンクはIPルーターに接続されているため、実装は、カーネルなどの別の実装に委任しない場合、IPルーターの責任の一部を処理する必要がある場合がある。
7.1. リンク操作
本書で説明されているIP転送トンネルは、IPv6アドレス指定アーキテクチャの意味での完全な機能を備えた「インターフェース」ではない [IPv6-ADDR]。特に、IPv6リンクローカルアドレスを持っているとは限らない。さらに、そのようなインターフェースではIPv6ステートレス自動構成やルーター広告メッセージは使用されず、近隣探索も使用されない。
HTTP/2またはHTTP/3を使用する場合、クライアントは、IPプロキシ要求への応答を受信する前に、プロキシされたIPパケットの送信を楽観的に開始してもよい(MAY)。ただし、IPプロキシが要求に失敗で応答した場合、またはデータグラムが要求の前にIPプロキシによって受信された場合、それらはIPプロキシによって処理されない可能性があることに注意すること。パケットをトンネル経由で送信できることを知るためにはアドレスとルートを受信する必要があるため、IPプロキシがクライアントが想定したものとは異なるアドレス指定またはルーティング情報を提供することを選択した場合、そのような楽観的なパケットはIPプロキシによって破棄される可能性がある。
複数のプロキシIPパケットが同じ外部パケットにカプセル化される可能性があることに注意すること。たとえば、QUICパケットは複数のQUIC DATAGRAMフレームを運ぶことができるためである。また、DATAGRAMカプセルは複数のQUICまたはTCPパケットに分割できるため、プロキシIPパケットが複数の外部パケットにまたがることも可能である。
7.2. ルーティング操作
このセクションの要件は、一般的なIPルーターに適用される要件の繰り返しであり、ルーティングを外部ソフトウェアに依存するIPプロキシの実装には適用されない場合がある。
エンドポイントがIPパケットを含むHTTPデータグラムを受信すると、パケットのIPヘッダーを解析し、ローカルポリシーチェック(送信元アドレス検証など)を実行し、ルーティングテーブルを確認して送信インターフェースを選択し、そのインターフェースでIPパケットを送信するか、ローカルアプリケーションに渡す。エンドポイントは、受信したパケットを転送する代わりに破棄することを選択することもできる。受信したIPパケットが正当性またはポリシーチェックのいずれかに失敗した場合、IPプロキシに関する限り、それは転送エラーであり、プロトコル違反ではない。セクション7.2.1 を参照。IPプロキシエンドポイントは、転送するIPパケットに追加のフィルタリングポリシーを実装してもよい(MAY)。
逆の方向では、エンドポイントがIPパケットを受信すると、パケットがIPトンネル用にマッピングされたルートと一致するかどうかを確認し、HTTPデータグラム経由でパケットを送信する前に上記と同じ転送チェックを実行する。
IPプロキシエンドポイントが異なるリンク間でIPパケットを転送する場合、カプセル化時にIPホップカウント(またはTTL)を減らすが、カプセル化解除時には減らさない。言い換えれば、ホップカウントは、IPパケットがHTTPデータグラムで送信される直前に減らされる。これにより、ルーティングループが存在する場合の無限ループが防止され、IPsec [IPSEC] での選択と一致する。これは、IPプロキシエンドポイント自体によって生成されたIPパケットには適用されない。
実装者は、受信したIPプロキシインターフェースを超えてリンクローカルトラフィックを転送しないようにする必要がある。IPプロキシエンドポイントは、リンクローカルマルチキャストアドレス宛てのパケットにも適切に応答する必要がある。
IPv6では、すべてのリンクのMTUが少なくとも1280バイトである必要がある [IPv6]。HTTPでのIPプロキシはHTTPデータグラムでIPパケットを伝達し、それらは断片化できないQUIC DATAGRAMフレーム [DGRAM] で送信される可能性があるため、IPトンネルのMTUは、IPプロキシが動作しているQUIC接続のMTUによって制限される可能性がある。これにより、IPv6の最小リンクMTUに違反する状況が発生する可能性がある。ルーターとして動作し、IPv6をサポートするIPプロキシエンドポイントは、IPトンネルリンクMTUが少なくとも1280バイトであることを保証しなければならない(MUST)(つまり、少なくとも1280バイトのペイロードを持つHTTPデータグラムを送信できること)。これは、さまざまな手法を使用して実現できる:
-
両方のIPプロキシエンドポイントが、HTTP仲介者が使用されていないことを確実に知っている場合、エンドポイントは、IPプロキシが実行されている外部QUIC接続のQUIC INITIALパケットをパディングできる。(QUICバージョン1が使用されていると仮定すると、オーバーヘッドは、タイプに1バイト、最大接続ID長に20バイト、最大パケット番号長に4バイト、DATAGRAMフレームタイプに1バイト、最大Quarter Stream IDに8バイト、ゼロコンテキストIDに1バイト、および関連データ付き認証暗号化(AEAD)認証タグに16バイトで、合計51バイトのオーバーヘッドとなり、これはQUIC INITIALパケットを1331バイト以上にパディングすることに相当する。)
-
IPプロキシエンドポイントは、1232バイトのデータを含むICMPv6エコー要求を送信してリンクMTUを確認し、応答を受信しない場合はトンネルを取り壊すこともできる。エンドポイントが前の手法で十分であることを保証する帯域外の手段を持っていない限り、この方法を使用しなければならない(MUST)。エンドポイントがピアのIPv6アドレスを知らない場合、ICMPv6エコー要求をリンクローカル全ノードマルチキャストアドレス(ff02::1)に送信できる。
エンドポイントがIPv6パケットを伝達するためにQUIC DATAGRAMフレームを使用しており、QUIC MTUが低すぎて1280バイトを送信できないことを検出した場合、IPプロキシ要求ストリームを中止しなければならない(MUST)。
7.2.1. エラー通知
IPプロキシエンドポイントは多くの場合、IPパケットを他のネットワークインターフェースに転送するため、転送プロセスでのエラーを処理する必要がある。たとえば、エンドポイントに宛先アドレスへのルートがない場合、ポリシーによって宛先プレフィックスを拒否するように構成されている場合、または送信リンクのMTUが転送されるパケットのサイズよりも小さい場合、転送は失敗する可能性がある。そのようなシナリオでは、IPプロキシエンドポイントは、ICMPパケットを生成し、HTTPデータグラムを使用してそれらを送信することにより、ICMP [ICMP] [ICMPv6] を使用して転送エラーをピアに通知すべきである(SHOULD)。
エンドポイントは、送信するのに最も適切なICMPエラーを自由に選択できる。IPプロキシに関連するいくつかの例を以下に示す:
-
無効な送信元アドレスの場合、コード5「Source address failed ingress/egress policy」(送信元アドレスが入力/出力ポリシーに失敗しました)でDestination Unreachable([ICMPv6] のセクション3.1)を送信する。
-
ルーティング不可能な宛先アドレスの場合、コード0「No route to destination」(宛先へのルートがありません)、またはコード1「Communication with destination administratively prohibited」(宛先との通信が管理上禁止されています)でDestination Unreachable([ICMPv6] のセクション3.1)を送信する。
-
送信リンクのMTU内に収まらないパケットの場合、Packet Too Big([ICMPv6] のセクション3.2)を送信する。
これらのエラーを受信するために、エンドポイントはICMPパケットを受信する準備ができている必要がある。IPプロキシを介してIPフローを開くクライアントなど、エンドポイントがROUTE_ADVERTISEMENTカプセルを送信しない場合、これらのエラーを受信するために、ピアからのプロキシされたICMPパケットを処理すべきである(SHOULD)。ICMPメッセージは、IPプロキシピアの送信元アドレスとは異なる送信元アドレスから発信される可能性があり、スコープが使用されている場合(セクション4.6 を参照)はターゲットの外部からも発信される可能性があることに注意すること。