IPv6でPath MTU Discovery

おしえてえろいひと!!

HEのIPv6回線からのパケットが通らないのでいろいろと調べてみました。

対象はWebサーバ(Nginx)でサクラのVPS(IPv6有効)からだとWebページが見られるのですが、
HE経由している家からだとPing6は通るのですが、Webページが表示されませんでした。

IPv6 Path MTU in the World and Japan
https://speakerdeck.com/tsahara/ipv6-path-mtu-in-the-world-and-japan

Path MTU Discoveryブラックホール
まさにこれじゃないかと・・・

ちょっと簡単にまとめ
・経路上ではIPv6はフラグメントしてはいけない。
・送信ホストでフラグメントする。
・最小MTUは1280
・サーバ-クライアント、ルータも含め経路の最小MTUを調整しなければならない。
・Path MTU DiscoveryもしくはTCP MSS clampingを使う

それぞれのMTU
自宅HE・・・1280
サクラVPS・・・1280(Debian、w3m -6でチェック)
Webサーバ・・・1500(あとから知ったんですけどね)


さて
通常Ping6だと56Byte。
だということは、最小MTUの1280byteよりも小さいので
特に問題もなくECHOが返ってくる。

さて大きなパケットを投げてみる。

$ ping6 -s 1490 -c 4 -d www.example.net
PING www.example.net(2001:*:*:*::1) 1490 data bytes
From bb.example.com icmp_seq=1 Packet too big: mtu=1280
1498 bytes from 2001:*:*:*::1: icmp_seq=2 ttl=52 time=34.2 ms

一回目に「Packet too big」が出ています。
ただ2回目以降は送信ホスト側でパケットを分割して送ってるのでOK(ということ?)

さてこれをWebサーバとして考えると、
サクラVSP-Webサーバ間でMTU1280(サクラVPS)でやり取りしなければならないですが、
きちんとPath MTU Discovery(もしくはTCP MSS clamping?)出来ているので、
1500byteじゃなくて1280byteで!という情報がやり取り出来ているため、
コンテンツが取得出来ている。

HE-Webサーバ間でも同じくMTU1280(自宅HE)ですが、
どうやらこちらが1280byteだとうまく通知されずに、
Webサーバがそのまま1500byteで返してこようとしてパケットロスしている感じ?

IPv4だと経路でフラグメントできるので、速度低下は起きるけど
タイムアウトなど大きな問題にはならない?

ということで、HEを使う人もいるだろし、
ほかのIPv6回線でも同じようなことが起こる可能性があるので、
サーバ側のMTUを1280固定にしておいたほうが良いみたい。
ただ、インターフェイスが共通の場合、IPv4にも影響が出ます。

[tegaki]難しい・・・[/tegaki]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Enter code * Time limit is exhausted. Please reload CAPTCHA.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください