次元の狭間で(PMTUDブラックホール問題)

 なるほど、正しく通信できなかったのは、

PMTUD(Path MTU Discovery)ブラックホール問題 (RFC2923)

だったのかぁ。

 この問題に対してはRoaring Penguin's PPPoE clientの設定ファイル(pppoe.conf)中の項目“MSS”を設定することで回避できた。 良かった良かった。

□以下経緯である。

 我が家の対外接続はADSLモデムを通して東京めたりっく通信に繋がっているのだが、ADSLモデムに繋がっているマシンにはEthernet NICが二つ搭載してあって、このマシンにNAT/IPマスカレード機能を持たせて家庭内LANへのサービスを行っている。 いわゆるNAT箱っちゅ〜ヤツですな。

← ADSL - | NAT箱 |- Ethernet - | クライアント機 |

こんな環境でクライアント機からあるWebページを見ようとすると全く応答が無いページがたまに存在することがある。 現象としては以下の感じである。

最初はNAT/IPマスカレードの設定が悪いのかと思っていた。 しかし、いくら設定を変えても事態は改善しない。

 とうとうパケットダンプなんてことをして通信の解析をして解ったことは、

先方からのデータ(この場合htmlファイルの内容)がNAT箱にすら届いてない

ということである。 つまりNATの段階でパケット落ちしているわけではなさそうだ。

NATを通すとデータが届かなくて、ADSLに直で通信するとスルスルとデータがやってくる

なぢぇ!?


□以下カラクリである。

 先に答えを書くと、

フラグメント不可パケットに対するICMP DU/FNメッセージが途中で紛失する、もしくは先方が受け付けて無いから

一時期ICMPを悪用したアタックが急増したので、ICMP DU/FN(Destination Unreachable/Fragmentation Needed)を落したい気持ちは解るんだけど、実はコレ、ひどい話なんです。

 TCP/IPには“Path MTU Discovery”(RFC1191)という技術があって、これを使って通信相手のMTUを事前に調べることがある。

ことなどが原因でスループット低下を引き起こすからである。 だから、予め相手のMTUを取得して、そのMTUサイズでパケットを送ってやれば余計な処理や喪失の可能性も減ってスループット向上につながると、まぁこんな狙いがある。

 まんまと相手のMTUが解ったので、極力無駄を避けるために、

IPパケットヘッダにフラグメント不可ビットを立てて送る

ことになるんだけど、ここでNAT箱を介した上の図式のMTUをおさらいしてみると…

← ADSL(MTU:1492) - | NAT箱 |- Ethernet(MTU:1500) - | クライアント機 |

そうなんです、終端のEthernetよりも途中のADSLの方がMTUが小さい(1492 < 1500)

んです。 PPP over Ethernetっちゅ〜くらいで、Ethernetフレーム上にカプセル化するので当たり前といえば当たり前なんだけど、この差が諸悪の根源の一つ。

 つまり、

ADSLの1492バイト大きさの入れ物に1500バイトのモノは入らない

のである。 しかし、ここで、

ICMP DU/FN(Destination Unreachable/Fragmentation Needed)メッセージの登場

フラグメント不可が指定されているので、このメッセージで先方にフラグメントを許可してもらうようにお願いする。 フラグメントが許可されていれば、例え1500バイトの大きさのパケットが来ようが、ここで少なくとも二つのパケットに分割してやれば1492バイト上に通すことができるという寸法。 ところが、このICMPメッセージをルータやホストの設定等で受け付けないようにしているのが諸悪の根源の二つ目。

 結局、

ADSLの入り口のPPPサーバはフラグメントして欲しいと先方に懇願しているのに、そのお願いが届かず、先方は依然大きなパケットサイズのままデータを送ろうとする

ので、手前には一向にデータが届かない、とまぁこんなカラクリがある。

 ちなみに、インターネットでは経路上に異なるMTUのネットワークが存在しても良いことになっている。 したがって、ICMP DU/FNメッセージを受け付けないという設定はかなり反則な行為である。

 この問題のラフな解決法はPath MTU Discovery時にウソのMTUを渡す、これが最初に書いたMSSを設定することなのです。


Generated with
mkdiary.pl

NAKAMURA Yoshiyuki : /PROFILE/BIKE/GUEST BOOK/