diff --git a/docs/config/inbounds/vless.md b/docs/config/inbounds/vless.md index 3a4b7b49..9dcae59a 100644 --- a/docs/config/inbounds/vless.md +++ b/docs/config/inbounds/vless.md @@ -44,10 +44,9 @@ VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部 - 第2个块为加密方式,可选 `native`/`xorpub`/`random`, 分别对应: 原始格式数据包/原始格式+混淆公钥部分/全随机数(类似 VMESS/Shadows socks)。要求服务端与客户端一致 - 第3个块为会话恢复票据有效时间。格式为 `600s` 或 `100-500s`. 前者将在该时长和该时长的一半之间随机一个时间(如 `600s`=`300-600s`),后者则手动指定随即范围 -往后为 padding, 连接建立后服务端发送一些垃圾数据用以混淆长度特征,无需与客户端相同(出站的相同部分为客户端向服务端方向发送的 padding),属于可变长部分,格式为 `padding.delay.padding`+`(.delay.padding)`*n(可插入多个 padding, 要求两个 padding 块之间必须包含一个 delay 块) 比如可以写一个超长的 `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding` +往后为 padding, 连接建立后服务端发送一些垃圾数据用以混淆长度特征,无需与客户端相同(出站的相同部分为客户端向服务端方向发送的 padding),属于可变长部分,格式为 `padding.delay.padding`+`(.delay.padding)`\*n(可插入多个 padding, 要求两个 padding 块之间必须包含一个 delay 块) 比如可以写一个超长的 `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding` --`padding` 格式为 `probability-min-max` 如 `100-111-1111` 含义为 100% 发送一个长度 111~1111 的padding. --`delay` 格式同样为 `probability-min-max` 如 `75-0-111` 含义为 75% 的概率等待 0~111 毫秒 +-`padding` 格式为 `probability-min-max` 如 `100-111-1111` 含义为 100% 发送一个长度 111~1111 的padding. -`delay` 格式同样为 `probability-min-max` 如 `75-0-111` 含义为 75% 的概率等待 0~111 毫秒 第一个 padding 块存在特殊要求,要求概率为 100% 且最小长度大于 0. 若不存在任何 padding, 核心自动使用 `100-111-1111.75-0-111.50-0-3333` 作为 padding 设置。 diff --git a/docs/config/reverse.md b/docs/config/reverse.md index 78af7b13..886b4517 100644 --- a/docs/config/reverse.md +++ b/docs/config/reverse.md @@ -2,7 +2,7 @@ 反向代理可以把服务器端的流量向客户端转发,即逆向流量转发。 -::: tip +::: tip 这个反向代理为通用反向代理(不限制代理协议类型),配置更为复杂,不要和 VLESS 简易配置反向弄混(见 VLESS 出入站文档相关部分)。 ::: diff --git a/docs/document/level-2/nginx_or_haproxy_tls_tunnel.md b/docs/document/level-2/nginx_or_haproxy_tls_tunnel.md index 9debee8d..7e4d59bb 100644 --- a/docs/document/level-2/nginx_or_haproxy_tls_tunnel.md +++ b/docs/document/level-2/nginx_or_haproxy_tls_tunnel.md @@ -106,38 +106,35 @@ WantedBy=multi-user.target ```json { - "log": { - "loglevel": "none" - }, - "inbounds": [ - { - "listen": "/dev/shm/vless.sock,0666", - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "uuid" - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "tcp" - }, - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - } - } - ], - "outbounds": [ - { - "protocol": "freedom" - } - ] + "log": { + "loglevel": "none" + }, + "inbounds": [ + { + "listen": "/dev/shm/vless.sock,0666", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "uuid" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "tcp" + }, + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + } + } + ], + "outbounds": [ + { + "protocol": "freedom" + } + ] } ``` @@ -145,160 +142,138 @@ WantedBy=multi-user.target ```json { - "log": { - "loglevel": "none" - }, - "dns": { - "servers": [ - "1.1.1.1", - { - "address": "119.29.29.29", - "domains": [ - "geosite:cn" - ], - "expectIP": [ - "geoip:cn" - ] - } - ], - "disableFallback": true, - "disableFallbackIfMatch": true - }, - "inbounds": [ - { - "tag": "tproxy-in", - "port": 12345, - "protocol": "dokodemo-door", - "settings": { - "network": "tcp,udp", - "followRedirect": true - }, - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - }, - "streamSettings": { - "sockopt": { - "tproxy": "tproxy", - "mark": 255 - } - } - }, - { - "tag": "http", - "port": 10808, - "listen": "127.0.0.1", - "protocol": "http", - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - } - } + "log": { + "loglevel": "none" + }, + "dns": { + "servers": [ + "1.1.1.1", + { + "address": "119.29.29.29", + "domains": ["geosite:cn"], + "expectIP": ["geoip:cn"] + } ], - "outbounds": [ - { - "tag": "nginxtls", - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 6666, - "users": [ - { - "id": "uuid", - "encryption": "none" - } - ] - } - ] - }, - "streamSettings": { - "sockopt": { - "mark": 255 - }, - "network": "tcp" - } - }, - { - "tag": "direct", - "protocol": "freedom", - "streamSettings": { - "sockopt": { - "mark": 255 - } - } - }, - { - "tag": "block", - "protocol": "blackhole", - "settings": { - "response": { - "type": "http" - } - } + "disableFallback": true, + "disableFallbackIfMatch": true + }, + "inbounds": [ + { + "tag": "tproxy-in", + "port": 12345, + "protocol": "dokodemo-door", + "settings": { + "network": "tcp,udp", + "followRedirect": true + }, + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + }, + "streamSettings": { + "sockopt": { + "tproxy": "tproxy", + "mark": 255 } - ], - "routing": { - "domainMatcher": "mph", - "domainStrategy": "AsIs", - "rules": [ - { - "type": "field", - "domain": [ - "geosite:category-ads-all" - ], - "outboundTag": "block" - }, - { - "type": "field", - "port": 123, - "network": "udp", - "outboundTag": "direct" - }, - { - "type": "field", - "ip": [ - "1.1.1.1" - ], - "outboundTag": "proxy" - }, - { - "type": "field", - "domain": [ - "geosite:cn" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "protocol": [ - "bittorrent" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "ip": [ - "geoip:private" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "inboundTag": [ - "tproxy-in" - ], - "outboundTag": "nginxtls" - } - ] + } + }, + { + "tag": "http", + "port": 10808, + "listen": "127.0.0.1", + "protocol": "http", + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + } } + ], + "outbounds": [ + { + "tag": "nginxtls", + "protocol": "vless", + "settings": { + "vnext": [ + { + "address": "127.0.0.1", + "port": 6666, + "users": [ + { + "id": "uuid", + "encryption": "none" + } + ] + } + ] + }, + "streamSettings": { + "sockopt": { + "mark": 255 + }, + "network": "tcp" + } + }, + { + "tag": "direct", + "protocol": "freedom", + "streamSettings": { + "sockopt": { + "mark": 255 + } + } + }, + { + "tag": "block", + "protocol": "blackhole", + "settings": { + "response": { + "type": "http" + } + } + } + ], + "routing": { + "domainMatcher": "mph", + "domainStrategy": "AsIs", + "rules": [ + { + "type": "field", + "domain": ["geosite:category-ads-all"], + "outboundTag": "block" + }, + { + "type": "field", + "port": 123, + "network": "udp", + "outboundTag": "direct" + }, + { + "type": "field", + "ip": ["1.1.1.1"], + "outboundTag": "proxy" + }, + { + "type": "field", + "domain": ["geosite:cn"], + "outboundTag": "direct" + }, + { + "type": "field", + "protocol": ["bittorrent"], + "outboundTag": "direct" + }, + { + "type": "field", + "ip": ["geoip:private"], + "outboundTag": "direct" + }, + { + "type": "field", + "inboundTag": ["tproxy-in"], + "outboundTag": "nginxtls" + } + ] + } } ``` diff --git a/docs/en/document/level-2/nginx_or_haproxy_tls_tunnel.md b/docs/en/document/level-2/nginx_or_haproxy_tls_tunnel.md index 9debee8d..7e4d59bb 100644 --- a/docs/en/document/level-2/nginx_or_haproxy_tls_tunnel.md +++ b/docs/en/document/level-2/nginx_or_haproxy_tls_tunnel.md @@ -106,38 +106,35 @@ WantedBy=multi-user.target ```json { - "log": { - "loglevel": "none" - }, - "inbounds": [ - { - "listen": "/dev/shm/vless.sock,0666", - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "uuid" - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "tcp" - }, - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - } - } - ], - "outbounds": [ - { - "protocol": "freedom" - } - ] + "log": { + "loglevel": "none" + }, + "inbounds": [ + { + "listen": "/dev/shm/vless.sock,0666", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "uuid" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "tcp" + }, + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + } + } + ], + "outbounds": [ + { + "protocol": "freedom" + } + ] } ``` @@ -145,160 +142,138 @@ WantedBy=multi-user.target ```json { - "log": { - "loglevel": "none" - }, - "dns": { - "servers": [ - "1.1.1.1", - { - "address": "119.29.29.29", - "domains": [ - "geosite:cn" - ], - "expectIP": [ - "geoip:cn" - ] - } - ], - "disableFallback": true, - "disableFallbackIfMatch": true - }, - "inbounds": [ - { - "tag": "tproxy-in", - "port": 12345, - "protocol": "dokodemo-door", - "settings": { - "network": "tcp,udp", - "followRedirect": true - }, - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - }, - "streamSettings": { - "sockopt": { - "tproxy": "tproxy", - "mark": 255 - } - } - }, - { - "tag": "http", - "port": 10808, - "listen": "127.0.0.1", - "protocol": "http", - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - } - } + "log": { + "loglevel": "none" + }, + "dns": { + "servers": [ + "1.1.1.1", + { + "address": "119.29.29.29", + "domains": ["geosite:cn"], + "expectIP": ["geoip:cn"] + } ], - "outbounds": [ - { - "tag": "nginxtls", - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 6666, - "users": [ - { - "id": "uuid", - "encryption": "none" - } - ] - } - ] - }, - "streamSettings": { - "sockopt": { - "mark": 255 - }, - "network": "tcp" - } - }, - { - "tag": "direct", - "protocol": "freedom", - "streamSettings": { - "sockopt": { - "mark": 255 - } - } - }, - { - "tag": "block", - "protocol": "blackhole", - "settings": { - "response": { - "type": "http" - } - } + "disableFallback": true, + "disableFallbackIfMatch": true + }, + "inbounds": [ + { + "tag": "tproxy-in", + "port": 12345, + "protocol": "dokodemo-door", + "settings": { + "network": "tcp,udp", + "followRedirect": true + }, + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + }, + "streamSettings": { + "sockopt": { + "tproxy": "tproxy", + "mark": 255 } - ], - "routing": { - "domainMatcher": "mph", - "domainStrategy": "AsIs", - "rules": [ - { - "type": "field", - "domain": [ - "geosite:category-ads-all" - ], - "outboundTag": "block" - }, - { - "type": "field", - "port": 123, - "network": "udp", - "outboundTag": "direct" - }, - { - "type": "field", - "ip": [ - "1.1.1.1" - ], - "outboundTag": "proxy" - }, - { - "type": "field", - "domain": [ - "geosite:cn" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "protocol": [ - "bittorrent" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "ip": [ - "geoip:private" - ], - "outboundTag": "direct" - }, - { - "type": "field", - "inboundTag": [ - "tproxy-in" - ], - "outboundTag": "nginxtls" - } - ] + } + }, + { + "tag": "http", + "port": 10808, + "listen": "127.0.0.1", + "protocol": "http", + "sniffing": { + "enabled": true, + "destOverride": ["http", "tls"] + } } + ], + "outbounds": [ + { + "tag": "nginxtls", + "protocol": "vless", + "settings": { + "vnext": [ + { + "address": "127.0.0.1", + "port": 6666, + "users": [ + { + "id": "uuid", + "encryption": "none" + } + ] + } + ] + }, + "streamSettings": { + "sockopt": { + "mark": 255 + }, + "network": "tcp" + } + }, + { + "tag": "direct", + "protocol": "freedom", + "streamSettings": { + "sockopt": { + "mark": 255 + } + } + }, + { + "tag": "block", + "protocol": "blackhole", + "settings": { + "response": { + "type": "http" + } + } + } + ], + "routing": { + "domainMatcher": "mph", + "domainStrategy": "AsIs", + "rules": [ + { + "type": "field", + "domain": ["geosite:category-ads-all"], + "outboundTag": "block" + }, + { + "type": "field", + "port": 123, + "network": "udp", + "outboundTag": "direct" + }, + { + "type": "field", + "ip": ["1.1.1.1"], + "outboundTag": "proxy" + }, + { + "type": "field", + "domain": ["geosite:cn"], + "outboundTag": "direct" + }, + { + "type": "field", + "protocol": ["bittorrent"], + "outboundTag": "direct" + }, + { + "type": "field", + "ip": ["geoip:private"], + "outboundTag": "direct" + }, + { + "type": "field", + "inboundTag": ["tproxy-in"], + "outboundTag": "nginxtls" + } + ] + } } ``` diff --git a/docs/ru/config/inbound.md b/docs/ru/config/inbound.md index 13299c31..9a390a20 100644 --- a/docs/ru/config/inbound.md +++ b/docs/ru/config/inbound.md @@ -170,4 +170,4 @@ Xray будет использовать доменные имена, обнар Если вы уверены, что **проксируемое соединение будет правильно разрешено DNS**, то при использовании `routeOnly` и включенном `destOverride` можно установить стратегию сопоставления маршрутов `domainStrategy` в `AsIs`, чтобы реализовать разделение трафика по доменам и IP-адресам без DNS-разрешения. В этом случае при сопоставлении правил на основе IP-адресов будет использоваться исходный IP-адрес домена. ::: -ы \ No newline at end of file +ы diff --git a/docs/ru/config/inbounds/vless.md b/docs/ru/config/inbounds/vless.md index 2ebcb304..32ca091d 100644 --- a/docs/ru/config/inbounds/vless.md +++ b/docs/ru/config/inbounds/vless.md @@ -44,7 +44,7 @@ VLESS - это легкий транспортный протокол без с - Второй блок, это метод шифрования, возможные варианты: `native`/`xorpub`/`random`, которые соответствуют: пакет данных в исходном формате / исходный формат + обфускация части открытого ключа / полностью случайное число (подобно VMESS/Shadowsocks). Требуется, чтобы сервер и клиент совпадали. - Третий блок, это время действия тикета восстановления сеанса. Формат: `600s` или `100-500s`. Первый случай будет случайным образом выбирать время между указанной длительностью и ее половиной (например, `600s`=`300-600s`), второй случай позволяет вручную указать случайный диапазон. -Далее идет padding (заполнение). После установления соединения сервер отправляет некоторые "мусорные" данные для маскировки характеристик длины. Он не обязан совпадать с клиентом (совпадающая часть для исходящего трафика - это padding, отправляемый клиентом в сторону сервера). Это переменная часть, формат: `padding.delay.padding`+`(.delay.padding)`*n (можно вставлять несколько padding, но требуется, чтобы между двумя блоками padding обязательно был блок delay). Например, можно написать очень длинную строку `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding`. +Далее идет padding (заполнение). После установления соединения сервер отправляет некоторые "мусорные" данные для маскировки характеристик длины. Он не обязан совпадать с клиентом (совпадающая часть для исходящего трафика - это padding, отправляемый клиентом в сторону сервера). Это переменная часть, формат: `padding.delay.padding`+`(.delay.padding)`\*n (можно вставлять несколько padding, но требуется, чтобы между двумя блоками padding обязательно был блок delay). Например, можно написать очень длинную строку `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding`. - Формат `padding`: `probability-min-max`, например, `100-111-1111`, что означает отправку padding длиной 111~1111 с вероятностью 100%. - Формат `delay` также `probability-min-max`, например, `75-0-111`, что означает ожидание 0~111 миллисекунд с вероятностью 75%. diff --git a/docs/ru/config/outbounds/http.md b/docs/ru/config/outbounds/http.md index d2cb3e07..eebe54c1 100644 --- a/docs/ru/config/outbounds/http.md +++ b/docs/ru/config/outbounds/http.md @@ -59,4 +59,4 @@ > `headers`: map{ string, string } -Заголовки HTTP, представляющие собой пары ключ-значение. Каждый ключ обозначает имя заголовка HTTP, и все пары ключ-значение будут прикрепляться к каждому запросу. \ No newline at end of file +Заголовки HTTP, представляющие собой пары ключ-значение. Каждый ключ обозначает имя заголовка HTTP, и все пары ключ-значение будут прикрепляться к каждому запросу. diff --git a/docs/ru/config/outbounds/socks.md b/docs/ru/config/outbounds/socks.md index 8ddeb992..7fcbd7d8 100644 --- a/docs/ru/config/outbounds/socks.md +++ b/docs/ru/config/outbounds/socks.md @@ -31,7 +31,6 @@ Порт сервера, обязательный параметр. - > `user`: string Имя пользователя, тип данных: строка. Обязательный параметр. @@ -48,4 +47,4 @@ > `email`: string -Адрес электронной почты, используемый для идентификации пользователя. \ No newline at end of file +Адрес электронной почты, используемый для идентификации пользователя. diff --git a/docs/ru/config/outbounds/trojan.md b/docs/ru/config/outbounds/trojan.md index 6cf9de8f..bb291a4f 100644 --- a/docs/ru/config/outbounds/trojan.md +++ b/docs/ru/config/outbounds/trojan.md @@ -8,8 +8,6 @@ Trojan предназначен для работы в правильно нас ## OutboundConfigurationObject - - ```json { "address": "127.0.0.1", diff --git a/docs/ru/config/outbounds/vless.md b/docs/ru/config/outbounds/vless.md index 07ef1c59..441697ed 100644 --- a/docs/ru/config/outbounds/vless.md +++ b/docs/ru/config/outbounds/vless.md @@ -6,7 +6,6 @@ VLESS - это легкий транспортный протокол без с ## OutboundConfigurationObject - ```json { "address": "example.com", @@ -51,7 +50,7 @@ VLESS - это легкий транспортный протокол без с - Второй блок, это метод шифрования, возможные варианты: `native`/`xorpub`/`random`, которые соответствуют: пакет данных в исходном формате / исходный формат + обфускация части открытого ключа / полностью случайное число (подобно VMESS/Shadowsocks). Требуется, чтобы сервер и клиент совпадали. - Третий блок, это восстановление сеанса. Выбор `0rtt` будет следовать настройкам сервера, пытаясь использовать ранее сгенерированный тикет для пропуска рукопожатия и быстрого подключения (может быть вручную отключено сервером). Выбор `1rtt` принудительно выполнит процесс рукопожатия 1 RTT. Здесь это отличается по смыслу от настроек сервера; подробности см. в настройках `decryption` для входящих соединений VLESS. -Далее идет padding (заполнение). После установления соединения клиент отправляет некоторые "мусорные" данные для маскировки характеристик длины. Он не обязан совпадать с сервером (совпадающая часть для входящего трафика - это padding, отправляемый сервером в сторону клиента). Это переменная часть, формат: `padding.delay.padding`+`(.delay.padding)`*n (можно вставлять несколько padding, но требуется, чтобы между двумя блоками padding обязательно был блок delay). Например, можно написать очень длинную строку `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding`. +Далее идет padding (заполнение). После установления соединения клиент отправляет некоторые "мусорные" данные для маскировки характеристик длины. Он не обязан совпадать с сервером (совпадающая часть для входящего трафика - это padding, отправляемый сервером в сторону клиента). Это переменная часть, формат: `padding.delay.padding`+`(.delay.padding)`\*n (можно вставлять несколько padding, но требуется, чтобы между двумя блоками padding обязательно был блок delay). Например, можно написать очень длинную строку `padding.delay.padding.delay.padding.delay.padding.delay.padding.delay.padding`. - Формат `padding`: `probability-min-max`, например, `100-111-1111`, что означает отправку padding длиной 111~1111 с вероятностью 100%. - Формат `delay` также `probability-min-max`, например, `75-0-111`, что означает ожидание 0~111 миллисекунд с вероятностью 75%. diff --git a/docs/ru/development/intro/compile.md b/docs/ru/development/intro/compile.md index a61064f3..3cc79fb2 100644 --- a/docs/ru/development/intro/compile.md +++ b/docs/ru/development/intro/compile.md @@ -92,4 +92,4 @@ CGO_ENABLED=0 go build -o xray -trimpath -buildvcs=false -gcflags="-l=4" -ldflag ## Компиляция версии для Windows 7 -Замените инструментарий Golang на версию, предоставленную в [go-win7](https://github.com/XTLS/go-win7), а затем выполните компиляцию, следуя шагам выше. \ No newline at end of file +Замените инструментарий Golang на версию, предоставленную в [go-win7](https://github.com/XTLS/go-win7), а затем выполните компиляцию, следуя шагам выше. diff --git a/docs/ru/document/command.md b/docs/ru/document/command.md index 51913302..70bf85ae 100644 --- a/docs/ru/document/command.md +++ b/docs/ru/document/command.md @@ -27,7 +27,7 @@ The commands are: mldsa65 Сгенерировать ключевую пару для постквантовой подписи ML-DSA-65 (REALITY) mlkem768 Сгенерировать ключевую пару для постквантового обмена ключами ML-KEM-768 (VLESS Encryption) vlessenc Сгенерировать пару json для дешифрования/шифрования (VLESS Encryption) - + Use "xray help " for more information about a command. ``` @@ -71,9 +71,10 @@ The -dump flag tells Xray to print the merged config. ::: tip Когда `-config` не указан, Xray последовательно попытается загрузить `config.json` из следующих путей: + - Рабочий каталог (Working Directory) - Путь, указанный в переменной окружения `Xray.location.asset` в [переменных окружения](../config/features/env.md#Путь-к-файлам-ресурсов) -::: + ::: ``` xray run -dump @@ -248,4 +249,4 @@ xray mlkem768 [-i "seed (base64.StdEncoding)"] ``` xray vlessenc -``` \ No newline at end of file +```