fix(sub): restore compatible SOCKS subscription inbound (#6395)

This commit is contained in:
dawn
2026-09-03 22:33:14 +08:00
committed by GitHub
parent 04e8458054
commit 0c72dd8384
8 changed files with 57 additions and 6 deletions
+1 -1
View File
@@ -57,7 +57,7 @@ page instead of the raw body.
The **Base64** body is just the newline-joined share links, standard-base64
encoded (toggle with `subEncrypt`). The **JSON** body wraps each client in a
complete Xray client config — a fixed skeleton (local mixed/HTTP inbounds, DNS,
complete Xray client config — a fixed skeleton (local SOCKS/HTTP inbounds, DNS,
routing, policy) plus a `proxy` outbound pointing at the inbound. 3x-ui emits a
**single config object for one client and an array for several**, uses the flat
outbound `settings` form (`address`/`port`/`id`, `level: 8`), and strips
+1 -1
View File
@@ -58,7 +58,7 @@ https://<sub-host>:<sub-port>/sub/<sub-id>
بدنه‌ی **Base64** صرفاً همان لینک‌های اشتراک‌گذاری است که با خط جدید به هم پیوسته و
با standard-base64 رمزگذاری شده‌اند (با `subEncrypt` قابل تغییر است). بدنه‌ی **JSON**
هر کلاینت را در یک پیکربندی کامل کلاینت Xray می‌پیچد — یک اسکلت ثابت (ورودی‌های محلی
mixed/HTTP، DNS، مسیریابی، policy) به‌علاوه‌ی یک outbound از نوع `proxy` که به ورودی
SOCKS/HTTP، DNS، مسیریابی، policy) به‌علاوه‌ی یک outbound از نوع `proxy` که به ورودی
اشاره می‌کند. 3x-ui **برای یک کلاینت یک شیء پیکربندی واحد و برای چند کلاینت یک آرایه**
تولید می‌کند، از فرم تخت `settings` در outbound استفاده می‌کند
(`address`/`port`/`id`، `level: 8`) و `sockopt` را از `streamSettings` حذف می‌کند.
+1 -1
View File
@@ -59,7 +59,7 @@ https://<sub-host>:<sub-port>/sub/<sub-id>
Тело **Base64** — это просто ссылки для обмена, объединённые через перевод
строки и закодированные в стандартный base64 (переключается через `subEncrypt`).
Тело **JSON** оборачивает каждого клиента в полную клиентскую конфигурацию
Xray — фиксированный каркас (локальные входящие mixed/HTTP, DNS, маршрутизация,
Xray — фиксированный каркас (локальные входящие SOCKS/HTTP, DNS, маршрутизация,
policy) плюс исходящее соединение `proxy`, указывающее на входящее. 3x-ui
выдаёт **единый объект конфигурации для одного клиента и массив для
нескольких**, использует плоскую форму `settings` исходящего соединения
+1 -1
View File
@@ -46,7 +46,7 @@ https://<sub-host>:<sub-port>/sub/<sub-id>
### Base64 与 JSON
**Base64** 内容只是用换行符连接的分享链接,经标准 base64 编码(通过 `subEncrypt` 开关控制)。**JSON** 内容则将每个客户端包装为一份完整的 Xray 客户端配置 —— 一套固定的骨架(本地 mixed/HTTP 入站、DNS、路由、策略)加上一个指向该入站的 `proxy` 出站。3x-ui **对单个客户端输出单个配置对象,对多个客户端输出数组**,使用扁平的出站 `settings` 形式(`address`/`port`/`id``level: 8`),并从 `streamSettings` 中剥离 `sockopt`。
**Base64** 内容只是用换行符连接的分享链接,经标准 base64 编码(通过 `subEncrypt` 开关控制)。**JSON** 内容则将每个客户端包装为一份完整的 Xray 客户端配置 —— 一套固定的骨架(本地 SOCKS/HTTP 入站、DNS、路由、策略)加上一个指向该入站的 `proxy` 出站。3x-ui **对单个客户端输出单个配置对象,对多个客户端输出数组**,使用扁平的出站 `settings` 形式(`address`/`port`/`id``level: 8`),并从 `streamSettings` 中剥离 `sockopt`。
## 响应头
+13
View File
@@ -120,6 +120,19 @@ describe('buildJsonSubscription', () => {
expect(cfg.remarks).toBe('HK-01');
});
it('uses the iOS-compatible SOCKS inbound while preserving the mixed tag and HTTP inbound', () => {
const cfg = JSON.parse(buildJsonSubscription([vlessClient]));
const socks = cfg.inbounds.find((inbound: { port: number }) => inbound.port === 10808);
const http = cfg.inbounds.find((inbound: { port: number }) => inbound.port === 10809);
expect(socks).toMatchObject({
protocol: 'socks',
tag: 'mixed',
settings: { udp: true },
});
expect(http).toMatchObject({ protocol: 'http' });
});
it('trojan uses servers[] with a password and no method', () => {
const trojan: SubClient = {
protocol: 'trojan',
+1 -1
View File
@@ -146,7 +146,7 @@ function subJsonSkeleton(): Record<string, unknown> {
inbounds: [
{
port: 10808,
protocol: 'mixed',
protocol: 'socks',
settings: { auth: 'noauth', udp: true, userLevel: 8 },
sniffing: { destOverride: ['http', 'tls', 'quic', 'fakedns'], enabled: true },
tag: 'mixed',