Path MTU Discoveryブラックホールの問題解決
その1
TCPを使用した通信に限定した解決方法になりますが、異なるMTU値が定義されたルータにて
適正なMSSサイズを定義することにより、通信のはじめとなる3
way-handshakeの際にルータに
設定されたMSSサイズが送信先に通知される為、送信元で作成されるIPデータグラムがルータ
のMTU値を超えることなく正常に通信することができます。ルータでMTU値を小さく設定していた
しても、自動的にMSS値が調整されてI/Fに適用される分けではないので、MTU値が小さくなる
I/FのルータでこのMSS値を設定することは推奨というより必須です。例えば、以下の設定により
このCiscoルータを通過するTCP SYNパケットのMSSが
[ 960 ] となり、送信先へ通知されます。
| Cisco(config-if)# ip tcp adjust-mss 960 |

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
( type3 code4 ) の
メッセージを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のフィルタリングを実装する場合は、以下のACL101で実装しているように
最低限 [ code3=unreachable ] [ code11=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
|
|