diff --git a/docs/.vuepress/config/sidebar/ru.ts b/docs/.vuepress/config/sidebar/ru.ts index 3d01eba..b1f8f1d 100644 --- a/docs/.vuepress/config/sidebar/ru.ts +++ b/docs/.vuepress/config/sidebar/ru.ts @@ -34,7 +34,7 @@ export const sidebarRu: SidebarConfig = { { text: "Входящие подключения", children: [ - "/ru/config/inbounds/dokodemo.md", + "/ru/config/inbounds/tunnel.md", "/ru/config/inbounds/http.md", "/ru/config/inbounds/shadowsocks.md", "/ru/config/inbounds/socks.md", diff --git a/docs/ru/config/README.md b/docs/ru/config/README.md index da820c9..060f121 100644 --- a/docs/ru/config/README.md +++ b/docs/ru/config/README.md @@ -12,6 +12,7 @@ lang: ru-RU ```json { + "version":{}, "log": {}, "api": {}, "dns": {}, @@ -35,6 +36,21 @@ lang: ru-RU ## Основные модули конфигурации +> `version` + +Опционально, контролирует версию, на которой может работать данный `config`. При обмене `config`-файлами это предотвращает случайный запуск на нежелательных версиях клиента. Во время выполнения клиент будет проверять, соответствует ли его текущая версия данному требованию. + +``` +"version": { + "min": "25.8.3", + "max": "" +} +``` + +Поля `min` и `max` являются опциональными. Если они не установлены или оставлены пустыми, это означает отсутствие ограничений. Указанные версии не обязательно должны реально существовать, достаточно, чтобы они соответствовали синтаксису номера версии `Xray` `x.y.z`. + +`25.8.3` — это версия `Xray`, в которой была добавлена данная функция. Установка версии ниже этой не имеет смысла (старые версии не будут выполнять проверку). + > log: [LogObject](./log.md) Настройка журнала, управляющая способом вывода журналов Xray. diff --git a/docs/ru/config/features/fallback.md b/docs/ru/config/features/fallback.md index c693390..7034a10 100644 --- a/docs/ru/config/features/fallback.md +++ b/docs/ru/config/features/fallback.md @@ -78,8 +78,9 @@ VLESS будет перенаправлять трафик с длиной пе 1. TCP, формат `"addr:port"`, где addr поддерживает IPv4, доменное имя, IPv6, если указано доменное имя, TCP-соединение будет установлено напрямую (без использования встроенного DNS). 2. Unix domain socket, формат - абсолютный путь, например, `"/dev/shm/domain.socket"`, в начале можно добавить `@` для обозначения [abstract](https://www.man7.org/linux/man-pages/man7/unix.7.html), `@@` - для обозначения abstract с заполнением. -Если указан только порт, можно использовать число или строку, например, `80`, `"80"`, обычно указывает на службу http в открытом виде (addr будет дополнен до `"127.0.0.1"`). +Если указан только `port`, можно использовать как число, так и строку, например `80` или `"80"`. Обычно это указывает на `http`-сервис, работающий в открытом виде (`addr` будет автоматически дополнен как `"localhost"`). +Примечание: Начиная с версии `v25.7.26`, `dest`, содержащий только `port`, указывает на `localhost`, тогда как до этой версии он всегда указывал на `127.0.0.1`. После этого изменения фактической целью может стать `::1`. Некоторые шаблоны `webserver`, скопированные из интернета, могут прослушивать `::1`, но при этом разрешать доступ только с `127.0.0.1` или требовать применения `proxy protocol`, что может привести к различиям в поведении. > `xver`: number Отправка [PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt), специально для передачи реального исходного IP-адреса и порта запроса, заполняется версией 1 или 2, по умолчанию 0, то есть не отправляется. При необходимости рекомендуется указать 1. diff --git a/docs/ru/config/inbounds/index.md b/docs/ru/config/inbounds/index.md index d6dc913..541288d 100644 --- a/docs/ru/config/inbounds/index.md +++ b/docs/ru/config/inbounds/index.md @@ -2,7 +2,7 @@ Xray поддерживает следующие входящие протоколы: -- [Dokodemo-Door](../inbounds/dokodemo.md) +- [Tunnel](../inbounds/tunnel.md) - [HTTP](../inbounds/http.md) - [Shadowsocks](../inbounds/shadowsocks.md) - [Socks](../inbounds/socks.md) diff --git a/docs/ru/config/inbounds/dokodemo.md b/docs/ru/config/inbounds/tunnel.md similarity index 71% rename from docs/ru/config/inbounds/dokodemo.md rename to docs/ru/config/inbounds/tunnel.md index 4b62cdd..0e07761 100644 --- a/docs/ru/config/inbounds/dokodemo.md +++ b/docs/ru/config/inbounds/tunnel.md @@ -1,6 +1,6 @@ -# Dokodemo-Door +# Tunnel(Dokodemo-Door) -Dokodemo door может прослушивать локальный порт и отправлять все данные, поступающие на этот порт, на порт указанного сервера, тем самым реализуя перенаправление портов. +`Tunnel`, или `Dokodemo door`, может прослушивать локальный порт и все поступающие на этот порт данные отправлять через `outbound` на указанный порт сервера, тем самым достигая эффекта перенаправления портов. ## InboundConfigurationObject @@ -8,6 +8,11 @@ Dokodemo door может прослушивать локальный порт и { "address": "8.8.8.8", "port": 53, + "portMap": { + "5555": "1.1.1.1:7777", + "5556": ":8888", // overrides port only + "5557": "example.com:" // overrides address only + }, "network": "tcp", "followRedirect": false, "userLevel": 0 @@ -16,13 +21,17 @@ Dokodemo door может прослушивать локальный порт и > `address`: address -Перенаправлять трафик на этот адрес. Может быть IP-адресом, например, `"1.2.3.4"`, или доменным именем, например, `"xray.com"`. Тип данных: строка. +Перенаправлять трафик на этот адрес. Может быть IP-адресом, например, `"1.2.3.4"`, или доменным именем, например, `"xray.com"`, по умолчанию `"localhost"`. Если `followRedirect` (см. ниже) равно `true`, то `address` может быть пустым. > `port`: number -Перенаправлять трафик на указанный порт целевого адреса, диапазон \[1, 65535\], тип данных: число. Обязательный параметр. +Перенаправляет трафик на указанный порт целевого адреса, диапазон `[0, 65535]`, числовой тип. Если не заполнено или равно `0`, по умолчанию используется порт прослушиваемого адреса. + +> `portMap`: map[string]string + +Представляет собой `map`, который сопоставляет локальные порты с требуемыми удаленными адресами/портами (в случае, если `inbound` прослушивает несколько портов). Если локальный порт не указан в этом `map`, обработка будет производиться в соответствии с настройками `address`/`port`. > `network`: "tcp" | "udp" | "tcp,udp" @@ -52,7 +61,7 @@ Dokodemo door может прослушивать локальный порт и { "listen": "127.0.0.1", "port": 25565, - "protocol": "dokodemo-door", + "protocol": "tunnel", "settings": { "address": "mc.hypixel.net", "port": 25565, diff --git a/docs/ru/config/outbound.md b/docs/ru/config/outbound.md index cbe2c6d..68e5366 100644 --- a/docs/ru/config/outbound.md +++ b/docs/ru/config/outbound.md @@ -43,6 +43,8 @@ Xray будет использовать случайный IP-адрес из Например, если на машине есть целый блок IPv4-адресов `11.4.5.0/24` и прослушивается 0.0.0.0 (все IPv4 и IPv6 адреса на сетевой карте), и клиент подключается к локальной машине через `11.4.5.14`, то исходящие запросы также будут отправляться через `11.4.5.14`. Если же клиент использует `11.4.5.10` для подключения к локальной машине, то исходящие запросы будут отправляться через `11.4.5.10`. То же самое относится и к случаям, когда на машине есть целый блок/несколько IPv6-адресов. +Как и в описании для `inbound`, из-за особенностей `UDP` как протокола без установления соединения, `Xray` не может определить исходный целевой `IP`-адрес запроса, поступающего в ядро (например, в рамках одного и того же `QUIC`-соединения он может даже меняться), поэтому эта функция не может работать. + > `protocol`: string Название протокола подключения. diff --git a/docs/ru/config/outbounds/vmess.md b/docs/ru/config/outbounds/vmess.md index 14690c1..947b9b3 100644 --- a/docs/ru/config/outbounds/vmess.md +++ b/docs/ru/config/outbounds/vmess.md @@ -91,25 +91,15 @@ VMess полагается на системное время. Убедитес Метод шифрования. Клиент будет отправлять данные с использованием настроенного метода шифрования, сервер автоматически распознает его, настройка на сервере не требуется. -- `"aes-128-gcm"`: рекомендуется для использования на ПК. -- `"chacha20-poly1305"`: рекомендуется для использования на мобильных устройствах. -- `"auto"`: значение по умолчанию, автоматический выбор (метод шифрования aes-128-gcm, если платформа выполнения - AMD64, ARM64 или s390x, в противном случае - Chacha20-Poly1305). -- `"none"`: без шифрования. +* `"aes-128-gcm"`: Использовать алгоритм `AES-128-GCM`. +* `"chacha20-poly1305"`: Использовать алгоритм `Chacha20-Poly1305`. +* `"auto"`: Значение по умолчанию. Автоматический выбор (для архитектур `AMD64`, `ARM64` или `s390x` будет выбран метод шифрования `aes-128-gcm`, в остальных случаях — `Chacha20-Poly1305`). +* `"none"`: Без шифрования, сохраняется структура сообщения `VMess`. +* `"zero"`: Без шифрования, поток данных копируется напрямую (аналогично `VLESS`). -* `"zero"`: без шифрования и проверки подлинности сообщений (v1.4.0+). +Не рекомендуется использовать псевдошифрование `"none"` или `"zero"` без включенного `TLS` шифрования и принудительной проверки сертификата. Независимо от выбранного метода шифрования, заголовки пакетов `VMess` всегда защищены шифрованием и аутентификацией. -::: tip -Рекомендуется использовать метод шифрования `"auto"`, чтобы обеспечить безопасность и совместимость в долгосрочной перспективе. - -Метод псевдошифрования `"none"` будет вычислять и проверять контрольные суммы пакетов данных, но поскольку алгоритм аутентификации не имеет аппаратной поддержки, на некоторых платформах он может быть медленнее, чем `"aes-128-gcm"` с аппаратным ускорением. - -Метод псевдошифрования `"zero"` не шифрует сообщения и не вычисляет контрольные суммы данных, поэтому теоретически он должен быть быстрее любого другого метода шифрования. Фактическая скорость может зависеть от других факторов. - -Не рекомендуется использовать методы псевдошифрования `"none"` и `"zero"` без включенного TLS-шифрования и обязательной проверки сертификатов. -Если для установления соединения используется CDN или другая промежуточная платформа, расшифровывающая TLS, или сетевая среда, не рекомендуется использовать методы псевдошифрования `"none"` и `"zero"`. - -Независимо от используемого метода шифрования, заголовок пакета VMess защищен шифрованием и аутентификацией. -::: +Обратите внимание, что `auto` определяет поддержку аппаратного ускорения `AES` только на стороне клиента. Если сервер не поддерживает аппаратное ускорение `AES`, необходимо вручную установить `"chacha20-poly1305"`. Это очень важно, поскольку `Chacha20-Poly1305` на платформах с поддержкой ускорения `AES` работает примерно на 48% медленнее, чем `AES-128-GCM`, однако на платформах без аппаратного ускорения `AES`, `AES-128-GCM` будет работать более чем на 2000% медленнее, чем `Chacha20-Poly1305`. > `experiments`: string diff --git a/docs/ru/config/reverse.md b/docs/ru/config/reverse.md index 7243d17..e37bbf1 100644 --- a/docs/ru/config/reverse.md +++ b/docs/ru/config/reverse.md @@ -2,7 +2,7 @@ Обратный прокси может перенаправлять трафик с сервера на клиент, то есть выполнять обратную переадресацию трафика. -В основе его лежит протокол Mux.cool, который, будучи протоколом мультиплексирования, также обладает свойствами, подобными QUIC. Клиент и сервер равноправны, и обе стороны могут создавать новые подсоединения. Обычно только клиент открывает подсоединения, но здесь открытие подсоединения сервером используется для отправки запросов обратного прокси. +Его базовый протокол — `Mux.cool`, однако направление противоположное: сервер инициирует запросы к клиенту. Принцип работы обратного прокси примерно следующий: diff --git a/docs/ru/config/routing.md b/docs/ru/config/routing.md index 38d7290..e3bcec1 100644 --- a/docs/ru/config/routing.md +++ b/docs/ru/config/routing.md @@ -31,12 +31,6 @@ - Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя; - `"IPOnDemand"`: если при сопоставлении встречается любое правило на основе IP-адреса, доменное имя немедленно разрешается в IP-адрес для сопоставления; -> `domainMatcher`: "hybrid" | "linear" - -Алгоритм сопоставления доменных имен. Используются разные алгоритмы в зависимости от настройки. Этот параметр влияет на все `RuleObject`, для которых не указан отдельный алгоритм сопоставления. - -- `"hybrid"`: используется новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше места. Значение по умолчанию. -- `"linear"`: используется старый алгоритм сопоставления доменных имен. > `rules`: \[[RuleObject](#ruleobject)\] @@ -58,15 +52,16 @@ ```json { - "domainMatcher": "hybrid", - "type": "field", "domain": ["baidu.com", "qq.com", "geosite:cn"], "ip": ["0.0.0.0/8", "10.0.0.0/8", "fc00::/7", "fe80::/10", "geoip:cn"], "port": "53,443,1000-2000", "sourcePort": "53,443,1000-2000", + "localPort": "53,443,1000-2000", "network": "tcp", - "source": ["10.0.0.1"], + "sourceIP": ["10.0.0.1"], + "localIP": ["192.168.0.25"], "user": ["love@xray.com"], + "vlessRoute": "53,443,1000-2000", "inboundTag": ["tag-vmess"], "protocol": ["http", "tls", "quic", "bittorrent"], "attrs": { ":method": "GET" }, @@ -80,21 +75,6 @@ Если указано несколько атрибутов, они должны выполняться **одновременно**, чтобы текущее правило вступило в силу. ::: -> `domainMatcher`: "hybrid" | "linear" - -Алгоритм сопоставления доменных имен. Используются разные алгоритмы в зависимости от настройки. Этот параметр имеет приоритет над `domainMatcher`, настроенным в `RoutingObject`. - -- `"hybrid"`: используется новый алгоритм сопоставления доменных имен, который работает быстрее и занимает меньше места. Значение по умолчанию. -- `"linear"`: используется старый алгоритм сопоставления доменных имен. - -> `type`: "field" - -В настоящее время поддерживается только опция `"field"`. - -::: tip -Можно опустить эту строку в Xray-core v1.8.7 или более поздней версии. -::: - > `domain`: \[string\] Массив, каждый элемент которого представляет собой сопоставление доменного имени. Возможны следующие форматы: @@ -137,6 +117,10 @@ - `a`: a является положительным целым числом, меньшим 65536. Правило вступает в силу, если порт источника равен a. - Смесь двух вышеуказанных форматов, разделенных запятой ",". Например: `"53,443,1000-2000"`. +> `localPort`:number | string + +Порт локального `inbound`, формат соответствует `port`/`sourcePort`. Может быть полезно, когда `inbound` прослушивает диапазон портов. + > `network`: "tcp" | "udp" | "tcp,udp" Допустимые значения: "tcp", "udp" или "tcp,udp". Правило вступает в силу, если тип соединения соответствует указанному. @@ -145,16 +129,37 @@ Конечно, другие варианты, явно подходящие для маршрутизации любого трафика, такие как указание диапазона портов **1-65535** или IP-адресов **0.0.0.0/0 + ::/0**, также имеют аналогичное действие. -> `source`: \[string\] +> `sourceIP`: \[string\] Массив, каждый элемент которого представляет собой диапазон IP-адресов. Возможные форматы: IP-адрес, CIDR, GeoIP и загрузка IP-адресов из файла. Правило вступает в силу, если какой-либо элемент соответствует IP-адресу источника. +Псевдоним: `source` + +> `localIP`: \[string\] + +Формат такой же, как и у других IP. Используется для указания IP-адреса, используемого локальным `inbound` (при прослушивании всех IP-адресов с помощью `0.0.0.0` разные фактические входящие IP будут приводить к разным `localIP`). + +Не работает для `UDP` (отслеживание невозможно из-за его дейтаграммной природы), всегда будет виден IP-адрес, на котором ведется прослушивание (`listen`). + > `user`: \[string\] Массив, каждый элемент которого является адресом электронной почты. Правило вступает в силу, если какой-либо элемент соответствует пользователю-источнику. Аналогично доменному имени, также поддерживается сопоставление с помощью регулярных выражений, начинающихся с `regexp:`. (Также необходимо заменить `\` на `\\`, см. объяснение в разделе `domain`) +> `vlessRoute` number | string + +Когда седьмой и восьмой байты в конце `UUID` для `vless inbound` равны `00`, `vless` позволяет заменить эти две позиции любыми байтами и использовать их в качестве данных `vlessRoute`. Это дает пользователю возможность настраивать часть серверной маршрутизации по своему усмотрению, не изменяя никаких внешних полей. + +``` +--------------↓↓↓↓------------------ +xxxxxxxx-xxxx-0000-xxxx-xxxxxxxxxxxx +``` + +В конфигурации используются данные, закодированные в `big-endian` как `uint16` (если вы не понимаете, что это значит, просто рассматривайте эти четыре символа как шестнадцатеричное число и преобразуйте его в десятичное). Например, `0001→1`, `000e→14`, `38b2→14514`. Причина такого подхода в том, что синтаксис здесь аналогичен `port`, что позволяет гибко указывать множество диапазонов для маршрутизации, так же как и для портов. + +**Tip:** Это не влияет на безопасность аутентификации в других случаях. Для любого валидного `UUID`, 13-й символ очевидно не может быть `0` (поскольку он хранит версию `UUID`). Использование функции `Xray` для преобразования произвольной строки в `UUID` также не приведет к такому результату, поскольку генерируется `UUID v5`. Даже в этом случае для аутентификации остаются 14 байт. + > `inboundTag`: \[string\] Массив, каждый элемент которого является тегом. Правило вступает в силу, если какой-либо элемент соответствует тегу входящего протокола. diff --git a/docs/ru/config/transport.md b/docs/ru/config/transport.md index 2e4bd3e..02d3bb5 100644 --- a/docs/ru/config/transport.md +++ b/docs/ru/config/transport.md @@ -121,7 +121,8 @@ Reality — это самое безопасное на данный момен "curvePreferences": [""], "masterKeyLog": "", "echConfigList": "", - "echServerKeys": "" + "echServerKeys": "", + "echForceQuery": "" } ``` @@ -300,6 +301,21 @@ x25519Kyber768Draft00 Полученный Config можно опубликовать в HTTPS-записи DNS (см. пример в [Google DNS](https://dns.google/query?name=encryptedsni.com&rr_type=HTTPS) или RFC 9460). Учтите: сервер, настроенный на использование ECH, всё ещё принимает обычные не-ECH-соединения. Но клиент, настроенный на ECH, при неудачной ECH-рукопожатии сразу завершит соединение, не откатываясь к открытому SNI. +> `echForceQuery` : string + +Управляет политикой при использовании DNS-запросов для `ECH Config`, доступны опции `none`(по умолчанию), `half`, `full`. + +`none`: Запрашивается один раз. Если не удалось получить действительный `ECH Config`, следующий запрос будет выполнен через пять минут. В случае неудачного запроса **`ECH` использоваться не будет**. + +`half`: Запрашивается один раз. В случае неудачи, попытка запроса будет повторяться при каждом новом соединении. В случае неудачного запроса **`ECH` использоваться не будет**. Если запрос успешен, но ответ не содержит `ECH Config`, **`ECH` также использоваться не будет**, и повторных запросов не будет в течение пяти минут. + +`full`: Запрашивается один раз, успешное соединение требует обязательного получения действительного `ECH Config`, в противном случае соединение не будет установлено. Этот вариант рекомендуется, если вы уверены в необходимости использования `ECH`. Первые два варианта имитируют поведение `fallback` для обеспечения доступности, но это может привести к отправке `SNI` в открытом виде. + +Независимо от успеха запроса, только первое соединение будет блокироваться в ожидании ответа на DNS-запрос. Последующие обновления не будут блокировать соединения. + +> `echSockopt` : [SockoptObject](#sockoptobject) + +Настраивает параметры базового `socket` для соединения, используемого при выполнении DNS-запросов для записей `ECH`. ### RealityObject @@ -432,7 +448,8 @@ Reality лишь модифицирует TLS, и для реализации н Рекомендации: Слишком большие значения `afterBytes` и `burstBytesPerSec` не приведут к желаемому эффекту ограничения скорости. Слишком маленькие значения `bytesPerSec` и `burstBytesPerSec` могут быть легко обнаружены. -Следует разумно подбирать параметры в зависимости от размера ресурсов веб-сайта-источника. Если внезапные скачки скорости нежелательны, установите для `burstBytesPerSec` значение 0. ::: +Следует разумно подбирать параметры в зависимости от размера ресурсов веб-сайта-источника. Если внезапные скачки скорости нежелательны, установите для `burstBytesPerSec` значение 0. +::: > `afterBytes` : number @@ -683,7 +700,7 @@ Reality лишь модифицирует TLS, и для реализации н Для прозрачного проксирования требуются права root или `CAP_NET_ADMIN`. ::: danger -Если в [Dokodemo-door](./inbounds/dokodemo.md) указано `followRedirect: true` и `tproxy` в настройках Sockopt пуст, то значение `tproxy` в настройках Sockopt будет установлено в `"redirect"`. +Если в [Dokodemo-door](./inbounds/tunnel.md) указано `followRedirect: true` и `tproxy` в настройках Sockopt пуст, то значение `tproxy` в настройках Sockopt будет установлено в `"redirect"`. ::: > `domainStrategy`: "AsIs"