Skip to content

Custom sessionID#6258

Open
Fangliding wants to merge 4 commits into
mainfrom
xhttp-sessionid
Open

Custom sessionID#6258
Fangliding wants to merge 4 commits into
mainfrom
xhttp-sessionid

Conversation

@Fangliding

Copy link
Copy Markdown
Member

基本是 #6251#6253 的修正版本
支持range设定 自定义table 三个预定义table base62 hex 大写hex(写作HEX)

@Fangliding

Copy link
Copy Markdown
Member Author

还有修了一下语法检查飙警告

@ghost

ghost commented Jun 3, 2026

Copy link
Copy Markdown

lets see

@ghost

ghost commented Jun 3, 2026

Copy link
Copy Markdown

the issue with this entire thing is, if we're going to use query it still can be detected, param=string&param2=digits, i guess we're being forced to get back into header mode which is retarded in the first place, you should allow us also append params in query string, the same way you do with "headers"

@Fangliding

Copy link
Copy Markdown
Member Author

跟这个patch无关 其余部分不是我设计的

@ghost

ghost commented Jun 3, 2026

Copy link
Copy Markdown

ik its not related to this pr, but awaiting a month until another detection gets in a way is one of our concerns, try adding more options in the next pr to cover that too, considering we've got extra: headers{ why not have extra: {queries:... append:{ prepend:{

@byhexdev

byhexdev commented Jun 4, 2026

Copy link
Copy Markdown

WE ARE BEGGING APPROVE THIS PULL REQUEST🗣️🗣️🗣️🗣️🗣️🗣️

@Katze-942

Copy link
Copy Markdown
Contributor

I tested this, and it really does help bypass a CDN that started blocking requests based on UUID-like session IDs.

Looking forward to the merge.

Maolaohei added a commit to Maolaohei/Bray-Core that referenced this pull request Jun 4, 2026
…imes)

XTLS#6258 — XHTTP Custom sessionID:
- sessionIDTable: base62 / hex / HEX / 自定义 ASCII 表
- sessionIDLength: RangeConfig 控制长度
- GenerateSessionID() 替代 uuid.New().String()

XTLS#4231 — Mux cool maxReuseTimes:
- mux ClientStrategy 支持 MaxReuseTimes 替代固定 128
- 默认 60000,可通过 maxReuseTimes 配置下调
- outbound handler 传递配置到 mux 策略
@saberkovich

Copy link
Copy Markdown

NEED TO MERGE PLEASE IM DYING
папич-arthas

@itzice1337

Copy link
Copy Markdown

MERGE 😭

@Antony1381

Copy link
Copy Markdown

​Please merge this 🙏
CDNs are currently blocking xhttp due to the detectable UUID pattern. This fix is highly needed.

@Empower-art

Copy link
Copy Markdown

Please merge this 🙏

@ilyasovalbert

Copy link
Copy Markdown

Please merge this 🙏 We need this feature

@saberkovich

Copy link
Copy Markdown

merge or gay

@kirillgureviry

Copy link
Copy Markdown

⚡Учёные наконец-то описали редкий феномен: чем больше у человека вайтлист-серверов, тем заметнее тает его способность к связной мысли. Поначалу звучит как вброс с сомнительного паблика, но, глядя на комментарии выше, начинаешь верить в науку.

@FuriousWarrior

Copy link
Copy Markdown

Please merge this 🙏 We need this feature

@euppi98

euppi98 commented Jun 6, 2026

Copy link
Copy Markdown

⚡Учёные наконец-то описали редкий феномен: чем больше у человека вайтлист-серверов, тем заметнее тает его способность к связной мысли. Поначалу звучит как вброс с сомнительного паблика, но, глядя на комментарии выше, начинаешь верить в науку.

Честно говоря не понятно что вы имели в виду?

@hxehex

hxehex commented Jun 6, 2026

Copy link
Copy Markdown

Merge or you will get a free oreshnik missile ride

@ElDrako32

Copy link
Copy Markdown

Поставил я xray с этими правками, прописал в config sessionIDTable и sessionIDLength, но в запросах по логам nginx всё равно Uuid содержит "-".
Как правильно настраивать теперь надо?

@belotserkovtsev

Copy link
Copy Markdown

the issue with this entire thing is, if we're going to use query it still can be detected, param=string&param2=digits, i guess we're being forced to get back into header mode which is retarded in the first place, you should allow us also append params in query string, the same way you do with "headers"

@ghost #6282 - it randomizes the request path per request from an operator-supplied list (pathPool), so with session/seq in cookies there's no fixed path or query pattern left to match. and query/header append could be the next step

@belotserkovtsev

Copy link
Copy Markdown

param=string&param2=digits shape only shows up if you keep session/seq in the query. you're not stuck with header mode though. cookie placement keeps both out of the URL completely, so there's no query pattern to match. #6282 then randomizes the request path per request from an operator list, so the fixed path isn't a tell either. With those two, query-param padding isn't really needed, and it tends to become its own signature anyway

@ivanvolkovd

Copy link
Copy Markdown

Поставил я xray с этими правками, прописал в config sessionIDTable и sessionIDLength, но в запросах по логам nginx всё равно Uuid содержит "-". Как правильно настраивать теперь надо?

"xhttpSettings": {
    "path": "api",
    "sessionIDTable": "alphabet",
    "sessionIDLength": 20,
    ...
}

Вижу, отправляются запросы вида:
https://example.com/api/viphfxwvtsyphuzhxfcj/0
https://example.com/api/mhsocbksgochkvpihumh/0
https://example.com/api/zhjzueizffmqebvdfnbx/0

@ElDrako32

Copy link
Copy Markdown

Вижу, отправляются запросы вида:
https://example.com/api/viphfxwvtsyphuzhxfcj/0
https://example.com/api/mhsocbksgochkvpihumh/0
https://example.com/api/zhjzueizffmqebvdfnbx/0

Тогда подскажите, пожалуйста, что я делаю не так?
Переключился на brach xhttp-sessionid

Xray-core> git status
On branch xhttp-sessionid
Your branch is up to date with 'origin/xhttp-sessionid'.

nothing to commit, working tree clean

Собрал, заменил xray на сервере и клиенте под виндовс.
В конфиге сервера:

        "streamSettings": {
            "network": "xhttp",
            "security": "none",
            "sockopt": {
                "mark": 128, "tcpFastOpen": false, "dialerProxy": "fragment",
                "trustedXForwardedFor": ["X-Code"]
            },
            "xhttpSettings": {
                    "path": "/api/",
                    "mode": "packet-up",

                    "xPaddingObfsMode": true,
                    "xPaddingMethod": "tokenish",
                    "xPaddingPlacement": "query",
                    "xPaddingHeader": "api_v1",
                    "xPaddingKey": "xss",
                    "seqKey": "id",
                    "seqPlacement": "query",
                    "xPaddingBytes": "100-1000",
                    "sessionKey": "auth",
                    "sessionPlacement": "path",
                    "uplinkChunkSize": 280,
                    "uplinkDataKey": "X-Ver",
                    "uplinkDataPlacement": "header",
                    "uplinkHTTPMethod": "GET",
                    "scStreamUpServerSecs": "20-80",
                    "noSSEHeader": true,
                    "sessionIDTable": "alphabet",
                    "sessionIDLength": "20"
            }
      }

На клиенте:

 "outbounds": [
        {
            "protocol": "vless",
            "settings": {
                "vnext": [
                    {
                        "address": "domain",
                        "port": 443,
                        "users": [
                            {
                                "encryption": "none",
                                "flow": "xtls-rprx-vision",
                                "id": "_id_"
                            }
                        ]
                    }
                ]
            },
            "streamSettings": {
                "network": "xhttp",
                "security": "tls",
                "tlsSettings": {
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "fingerprint": "randomized",
                    "serverName": "domain"
                },
                "xhttpSettings": {
                    "extra": {
                        "noSSEHeader": false,
                        "seqKey": "id",
                        "seqPlacement": "query",
                        "sessionKey": "auth",
                        "sessionPlacement": "path",
                        "uplinkChunkSize": 280,
                        "uplinkDataKey": "X-Ver",
                        "uplinkDataPlacement": "header",
                        "uplinkHTTPMethod": "GET",
                        "xPaddingBytes": "100-1000",
                        "xPaddingHeader": "api_v1",
                        "xPaddingKey": "xss",
                        "xPaddingMethod": "tokenish",
                        "xPaddingObfsMode": true,
                        "xPaddingPlacement": "query",
                        "xmux": {
                            "cMaxReuseTimes": "0",
                            "hKeepAlivePeriod": 0,
                            "hMaxRequestTimes": "300-600",
                            "hMaxReusableSecs": "900-1800",
                            "maxConnections": "8"
                        }
                    },
                    "headers": {
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36",
                        "X-Code": "daadf769eqadf"
                    },
                    "host": "domain",
                    "mode": "packet-up",
                    "path": "/api/",
                    "sessionIDLength": 20,
                    "sessionIDTable": "alphabet"
                }
            },
            "tag": "proxy"
        },

В логах nginx:
[07/Jun/2026:12:53:48 +0300] "GET /api/b1a9d139-0353-4435-984c-4fc8d0f03aca?xss=GWfdx9WRH5cUrX43vlTNelNsdXnk90YN77TOGd06zBO56WHqTeuCN59KtufCCijQDfC182pxgx1Vs

@ivanvolkovd

Copy link
Copy Markdown

Тогда подскажите, пожалуйста, что я делаю не так? Переключился на brach xhttp-sessionid

Причина в том, как обрабатывается extra:

if c.Extra != nil {
	var extra SplitHTTPConfig
	if err := json.Unmarshal(c.Extra, &extra); err != nil {
		return nil, errors.New(`Failed to unmarshal "extra".`).Base(err)
	}
	extra.Host = c.Host
	extra.Path = c.Path
	extra.Mode = c.Mode
	c = &extra
}

Extra подменяет SplitHTTPConfig за исключением Host, Path, Mode, как видно из кода. Баг это или фича, мне не ясно.

В вашем случае, полагаю, будет работать, если headers, sessionIDLength и sessionIDTable поместить в extra, или, что проще, не использовать extra совсем и определить все параметры сразу в xhttpSettings.

@ElDrako32

Copy link
Copy Markdown

Тогда подскажите, пожалуйста, что я делаю не так? Переключился на brach xhttp-sessionid

Причина в том, как обрабатывается extra:
Extra подменяет SplitHTTPConfig за исключением Host, Path, Mode, как видно из кода. Баг это или фича, мне не ясно.

Спасибо, так сработало. Happ не позволяет в extra запихнуть новые поля, поэтому вставлял их снаружи.

@ElDrako32

ElDrako32 commented Jun 7, 2026

Copy link
Copy Markdown

Работает через нужный CDN? У меня конфиг не такой, на других CDN работает. А на нужном CDN, смена формата UUID не помогает. Пути CDN пропускает, но пакеты от xray - нет. Интересно, мне надо конфиг дорабатывать, или в целом там уже ловить нечего?

TW не пускает куки и не все заголовки проходят. "Я" самый простой в этом отношении, на нём тестирую.
У меня по логу nginx есть проход с alphabet, но вот в самом xray
[Info] [955467593] app/proxyman/inbound: connection ends > EOF

Уже и без CDN пытаюсь поднять инбаунд, но тот же EOF.
А на stream-one/up напрямую, то ещё веселее:

2026/06/07 16:42:17.230639 [Info] [2832036433] proxy/vless/inbound: firstLen = 70
2026/06/07 16:42:17.230731 [Info] [2832036433] proxy/vless/inbound: fallback starts > proxy/vless/encoding: invalid request version
2026/06/07 16:42:17.230808 [Info] [2832036433] proxy/vless/inbound: realName = domain
2026/06/07 16:42:17.230915 [Info] [2832036433] proxy/vless/inbound: realAlpn =
2026/06/07 16:42:17.232868 [Info] [2832036433] app/proxyman/inbound: connection ends > proxy/vless/inbound: fallback ends > proxy/vless/inbound: failed to deliver response payload
> read tcp 127.0.0.1:51600->127.0.0.1:3333: read: connection reset by peer

Инбаунд был рабочим, пока 05.06.2026 не обновили блокировки.

@bytecategory

Copy link
Copy Markdown
Contributor

基本是 #6251#6253 的修正版本 支持range设定 自定义table 三个预定义table base62 hex 大写hex(写作HEX)

我看很多人都要求合并 好像没必要再回退成 原来的uuid.New().String()了

@RPRX

RPRX commented Jun 8, 2026

Copy link
Copy Markdown
Member

肯定是会 merge 的,不必搞得许愿跟一样。。。

@Fangliding 按照 predefined 的命名规律,base62 应改名 Base62

@Fangliding

Copy link
Copy Markdown
Member Author

首字母大写是我在偏后写 alphabet 的时候没想好lower+upper的该怎么命名才弄出来的 为了区分全大写/全小写/大小写 三种模式 base62无歧义我想这不多敲一遍shift或者capslock

@RPRX

RPRX commented Jun 8, 2026

Copy link
Copy Markdown
Member

配置也就写一遍不用反复敲,改成风格一致的比较直观吧,顺便这个 map 的顺序改成按前两个字母的 ascii 编号来排序

@ghost

ghost commented Jun 8, 2026

Copy link
Copy Markdown

so what exactly stops you from being Normal and using proper alphabet implementation instead of confusing with "Alphabet"? alphabet what? Chinese alphabet? Cyrillic? English? do what people did in https://github.com/XTLS/Xray-core/pull/6253/changes#diff-4167e9b7ffb52959c4a31f7d8c6925c87ff20ce13b482b33142842769d11119dR56

what are you reinventing the wheel for?

@euppi98

euppi98 commented Jun 9, 2026

Copy link
Copy Markdown

Guys, just do it already.
Chicos, simplemente háganlo ya.
伙计们,赶紧做吧。
दोस्तों, बस अब इसे कर डालो।
يا شباب، فقط افعلوها وخلاص.
Les gars, faites-le et puis c'est tout.
বন্ধুরা, শুধু এটা করে ফেলো।
Galera, só façam isso logo.
دوستو، بس اب اسے کر ڈالو۔
Teman-teman, lakukan saja sudah.
Leute, macht es doch einfach.
みんな、もうさっさとやっちゃって。
다들, 그냥 좀 해버려.
Arkadaşlar, sadece yapın şunu artık.
Ragazzi, fatelo e basta.

UqZ4imFIoljlr5O2sM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.