おしえてえろいひと!!
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]