◆ Path MTU Discoveryブラックホールの問題解決 その1
異なるMTU値が定義されたルータ上で適正なMSSサイズを定義することにより、通信開始となる
3 way-handshakeの時に、ルータに設定されたMSSサイズが宛先に通知されるため、送信元で
作成されるIPデータグラムが、ルータのMTU値を超えることなく正常に通信することができます。
ルータ上でMTU値を小さく設定した場合でも、自動的にMSS値が調整されてインターフェースに
適用されるわけではないので、MTU値が小さくなるインターフェースのルータ上でMSS値を設定
することは必須です。以下の設定で、Ciscoルータを通過するTCP SYNのMSSが「1360」となり
宛先へ通知されます。この解決方法が最もポピュラーであり、最適な解決策の設定だと言えます。
Cisco(config-if)# ip tcp adjust-mss 1360 |
◆ Path MTU Discoveryブラックホールの問題解決 その2
DF=1(分割禁止)で受信したIPデータグラムを、着信インターフェース上でDFビットをクリアする
こと(DF=0)によって、ルータ上でフラグメントが可能にすることでも、この問題を解決できます。
ただし着信パケットに対してその都度IPフラグメントを発生させるとスループットが著しく落ちます。
※ 送信元PCによるデータ分割と、ルータでの着信パケットに対するデータ分割とでは負荷が違います。
問題解決 1 の方法でも解決せず、PMTUD Black Holeによって通信できなくなる状態が発生した時の
苦肉の策として使用する手法と言えます。以下はCiscoでroute-mapを使用し DF=0 にする設定例です。
Cisco(config)# interface fastethernet 0/0
Cisco(config-if)# ip policy route-map R-df
Cisco(config)# route-map R-df permit 10
Cisco(config-route-map)# match ip address 101
Cisco(config-route-map)# set ip df 0
Cisco(config)# access-list 101 permit ip any any
|
その他、ネットワーク上でGREトンネリングを実装しているルータのTunnelインターフェース上で
MTU値を1500に上げる手法もありますが、この手法でもルータ上でIPフラグメントが発生します。
ちなみに、Path MTU Discoveryが有効になっているホストでは一般的に全てのTCP/IPパケットに
DFビットが立ちます(DF=1)が、例えばPINGのICMP datagramにはIPでDFビットが立っておらず
WindowsからDFビットを立ててPINGするためには「-f」のパラメータがPINGコマンドで必要です。
◆ ICMP(type3 code4)メッセージの制限
Ciscoルータでは、DoS攻撃に対してCPUを保護するために、送信するICMP(type 3 code 4)の
メッセージを1秒につき2パケット(=500msあたり1パケット)に制限しています。デフォルトで
Ciscoルータでは「ip icmp rate-limit unreachable DF 500」と定義されています。
1秒につき2パケット以上のICMP(type3 code4)メッセージを出す必要のある環境ではこの値を
調整するか、以下のように「no」で打ち消してICMPメッセージの制限を無効にする事もできます。
Cisco(config)# no ip icmp rate-limit unreachable DF |
◆ ICMPのフィルタリング設定について
Path MTU Discoveryが失敗するのは、一般的にICMPのフィルタリング設定が原因とされています。
システム管理者は、ICMPフィルタリングをACLなどで実装する時、特定のICMPのメッセージタイプ
だけのブロックでなく、全てのICMPタイプをブロック(deny icmp any any)する傾向があります。
ICMPのフィルタリング設定を実装する場合は、Cisco機器では以下のACL101で実装しているように
最低限「code3=unreachable」「type11=time-exceed」は、許可することが推奨とされています。
Cisco(config)# access-list 101 permit icmp any any unreachable
Cisco(config)# access-list 101 permit icmp any any time-exceeded
Cisco(config)# access-list 101 deny icmp any any
Cisco(config)# access-list 101 permit ip any any
|
|