Pro ověření nastavení používám http://icmpcheckv6.popcount.org/ a všiml jsem si, že mi to teď hlásí chybu s příjmem fragmentů.
Tohle je skvělá služba, tu jsem neznal! Jen na IPv6 nefunguje kontrola fragmentů úplně dobře. Ve Wiresharku příchozí fragmenty vidím, ale spojení skutečně timeoutuje:
$ curl -v -s http://icmpcheckv6.popcount.org/frag -o /dev/null -6
* Expire in 0 ms for 6 (transfer 0x5609092c7610)
* Trying 2a01:7e01::f03c:91ff:fe16:a2e9...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5609092c7610)
* Connected to icmpcheckv6.popcount.org (2a01:7e01::f03c:91ff:fe16:a2e9) port 80 (#0)
> GET /frag HTTP/1.1
> Host: icmpcheckv6.popcount.org
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 17 Feb 2019 16:42:27 GMT
< Content-Type: text/plain; charset=utf-8
< Connection: close
< Transfer-Encoding: chunked
<
{ [14 bytes data]
* Recv failure: Spojení zrušeno druhou stranou
* Closing connection 0
Ve wiresharku to vypadá takhle:
4 0.035154828 JÁ → ONI HTTP 178 GET /frag HTTP/1.1
5 0.067141431 ONI → JÁ TCP 86 80 → 45658 [ACK] Seq=1 Ack=93 Win=28672 Len=0 TSval=2835193871 TSecr=4138280037
6 0.067171239 ONI → JÁ TCP 244 80 → 45658 [PSH, ACK] Seq=1 Ack=93 Win=28672 Len=158 TSval=2835193871 TSecr=4138280037 [TCP segment of a reassembled PDU]
7 0.067196896 JÁ → ONI TCP 86 45658 → 80 [ACK] Seq=93 Ack=159 Win=64896 Len=0 TSval=4138280069 TSecr=2835193871
8 0.126013863 ONI → JÁ IPv6 574 IPv6 fragment (off=0 more=y ident=0xee4e5889 nxt=6)
9 0.126074900 JÁ → ONI ICMPv6 622 Parameter Problem (erroneous header field encountered)
10 0.126106083 ONI → JÁ IPv6 574 IPv6 fragment (off=512 more=y ident=0xee4e5889 nxt=6)
11 0.126119450 JÁ → ONI ICMPv6 622 Parameter Problem (erroneous header field encountered)
12 0.126130690 ONI → JÁ TCP 283 80 → 45658 [ACK] Seq=159 Ack=93 Win=28672 Len=1213 TSval=2835193871 TSecr=4138280037 [TCP segment of a reassembled PDU]
Je vidět, že můj počítač aktivně odmítá hned přijetí prvního fragmentu ICMPv6 chybu
Parameter Problem s podproblémem „erroneous header field encountered“ a offsetem chyby 40, tedy za posledním bajtem IPv6 hlavičky. V hlavičkových souborech Linuxu se o vyslání této chyby stará funkce
icmpv6_param_prob a hodnota „erroneous header field encountered“ je kódovaná definicí
ICMPV6_HDR_FIELD.
Grepování zdrojáků jádra mě dovedlo do
souboru resassembly.c. A k vyvolání této
výjimky dojde v okamžiku, kdy je
přijat fragment kratší než minimální MTU pro IPv6, což je 1280. Protože služba posílá fragmenty délky 512 bajtů, nemůže to s aktuálním Linuxem fungovat nikdy.
Ovšem pokud fragmenty nevidíš ani v tcpdumpu/tsharku/wiresharku, je problém i někde jinde.