| ライター翻訳版 - January 15, 2004 |
| 機械翻訳版 - August 10, 2005 |
| 英語版 - August 10, 2005 |
| Document ID: 13725 |
目次
概要
前提条件
要件
使用するコンポーネント
表記法
パケットのフラグメント化と ICMP メッセージ
ブロックされた ICMP メッセージ
解決方法
その他の解決方法
関連情報
概要
トラフィックが Generic Routing Encapsulation(GRE; 総称ルーティング カプセル化)トンネルを経由する場合に、Ping コマンドや Telnet は正しく使用できるのに、インターネットのページのダウンロードや File Transfer Protocol(FTP; ファイル転送プロトコル)を使用したファイル転送が行えないことがあります。 この文書では、この問題に共通する原因と、いくつかの回避策について説明します。
前提条件
要件
この文書は、GRE の基本的な理解を必要とします。 GRE の詳細については、次の文書を参照してください。
使用するコンポーネント
この文書は、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。
この文書で使用されるコマンドに関するその他の情報を検索するには、Command Lookup ツール(登録ユーザのみ)を使用してください。
一部ツールについては、ゲスト登録のお客様にはアクセスできない場合がありますことを、ご了承ください。
表記法
文書の表記法の詳細は、「シスコ テクニカル ティップスの表記法」を参照してください。
パケットのフラグメント化と ICMP メッセージ
この文書では、例として次のネットワーク ダイアグラムを使用します。
上記の図では、クライアントからインターネット上のページへのアクセスが要求されると、Web サーバとの間に TCP セッションが確立されます。このプロセスの間、クライアントと Web サーバ間ではそれぞれの Maximum Segment Size(MSS; 最大セグメント サイズ)が通知されます。これにより、TCP セグメントを受け入れられる最大サイズが互いに提示されます。この MSS オプションを受け取ると、各デバイスでは送信できるセグメントのサイズが計算されます。このサイズは Send Max Segment Size(SMSS; 最大送信セグメント サイズ)と呼ばれ、この 2 つの MSS の小さい方のサイズになります。 TCP の最大セグメント サイズについては、「RFC 879
」を参照してください。
説明の都合上、上記の例にある Web サーバは、1500 バイトの長さでパケットを送信できると決定したとします。したがって、サーバはクライアントに対して 1500 バイトのパケットを送信します。そのパケットの IP ヘッダーには、「フラグメントなし」(DF)のビットが設定されています。パケットが R2 に到着すると、このルータではパケットをトンネル パケットにカプセル化しようとします。GRE のトンネル インターフェイスの場合、IP の Maximum Transmission Unit(MTU; 最大伝送ユニット)は、実際の発信インターフェイスの IP MTU より 24 バイト小さくなります。イーサネットの発信インターフェイスの場合では、トンネル インターフェイスでの IP MTU は、1500 - 24、つまり 1476 バイトになります。
R2 では、1500 バイトの IP パケットを 1476 バイトの IP MTU インターフェイスに送信しようとします。 これは不可能であるため、R2 ではそのパケットをフラグメント化する必要があり、1476 バイトのパケット 1 つ(データと IP ヘッダー)と、44 バイトのパケット 1 つ(24 バイトのデータと、新しい IP ヘッダー分の 20 バイト)が生成されます。R2、そして GRE では、両方のパケットをカプセル化し、1500 バイトと 68 バイトのパケットが個別に受け取られるようにします。そして、これらのパケットが実際の発信インターフェイスから発信されます。このインターフェイスは 1500 バイトの IP MTU を備えています。
しかし、R2 で受信されたパケットには DF ビットが設定されていたことを思い出してください。したがって、R2 ではそのパケットをフラグメント化できないため、Web サーバに対してより小さなパケットを送るように指示する必要があります。 これは、Internet Control Message Protocol(ICMP; インターネット制御メッセージ プロトコル)タイプ 3、コード 4 のパケット(Destination Unreachable; Fragmentation Needed and DF set)を送ることで実行できます。この ICMP メッセージには、Web サーバで使用される正確な MTU が含まれています。Web サーバはこのメッセージを受け取り、これに応じて正しいパケット サイズに調整する必要があります。
注: debug コマンドを使用する前に、「デバッグコマンドに関する重要情報」を参照してください。
debug ip icmp コマンドを実行すると、R2 から送られた ICMP メッセージが表示されます。
ICMP: dst (10.10.10.10) frag. needed and DF set unreachable sent to 10.1.3.4
ブロックされた ICMP メッセージ
ICMP メッセージが Web サーバへの経路上でブロックされると、問題が発生します。 この問題が発生すると、ICMP パケットは Web サーバに到達しません。したがって、クライアントとサーバ間のデータの受け渡しができなくなります。
解決方法
次の 4 つの解決方法の 1 つにより、問題は解決します。
-
経路上のどこで ICMP メッセージがブロックされたかを突き止め、それが容認できるかどうかを判断します。
-
クライアントのネットワーク インターフェイスの MTU を 1476 バイトにし、SMSS をより小さくします。その結果、パケットが R2 に到達したときにフラグメントされる必要がなくなります。しかし、クライアントの MTU を変える場合は、そのクライアントとネットワークを共有しているすべてのデバイスの MTU も変更する必要があります。イーサネットのセグメントでは、このデバイスの数が膨大になる場合があります。
-
R2 とゲートウェイ ルータとの間にプロキシサーバ(あるいは、Web キャッシュ エンジン)を設置し、そのプロキシサーバがすべてのインターネット ページに対して要求を出すようにします。
-
1500 バイトにトンネル ヘッダーを加えたよりも MTU が大きいリンク上で GRE トンネルが実行されている場合、もう 1 つの解決法は、GRE のエンドポイント ルータ間にあるすべてのインターフェイスとリンクに対して、MTU を 1524(1500 に GRE のオーバーヘッドとして 24 を加えたもの)に増やすことです。
その他の解決方法
上記の選択肢が実行できないとき、次の選択肢が使える場合があります。
-
ポリシー ルーティングを使用して、IP パケット中の DF ビットをクリアおよび設定します(Cisco IOS(R) リリース 12.1(6) 以降で可能)。
interface ethernet0 ... ip policy route-map clear-df !--- このコマンドは、ルート マップを識別するために使用されます。 !--- インターフェイス上のポリシー ルーティングに対して使用するには、 !--- ip policy route-map コマンドを !--- インターフェイス設定モードで使用します。 route-map clear-df permit 10 match ip address 101 set ip df 0 !--- このコマンドは、IP ヘッダー内のフラグメントなし(DF)ビット値を変更するために使用されます。 !--- このコマンドは、 !--- ルートマップ設定モードで使用します。 access-list 101 permit tcp 10.1.3.0 0.0.0.255 anyこの設定により、データ IP パケットを GRE カプセル化の前にフラグメント化できます。 受信側のエンド ホストでは、このデータ IP パケットを再構成する必要があります。これは通常は問題にはなりません。
-
ルータを通過する SYN パケットの TCP MSS オプションの値を変更します(IOS 12.2(4)T 以降で使用可能)。 これにより、TCP SYN パケットでの MSS オプションの値が小さくなり、ip tcp adjust-mss value コマンドでの値よりも小さくなります。この場合、1436(MTU から IP ヘッダー、TCP ヘッダー、および GRE ヘッダーのサイズを引いた値) になります。 これで、エンド ホストはこの値より大きい TCP/IP パケットを送信しなくなります。
interface tunnel0 ... ip tcp adjust-mss 1436 !--- このコマンドは、ルータを通過する TCP SYN パケットの !--- 最大セグメント サイズ(MSS)を調整するために使用されます。 !--- 最大セグメント サイズは、500〜1460 の範囲です。. -
最後の選択肢は、トンネル インターフェイスでの IP MTU を 1500 に増加することです(IOS 12.0 以降で実行可能)。しかし、トンネル IP MTU が増加すると、トンネル パケットがフラグメント化されます。元のパケットの DF ビットがトンネル パケットのヘッダーにコピーされないからです。このシナリオでは、GRE トンネルの他の終端にあるルータで、GRE ヘッダーを削除して内部のパケットに転送する前に、GRE パケットを再構成する必要があります。IP パケットの再構成は、プロセス交換モードで行われ、メモリを使用します。したがって、この選択肢を使用すると、GRE トンネルでのパケットのスループットが著しく低下する場合があります。
interface tunnel0 ... ip mtu 1500 !--- このコマンドは、インターフェイス上を送信される IP パケットの !--- 最大転送ユニット(MTU)サイズを設定するために使用されます。 設定可能な最小サイズは、 !--- 128 バイトです。最大サイズは、インターフェイス メディアに依存します。
結論として、GRE トンネルを介してインターネットをブラウズできない最も一般的な原因は、上記で述べたフラグメントの問題です。解決策は、上記のいずれかの方法を使用して、ICMP パケットを容認すること、あるいは ICMP 問題を回避することです。
