Блокировка XHTTP сразу везде?

Сделал что-то такое: curl -vk -A "mock-chrome-user-agent" -d "name=JohnDoe&age=25" https://my-upload-domain.com/xhttp-path/mock-xhttp-session-id?[1-50]. Кусок лога ниже (и так до конца), насколько могу судить - всё проходит и отрабатывает. Аналогично с главной страницей и др. На данный момент, похоже, Cloudflare по DNS сразу даёт мне незаблоченные IP, так что даже их менять не пришлось.

Все эти запросы видны также на VPS в логах nginx.

Spoiler
* Uses proxy env variable https_proxy == 'http://127.0.0.1:2080/'
*   Trying 127.0.0.1:2080...
* CONNECT: no ALPN negotiated
* Establishing HTTP proxy tunnel to my-upload-domain.com:443
> CONNECT my-upload-domain.com:443 HTTP/1.1
> Host: my-upload-domain.com:443
> User-Agent: mock-chrome-user-agent
> Proxy-Connection: Keep-Alive
>
  % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                 Dload  Upload  Total   Spent   Left   Speed

  0      0   0      0   0      0      0      0                              0< HTTP/1.1 200 Connection established
<
* CONNECT phase completed for HTTP proxy
* CONNECT tunnel established, response 200
* ALPN: curl offers h2,http/1.1
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [1577 bytes data]
* SSL Trust: peer verification disabled
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [1210 bytes data]
* TLSv1.3 (IN), TLS change cipher, Change cipher spec (1):
{ [1 bytes data]
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
{ [19 bytes data]
* TLSv1.3 (IN), TLS handshake, Unknown (25):
{ [1822 bytes data]
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
{ [80 bytes data]
* TLSv1.3 (IN), TLS handshake, Finished (20):
{ [52 bytes data]
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.3 (OUT), TLS handshake, Finished (20):
} [52 bytes data]
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / X25519MLKEM768 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
*   subject: CN=my-domain.com
*   start date: Jun 12 19:05:40 2026 GMT
*   expire date: Sep 10 20:02:03 2026 GMT
*   issuer: C=US; O=Google Trust Services; CN=WE1
*   Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
*   Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
*   Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using sha256WithRSAEncryption
* OpenSSL verify result: 14
*  SSL certificate verification failed, continuing anyway!
* Established connection to 127.0.0.1 (127.0.0.1 port 2080) from 127.0.0.1 port 34094

  0      0   0      0   0      0      0      0                              0* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://my-upload-domain.com/xhttp-path/mock-xhttp-session-id?1
* [HTTP/2] [1] [:method: POST]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: my-upload-domain.com]
* [HTTP/2] [1] [:path: /xhttp-path/mock-xhttp-session-id?1]
* [HTTP/2] [1] [user-agent: mock-chrome-user-agent]
* [HTTP/2] [1] [accept: */*]
* [HTTP/2] [1] [content-length: 19]
* [HTTP/2] [1] [content-type: application/x-www-form-urlencoded]
} [5 bytes data]
> POST /xhttp-path/mock-xhttp-session-id?1 HTTP/2
> Host: my-upload-domain.com
> User-Agent: mock-chrome-user-agent
> Accept: */*
> Content-Length: 19
> Content-Type: application/x-www-form-urlencoded
>
} [19 bytes data]
* upload completely sent off: 19 bytes
} [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [238 bytes data]
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
{ [238 bytes data]
< HTTP/2 400
< date: Sat, 18 Jul 2026 10:57:01 GMT
< content-length: 0
< server: cloudflare
< access-control-allow-origin: *
< x-padding: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
< cf-cache-status: DYNAMIC
< report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=7GsotphX8aRnIEgGBEufqYCABEMxqoafUqtW6QhAabokBMhwhyDM9w2JoDoUqgbyUFsbl5511ZATUwn0fX3QFIQe8ogN8gLD2SpaqNVH4jKmCx%2FOvuPaCD66Am9mrQRtOz%2BM3zXuY9ya"}]}
< nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
< cf-ray: a1d0f68a58120ad6-FRA
< alt-svc: h3=":443"; ma=86400
<
{ [0 bytes data]

100     19   0      0 100     19      0     21                              0
100     19   0      0 100     19      0     21                              0
100     19   0      0 100     19      0     21                              0
* Connection #0 to host my-upload-domain.com:443 left intact
* Uses proxy env variable https_proxy == 'http://127.0.0.1:2080/'
* Reusing existing https: connection with proxy 127.0.0.1
  % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                 Dload  Upload  Total   Spent   Left   Speed

  0      0   0      0   0      0      0      0                              0* [HTTP/2] [3] OPENED stream for https://my-upload-domain.com/xhttp-path/mock-xhttp-session-id?2
* [HTTP/2] [3] [:method: POST]
* [HTTP/2] [3] [:scheme: https]
* [HTTP/2] [3] [:authority: my-upload-domain.com]
* [HTTP/2] [3] [:path: /xhttp-path/mock-xhttp-session-id?2]
* [HTTP/2] [3] [user-agent: mock-chrome-user-agent]
* [HTTP/2] [3] [accept: */*]
* [HTTP/2] [3] [content-length: 19]
* [HTTP/2] [3] [content-type: application/x-www-form-urlencoded]
} [5 bytes data]
> POST /xhttp-path/mock-xhttp-session-id?2 HTTP/2
> Host: my-upload-domain.com
> User-Agent: mock-chrome-user-agent
> Accept: */*
> Content-Length: 19
> Content-Type: application/x-www-form-urlencoded
>
} [19 bytes data]
* upload completely sent off: 19 bytes
} [5 bytes data]
< HTTP/2 400
< date: Sat, 18 Jul 2026 10:57:01 GMT
< content-length: 0
< server: cloudflare
< access-control-allow-origin: *
< x-padding: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
< cf-cache-status: DYNAMIC
< report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=YPT88iJ8sIAgW2MOSWgVqZwVwda%2BLPJGkiRJTSIzDkqhWEqJlpi1CmQDmMoyTQAAsHL5tYuopaFn89xlA7%2BO4H4eF8MGCA2DRHdcM7Mc%2B9mk6FBX6a7PIJLth6U2ZxPkwuPSHJNRkGUu"}]}
< nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
< cf-ray: a1d0f68dfa300ad6-FRA
< alt-svc: h3=":443"; ma=86400
<
{ [0 bytes data]

100     19   0      0 100     19      0     33                              0
100     19   0      0 100     19      0     33                              0
100     19   0      0 100     19      0     33                              0
* Connection #0 to host my-upload-domain.com:443 left intact

И xhttp до сих пор не работает? Вчера вообще на cf были проблемы с POST

Здесь подробнее, если можно. Что за логи, где их смотреть. Это только в платной версии CF? У меня на фри акке нашёл только какое-то trace, но я так понимаю - это не то.

Вариант с такого плана “ddos” не кажется мне слишком вероятным. Сервер фактически персональный и на данный момент используется в одного, к тому же в режиме “только для заблоченного”. По тесту с curl см. выше. Тем не менее, при использовании XHTTP до nginx не проходит даже первый запрос. Т.е. это действительно похоже на “тспу гадит”, и поэтому сразу вызывает много вопросов.

Да, всё так же не работает и запросы не проходят.

Логи клиента, без мусора, где ровно 1 запрос через прокси

curl https://nyaa.si. Ничего особенного в логах нет, просто очень долгий тупняк на N минут, далее timeout в curl. В случае, если DNS тоже пускать через XHTTP (так у меня было исходно), даёт context deadline exceeded для DNS через недолгое время.

2026/07/18 15:04:17.416966 from DNS accepted https://dns10.quad9.net/dns-query [dns-proxy -> direct]
2026/07/18 15:04:17.633595 from 127.0.0.1:53408 accepted //nyaa.si:443 [socks -> xhttp-cdn]

Это лог debug? Отключи системный прокси или tun и используй curl --socks5 127.0.0.1 1.1.1.1

2026/07/18 15:30:53.334074 [Info] [2053350102] proxy/socks: TCP Connect request to tcp:1.1.1.1:80
2026/07/18 15:30:53.334088 [Info] [2053350102] app/dispatcher: taking detour [xhttp-cdn] for [tcp:1.1.1.1:80]
2026/07/18 15:30:53.334091 [Debug] [2053350102] transport/internet/splithttp: XMUX: creating xmuxClient because xmuxClients is empty
2026/07/18 15:30:53.334154 from tcp:127.0.0.1:58302 accepted tcp:1.1.1.1:80 [socks-all-proxy -> xhttp-cdn]
2026/07/18 15:30:53.334162 [Info] [2053350102] transport/internet/splithttp: XHTTP is dialing to tcp:<REDACTED>:443, mode stream-up, HTTP version 2, host my-upload-domain.com
2026/07/18 15:30:53.334165 [Debug] [2053350102] transport/internet/splithttp: XMUX: creating xmuxClient because xmuxClients is empty
2026/07/18 15:30:53.334180 [Info] [2053350102] transport/internet/splithttp: XHTTP is downloading from tcp:<REDACTED2>:443, mode stream-down, HTTP version 2, host my-download-domain.com
2026/07/18 15:30:53.334186 [Debug] [2053350102] transport/internet: dialing to tcp:<REDACTED2>:443

Смотри wireshark. Фильтр ip.addr == cfip, если нету ретрансмитов то отключи tls и смотри что внутри трафика

И больше не обрезай момент сарта ядра и таймаута

Ты определись, или “без мусора”, или “старт не обрезай” и т.п. ) А при таймауте в xray логах ничего дополнительного не писалось - это всё, что есть.

С wireshark попробую, но позже. Спасибо за подсказки.

подумай что нужно чтобы нормально читать лог: лог без мусора это значит что

  1. запуск ядра с debug log
  2. 1 запрос через прокси
  3. ожидание таймаута
  4. остановка ядра

а не как многие, кто любит включать впн для всей системы, в итоге в логе будет сотня запросов и сотня ошибок.
обрезать текст я не просил.

На мегафоне мобильном XHTTP в pucket-up и stream-up скорость 2 мбит/с на загрузку и выгрузку. Аналогичная ситуация с NaiveProxy и TrustTunnel на https. Хотя XHTTP с stream-one работает хорошо. VLESS Reality и Trojan TLS тоже работают хорошо. NaiveProxy и TrustTunnel на QUIC скорость загрузки хорошая, а выгрузки низкая. На билайне мобильном эти же конфигурациии работают хорошо, причем все.

Короче, разобрался. Судя по всему, всё-таки словил блок по SNI на один из доменов, а именно - download, как ни странно. Пока что добавил для него отдельно перенаправление в локальный byedpi на сплит (sockopt.dialerProxy под downloadSettings), после этого заработало.

Edit: Также нашёл способ сделать это без byedpi, через finalMask.tcp->fragment под downloadSettings. Возможно, это лучше, т.к. не зависит от сторонней тулзы, и вроде бы не создаёт много лишних соединений (тогда как byedpi их создаёт заметно больше). Один нюанс: в документации xray не прописано внятно, что для работы данной функции обязательно требуется указать скрытый параметр length (не путать с lengths), причём его значение не должно быть пустым или равно 0.

Причина известна? Весь трафик VPN шел на поддомен download?

На главной панели домена: Security > Analytics, там в Traffic можно смотреть логи, в Events события блокировок. Доступно в бесплатном тарифе, но в нём вроде бы нельзя отключать базовую ddos защиту.

Похоже, там блокнули целиком tld (один не самый известный). На всех сайтах с ним, которые нашел, вижу такой же симптом, как у себя. Это не выглядит как 16-20 блок, данные сразу же никакие не грузятся, соединение висит. Но со стратегией по типу сплита SNI пробивается с ходу, в отличие от того же 16-20.

Спасибо, возможно пригодится в будущем.

Но со стратегией по типу сплита SNI пробивается с ходу, в отличие от того же 16-20.

Так потому что 16-20 это белые списки, а блок домена это черные списки.