トラフィックが Generic Routing Encapsulation(GRE)トンネルを通過する場合に、ping コマンドや Telnet は正しく使用できるのに、インターネットのページのダウンロードや File Transfer Protocol(FTP)を使用したファイル転送を実行できないことがあります。 このドキュメントでは、この問題の一般的な原因と、いくつかの回避策について説明します。
この文書は、GRE の基本的な理解を必要とします。GREの詳細については、次のドキュメントを参照してください。
このドキュメントの内容は、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。
このドキュメントで使用されているコマンドの詳細を調べるには、コマンド検索ツール(登録ユーザ専用)を使用してください。
ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。
このドキュメントでは、例として次のネットワークダイアグラムを使用します。
上記の図では、クライアントからインターネット上のページへのアクセスが要求されると、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 サーバに対してより小さなパケットを送るように指示する必要があります。これは、インターネット制御メッセージプロトコル(ICMP)タイプ3コード4パケット(宛先到達不能;Fragmentation Needed and DF set)。 この ICMP メッセージには、Web サーバで使用される正確な MTU が含まれています。Web サーバはこのメッセージを受け取り、これに応じて正しいパケット サイズに調整する必要があります。
注: debug コマンドを使用する前に、「デバッグ コマンドの重要な情報」を参照してください。
R2から送信されたICMPメッセージを表示するには、debug ip icmpコマンドを有効にします。
ICMP: dst (10.10.10.10) frag. needed and DF set unreachable sent to 10.1.3.4
ICMP メッセージが Web サーバへの経路上でブロックされると、問題が発生します。この場合、ICMPパケットはWebサーバに到達しないため、クライアントとサーバの間でデータが渡されなくなります。
次の4つのソリューションのいずれかを使用して、問題を解決できます。
経路上のどこで ICMP メッセージがブロックされたかを突き止め、それが容認できるかどうかを判断します。
クライアントのネットワークインターフェイスのMTUを1476バイトに設定し、SMSSを強制的に小さくします。そのため、パケットがR2に到達したときにフラグメント化される必要はありません。ただし、クライアントのMTUを変更する場合は、このクライアントとネットワークを共有するイーサネットのセグメントでは、このデバイスの数が膨大になる場合があります。
R2 とゲートウェイ ルータとの間にプロキシサーバ(あるいは、Web キャッシュ エンジン)を設置し、そのプロキシサーバがすべてのインターネット ページに対して要求を出すようにします。
1500 バイトにトンネル ヘッダーを加えたよりも MTU が大きいリンク上で GRE トンネルが実行されている場合、もう 1 つの解決法は、GRE のエンドポイント ルータ間にあるすべてのインターフェイスとリンクに対して、MTU を 1524(1500 に GRE のオーバーヘッドとして 24 を加えたもの)に増やすことです。
上記のオプションが使用できない場合は、次のオプションが役立ちます。
ポリシールーティングを使用して、データIPパケットのDFビットをクリアして設定します(Cisco IOS®ソフトウェアリリース12.1以降で使用可能)。
interface ethernet0 ... ip policy route-map clear-df !--- This command is used to identify a route map !--- to use for policy routing on an interface, !--- use the ip policy route-map command in !--- interface configuration mode. route-map clear-df permit 10 match ip address 101 set ip df 0 !--- This command is used to change the Don't Fragment (DF) !--- bit value in the IP header, use this command !--- in route-map configuration mode. 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 !--- This command is used to adjust the maximum segment size (MSS) !--- value of TCP SYN packets going through the router. !--- The maximum segment size is in the range from 500 to 1460.
最後のオプションは、トンネルインターフェイスのIP MTUを1500(IOS 12.0以降で使用可能)に増やすことです。 しかし、トンネル IP MTU が増加すると、トンネル パケットがフラグメント化されます。元のパケットの DF ビットがトンネル パケットのヘッダーにコピーされないからです。このシナリオでは、GRE トンネルの他の終端にあるルータで、GRE ヘッダーを削除して内部のパケットに転送する前に、GRE パケットを再構成する必要があります。IP パケットの再構成は、プロセス交換モードで行われ、メモリを使用します。したがって、この選択肢を使用すると、GRE トンネルでのパケットのスループットが著しく低下する場合があります。
interface tunnel0 ... ip mtu 1500 !--- This command is used to set the maximum transmission unit (MTU) !--- size of IP packets sent on an interface. The minimum size !--- you can configure is 128 bytes; the maximum depends on the interface medium.
結論として、GRE トンネルを介してインターネットをブラウズできない最も一般的な原因は、上記で述べたフラグメントの問題です。解決策は、上記のいずれかの方法を使用して、ICMP パケットを容認すること、あるいは ICMP 問題を回避することです。
改定 | 発行日 | コメント |
---|---|---|
1.0 |
10-Aug-2005 |
初版 |