Hello,
lately I’ve been noticing ~30s delays upon first visit of some websites hosted on CF and I’ve debugged the issue - it’s because CF is not responding to QUIC request over IPv6, but only for some servers and apparently only for some remote networks.
One such website for example is www.alpinashop.si - traceroute from ISP AS34779, traffic going through CIX (Croatian Internet Exchange):
~]# traceroute -6 -I www.alpinashop.si
traceroute to www.alpinashop.si (2606:4700:3030::6815:30d3), 30 hops max, 80 byte packets
2 2a01-260-1-1--92.core6.t-2.net (2a01:260:1:1::92) 0.707 ms 0.705 ms 0.746 ms
3 2001:7f8:28::31:0 (2001:7f8:28::31:0) 2.721 ms 2.842 ms 2.840 ms
4 2606:4700:3030::6815:30d3 (2606:4700:3030::6815:30d3) 3.094 ms 3.143 ms 3.139 ms
Website sends header over HTTP/2, telling me it supports QUIC:
< alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400, h3-28=":443"; ma=86400, h3-27=":443"; ma=86400
I can easily reproduce the problem by using custom build of curl3 with integrated QUIC support and forcing IPv6 and QUIC protocol:
~]# curl3 -6 --http3 -o /dev/null --verbose https://www.alpinashop.si/
* Trying 2606:4700:3037::ac43:8977:443...
* Connect socket 5 over QUIC to 2606:4700:3037::ac43:8977:443
* Sent QUIC client Initial, ALPN: h3,h3-29,h3-28,h3-27
I can see my sent packets in tcpdump, but I’m not getting anything back:
16:09:08.002425 IP6 2a01:260::xxx.34310 > 2606:4700:3037::ac43:8977.443: UDP, length 1200
16:09:09.001432 IP6 2a01:260::xxx.34310 > 2606:4700:3037::ac43:8977.443: UDP, length 1200
16:09:10.999436 IP6 2a01:260::xxx.34310 > 2606:4700:3037::ac43:8977.443: UDP, length 1200
This only happens with IPv6 and HTTP/3 (udp).
Oddly enough, this is working for www.cloudflare.com, which is taking the same traceroute path as previous example, which signals this might be internal CF issue and not an ISP issue:
~]# curl3 -6 --http3 -o /dev/null --verbose https://www.cloudflare.com/
* Trying 2606:4700::6810:7b60:443...
* Connect socket 5 over QUIC to 2606:4700::6810:7b60:443
* Sent QUIC client Initial, ALPN: h3,h3-29,h3-28,h3-27 * Connected to www.cloudflare.com () port 443 (#0)
* h3 [:method: GET] * h3 [:path: /]
* h3 [:scheme: https]
* h3 [:authority: www.cloudflare.com]
* h3 [user-agent: curl/7.79.1]
* h3 [accept: */*]
* Using HTTP/3 Stream ID: 0 (easy handle 0x55a20e76e180)
> GET / HTTP/3
> Host: www.cloudflare.com
> user-agent: curl/7.79.1
> accept: */*
>
< HTTP/3 200
..
< server: cloudflare
< alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400, h3-28=":443"; ma=86400, h3-27=":443"; ma=86400
<
{ [10695 bytes data]
100 267k 0 267k 0 0 2287k 0 --:--:-- --:--:-- --:--:-- 2304k
* Connection #0 to host www.cloudflare.com left intact
I’ve tested this with two other ISPs and both websites work there, but they’re routed through different internet exchanges (one through BIX.HU and another through DE-CIX).