Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

最大転送単位と最大セグメントサイズ

最終更新 Markdown で表示Agent セットアップ

Cloudflare WAN はトラフィックを追加ヘッダーで包む(カプセル化する)ため、各パケットで元のデータに使える実効的な領域は小さくなります。このオーバーヘッドを考慮しないと、パケットがネットワーク経路に対して大きすぎて、破棄またはフラグメント化されます。その結果、性能低下や接続失敗につながります。このページでは、設定が必要な 2 つの値、最大転送単位(MTU)と最大セグメントサイズ(MSS)を説明します。

MTU と MSS

最大転送単位(MTU) は、ネットワーク接続デバイスが受け入れる最大データパケットを表す値です。MTU はほぼ常に、ネットワーキングの OSI(Open Systems Interconnection)モデルのレイヤー 3 に適用され、TCP(Transmission Control Protocol)、IP(Internet Protocol)などのすべてのヘッダーと、データ(ペイロード)自体を含むパケット全体を対象にします。たとえば、インターネットを経由してルーティングするには、パケットは 1,500 バイトを超えてはなりません。

最大セグメントサイズ(MSS) は、1 つの TCP データグラムパケットで送信できるデータ量を指します。この値は、MTU から IP ヘッダーと TCP ヘッダーのサイズを引いて決め、ルーターにペイロードの上限を伝えます。OSI モデルのレイヤー 4 に適用されます。

MSS / MTU についてよくある誤解は、これらの値を設定すると性能が悪化するというものです。わずかな性能ペナルティはありますが、ネットワークの特性を考慮せずに未設定のままにする方が悪影響は大きいです。

カプセル化

Cloudflare WAN はサービス提供にカプセル化を使うため、この場合に MTU と MSS が重要になる理由も理解しておく必要があります。

カプセル化はパケットにバイトを追加します。Cloudflare がすべてのパケットに新しい IP ヘッダーと(多くの場合)何らかのカプセル化ヘッダーを付けるためです。たとえば IPv4(Internet Protocol version 4)向けの GRE(Generic Routing Encapsulation)では、カプセル化で 24 バイト追加されます。IPv4 ヘッダーが 20 バイト、GRE トンネルヘッダーが 4 バイトです。

GRE カプセル化を行うネットワークインターフェースは、追加されるオーバーヘッドを MTU の削減で吸収する必要があります。MTU の上限は 1,500 バイトなので、IPv4 では MTU は 1,476 バイトになります(元の 1,500 バイトから GRE カプセル化の 24 バイトを引いた値)。この縮小後の MTU が、GRE がカプセル化できる IP パケットの最大サイズです。

フラグメンテーション

データパケットがネットワークインターフェースの受け入れ可能なサイズより大きい場合、ネットワークはパケットを破棄するか、より小さなパケットにフラグメント化する必要があります。フラグメンテーションが発生した場合、Cloudflare は完全に再組み立てできるデータパケットだけを受け入れます。一部のフラグメントが欠けていると、Cloudflare は受信したフラグメントをすべて破棄します。不完全なパケットをお客様へ転送することはありません。

TCP ヘッダーの DF(Do Not Fragment)ビットを 1 にすると、パケットが中間ネットワーク機器の受け入れ可能な MTU より大きい場合、フラグメント化せずに破棄するようネットワークに指示します。ほとんどの TCP 実装は、フラグメンテーションが引き起こす問題を避けるために DF ビットを 1 にします。

フラグメンテーションの問題があり、MSS クランプを設定できない場合、Cloudflare が DF ビットをクリアできます。このオプションを有効にすると、Cloudflare は 1,500 バイトを超えるパケットをフラグメント化し、カプセル化解除後にお客様のインフラストラクチャがパケットを再組み立てします。これは最終手段として使ってください。詳細はアカウントチームにお問い合わせください。

Cloudflare WAN でのフラグメンテーション

サイズ 3,000 バイトの UDP データグラム(UDP ヘッダー 8 バイト + UDP データ 2,992 バイト)を考えます。標準の 1,500 バイト MTU に収めるには、この UDP データグラムは次のように 3 つの IP パケットにフラグメント化されます。

UDP データグラムとその構成要素を示す図。

この UDP データグラムの送信元ポートが 389 で、宛先が Cloudflare WAN のお客様 IP アドレスだとします。あわせて、お客様側に送信元ポート 389 の UDP トラフィックを破棄するファイアウォールルールがあるとします。これは一般的な CLDAP(Connectionless Lightweight Directory Access Protocol) リフレクション攻撃の経路です。

前述の 3 つのパケットフラグメントは Cloudflare に到着しますが、送信元ポート情報を含む UDP ヘッダーがあるのは最初のフラグメントだけです。2 番目と 3 番目のフラグメントには UDP データはありますが、UDP ヘッダー情報はありません。

問題は、これらのフラグメントのうちどれを Cloudflare が破棄し、どれをお客様へ届けるかです。フラグメント化されたパケットの最初の部分だけを破棄すると、残りの部分が DoS(Denial of Service)攻撃中に大量のトラフィックを生成する可能性があります。

Cloudflare がフラグメントを処理する方法

次の図は、前述の例の 3 つの UDP フラグメントが Cloudflare と Cloudflare WAN を通過する流れを示します。要点は次のとおりです。

  • Cloudflare は不完全なパケットをお客様へ送りません: パケットを完全に再組み立てするために必要なすべての部分を Cloudflare が確認できない場合、部分的なデータフラグメントをお客様へ送ることはありません。
  • Cloudflare Network Firewall は個々のフラグメントではなく、完全に再組み立てされたパケットに対して動作します: つまり、UDP / TCP ヘッダー情報に一致するフィルターなどは、最初のフラグメントだけでなく、完全に再組み立てされたパケットに適用されます。Cloudflare は非先頭フラグメントをお客様へ漏らすことはありません。
  • お客様側でもフラグメント化されたパケットを見ることがあります: デフォルト(clear_dont_fragment_bit が未設定)では、Cloudflare はデータをお客様へ送る前に、トンネルに設定した MTU に収まるようパケットをフラグメント化します。パケットが 1,476 バイトより大きい場合、Cloudflare はフラグメント化し、再組み立てのためにお客様へそれらのフラグメントを送ります。

いずれの場合も、Cloudflare はすべてのフラグメントをお客様へ送ります。

Cloudflare がフラグメンテーションを処理する流れを示す図。

MSS クランプ

最大セグメントサイズ(MSS)は、TCP セグメントのサイズを制限する TCP 設定です。3 ウェイハンドシェイク中に SYN パケットがこのオプションを設定します。

デフォルトでは、TCP エンドポイントはローカルネットワークインターフェースの MTU に基づいて MSS 値を設定します。たとえば IPv4 では、MTU が 1,500 バイトなら MSS は 1,460 バイトになります(1,500 バイトから IPv4 ヘッダー 20 バイトと TCP ヘッダー 20 バイトを引いた値)。

MSS は、TCP パケットサイズの挙動を設定するための手段です。TCP エンドポイントが MTU の小さいネットワークの背後にある場合、MSS 値を実際のパス MTU に合わせると、対向のエンドポイントは指定した MTU に収まるパケットを送るようになります。したがって、IPv4 の TCP エンドポイントが MTU 1,476 バイトの GRE トンネルの背後にある場合、TCP SYN パケット内の MSS 値は 1,436 バイトである必要があります。1,476 バイトから IPv4 ヘッダー 20 バイトと TCP ヘッダー 20 バイトを引いた値です。

MSS 設定を変更する 1 つの方法は、ルーターの WAN インターフェース上のネットワークインターフェース MTU をパス MTU に合わせることです。もう 1 つの方法は MSS クランプを適用することです。ルーターなどの中間ネットワーク機器を設定し、パケット通過時に TCP の MSS オプションをその場で変更します。中間ネットワーク機器のインターフェース MTU を変更することは、MSS クランプの適用とは異なり、TCP MSS 値は変わりません。

トンネルの種類に応じた MSS クランプの設定値は、MSS クランプの推奨値 を参照してください。

MSS クランプの推奨値

オフランプとしての GRE トンネル

MSS 値は、ネットワークの構成によって異なります。

  • エッジルーター上: GRE トンネルの内部インターフェース(出力トラフィックが通過する場所)にクランプを適用します。MSS クランプは 1,436 バイトに設定します。トンネル設定後に機器が自動で行う場合もありますが、機器に依存します。

IPsec トンネル

IPsec トンネルでは、指定する値はネットワークの構成によって異なります。MSS クランプの値は GRE トンネルより小さくなります。物理インターフェースが見るのは IPsec で暗号化されたパケットであり、TCP パケットではないため、それらのパケットには MSS クランプが適用されないからです。

  • エッジルーター上: IPsec トンネルの内部インターフェース(出力トラフィックが通過する場所)に適用します。トンネル設定後に機器が自動で行う場合もありますが、機器に依存します。TCP MSS クランプは最大 1,360 バイトに設定します。

役に立ちましたか?