Помощь с настройкой проксирования через CDN (Websocket / gRPC)

Выходит, эти сертификаты для сервера и CDN, а про прямое подключение ничего не говорится.

Смотря что используется для прямого. Если маскировка под какой-то другой сайт (security reality), то там вообще ни свой домен ни вебсервер не участвуют, за исключением случая маскировки под собственный домен (steal from yourself). Если просто vision (security tls), то нужны сертификаты let’s encrypt.

Глядя на это

127.0.0.1 - - [14/May/2024:00:43:45 +0300] “GET /XXXXX HTTP/1.1” 101 4 “-” “Go-http-client/1.1” “-”

то возможно и зря с сертификатами мучаемся, нужно смотреть логи xray

В nekobox есть такое окошко, может туда чего прописать? Просто скопировать ключ из самоподписного сертификата завершается множественными ошибками.

Не знаю, если честно, для какого случая там это окошко. Может и правда для самоподписанных сертификатов

Вот, достал:

May 14 03:04:34 xray[639]: 2024/05/14 03:04:34 127.0.0.1:0 rejected  proxy/vless/encoding: failed to read request version > websocket: close 1000 (normal)
May 14 03:04:34 xray[639]: 2024/05/14 03:04:34 [Info] [3941384672] proxy/vless/inbound: firstLen = 0
May 14 03:04:34 xray[639]: 2024/05/14 03:04:34 [Info] [3941384672] app/proxyman/inbound: connection ends > proxy/vless/inbound: invalid request from 127.0.0.1:0 > proxy/vless/encoding: failed to read request version > websocket: close 1000 (normal)

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

Могу посоветовать лишь проверить еще раз внимательно все настройки, как nginx, так и xray клиента и сервера.

Указывал ли CNAME, как было сказано в статье? Может быть где-то на сайте GCore можно увидеть, прошел ли через ее cdn трафик?

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

В двух словах, о чём ошибка то?

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

А, ну да :slightly_smiling_face:

В двух словах, о чём ошибка то?

Я тут могу сделать только грубое предположение, что при firstLen = 0, данных, как таковых, не долетает до xray, что странно.
nginx мы проверили, скрин nekoray тоже был.
На всякий случай неплохо было бы взглянуть на конфиг xray, хотя я сомневаюсь, что в нем дело.
Эксперимента ради можешь попробовать соединиться с клиента голого xray, чтобы точно никакие косяки настроек neko не были проблемой. Вот пример конфига:

{
  "log": {
    "loglevel": "info"
  },
  "dns": {
    "servers": [
      "https://1.1.1.1/dns-query"
    ],
    "queryStrategy": "UseIPv4"
  },
  "routing":
  {
    "domainStrategy": "IPIfNonMatch",
    "domainMatcher": "hybrid",
    "rules": [
      {
        "type": "field",
        "protocol": ["bittorrent"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": [
          "geosite:category-gov-ru",
          "domain:ru",
          "domain:by",
          "domain:su",
          "domain:xn--p1ai", // рф
          "domain:xn--80aswg", // сайт
          "domain:xn--c1avg", // онлайн
          "domain:xn--80asehdb", // москва
          "domain:xn--90ais" // бел
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:ru",
          "geoip:private",
          "geoip:by"
        ],
        "outboundTag": "direct"
      }
    ]
  },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 2080,
      "protocol": "socks",
      "settings": {
        "udp": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "адрес",
            "port": 443,
            "users": [
              {
                "id": "ид",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "path": "/путь?ed=2048"
        },
        "tlsSettings": {
          "allowInsecure": false,
          "serverName": "домен",
          "fingerprint": "firefox"
        }
      },
      "tag": "proxy"
    },
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

соответственно, в конфие нужно сделать четыре замены - адрес, путь и домен и ид, они там подписаны по-русски.
Пусть тебя не смущает роутинг, он чисто для проверки работоспособностине помешает.
Запускать xray -c conf_name.json
Также, как и neko, откроет socks прокси на порту 2080.

Получилось настроить, так что всем спасибо за поддержку и общий вклад в развитие свободного интернета! :sun_with_face: :earth_africa:

Во-первых, ошибка в той статье на хабре по которой настраивал, ssl в /etc/nginx/conf.d/default.conf указывать обязательно, автор почему-то убрал это из финальных конфигураций:

listen 127.0.0.1:8444 ssl so_keepalive=on;
        http2 on;

Ну и во-вторых, с версии Xray-core v1.8.10 обновилось переключение HTTPUpgrade:

Теперь добавьте после пути HTTPUpgrade ?ed=2560, чтобы включить 0-RTT.
В дальнейшем рекомендуется заполнять 2560 вместо 2048 для WebSocket ed.

Подсмотрел в примерах конфигурации, значения earlydata length и earlydata name не заполняются, как ни странно. Прикреплю скриншот с которым у меня всё работает:

Это кажется действительно факап автора, там “ssl” обязательно должно быть, да.

HTTPUpgrade и WS это чуть-чуть разные вещи. WS это настоящие вебсокеты, а у HTTPUpgrade только заголовок “Upgrade” от вебсокетов, а дальше данные шлются как есть. WS совместим со всем, а HTTPUpgrade работает быстрее, но не везде (через GCore кстати работает), и пока что поддерживается не всеми клиентами (большинство мобильных его пока не умеет).

А что до earlydata - это просто оптимизации (более быстрый хендшейк), отсутствие этих параметров на успешность соединения никак не влияет. Можете прописать там 2560 тоже.

Я уже попробовал :snowman: Если прописать что-то отличное от 0 в earlydata length - работать не будет :exclamation:
Причём, Sec‑Websocket‑Protocol в earlydata name уже никак не влияет соединение, может работать и без него.

Ну понятно что если length стоит 0, то второй параметр уже не важен, т.к. фича отключена.
А вот то что с 2560 и “Sec-Websocket-Protocol” не работает это очень странно. У меня работает.

Кстати, если у вас в планах пользоваться именно вебсокетами, то в Nekobox лучше переключить ядро на Xray (он станет Nekoray). Там не надо заполнять отдельно эти два поля для early data, XRay-ядро автоматически их подхватит по параметру ?ed= в урле. А во-вторых, там можно включить мультиплексирование (у sing-box’а mux не совместим с xray), что в некоторых случаях сильно ускоряет хендшейки и затрудняет детектирование со стороны

Т. е. не во всех случаях лучше использовать xray ядро? Автор тех статей показывает примеры на ядре sing-box, может из-за того что маршруты не работают иначе?

У Sing-box немного выше производительность для ShadowSocks, а ещё он поддерживает Hysteria, других особых преимуществ не вижу.

Насколько я помню, в то время, когда выходили эти статьи, Nekoray ещё не имел в себе XRay, а вместо него был древний V2Ray в котором не было многого нужного, отсюда и совет.

Отлично, тогда конечно надо пересесть на xray ядро, да к тому же отсутствие мультиплекса раздражает долгими подключениями, спасибо за дельный совет! :grinning: :+1:

Я уже попробовал :snowman: Если прописать что-то отличное от 0 в earlydata length - работать не будет :exclamation:
Причём, Sec‑Websocket‑Protocol в earlydata name уже никак не влияет соединение, может работать и без него.

Работает. Там просто неочевидный финт, что надо и ?ed=… и earlydata length и Sec‑Websocket‑Protocol.

Т. е. не во всех случаях лучше использовать xray ядро? Автор тех статей показывает примеры на ядре sing-box, может из-за того что маршруты не работают иначе?

Вот меня тоже смутило, чем так sing-box хорош, что автор советовал его. Кроме упоминания где-то в комментариях возможности прокидывания ssh, других преимуществ не удалось нагуглить.

Достаточно только в клиенте включить mux, а сервер сам подхватит эту настройку?

Маршруты настроил, но вот правила с доменами, в которых есть ключевые слова, не фурычат и символ * не помогает, это конечно не важно, но случаем не знаете как правильно их вбивать?

Будем надеется в следующих версиях SSH добавят.

В итоге я перешёл на ядро xray. Заметил небольшие недоработки: изредка комп чуть подтормаживал; окно taskkill вылетало при перезагрузке клиента; при включённом режиме tun и незапущенном сервере выход в инет блокируется, но текущие соединения не прерываются. В общем, пользоваться можно.

Вот тут расписано: Routing | Project X (xtls.github.io). То, что вы вписываете в окошко, клиент подсовывает в поле “domain” в конфиге

Спасибо! :+1: