diff --git a/docs/ru/config/dns.md b/docs/ru/config/dns.md index 28a5868..d3133dd 100644 --- a/docs/ru/config/dns.md +++ b/docs/ru/config/dns.md @@ -74,6 +74,7 @@ DNS-запросы, отправляемые встроенным DNS-серве "disableCache": false, "disableFallback": false, "disableFallbackIfMatch": false, + "useSystemHosts": false, "tag": "dns_inbound" } } @@ -141,10 +142,12 @@ DNS-запросы, отправляемые встроенным DNS-серве Вы можете указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject), а также указать `clientIp` для каждого DNS-сервера в конфигурации [DnsServerObject](#dnsserverobject) (приоритет выше, чем у конфигурации [DnsObject](#dnsobject)). ::: -> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6" +> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6" | "UseSystem" Значение по умолчанию `UseIP` запрашивает как записи A, так и записи AAAA. `UseIPv4` запрашивает только записи A; `UseIPv6` запрашивает только записи AAAA. +`UseSystem`: при каждом DNS-запросе выполняется проверка системной сети на предмет поддержки IPv6 (и IPv4). Если она поддерживает IPv6 (или IPv4), то адреса IPv6 (или IPv4) также возвращаются, в противном случае — нет. + Новая функция в Xray-core v1.8.6: `queryStrategy` можно установить отдельно для каждого `DNS` сервера. ```json @@ -210,6 +213,8 @@ DNS-запросы, отправляемые встроенным DNS-серве `true` отключает кэширование DNS, по умолчанию `false`, то есть кэширование включено. +Этот параметр не влияет на DNS для `localhost`, который всегда использует системный кэш DNS. + > `disableFallback`: true | false `true` отключает откат DNS-запросов (fallback), по умолчанию `false`, то есть откат включен. @@ -218,6 +223,10 @@ DNS-запросы, отправляемые встроенным DNS-серве `true` отключает откат DNS-запросов (fallback), если сработал список доменов с приоритетным сопоставлением для DNS-сервера, по умолчанию `false`, то есть откат включен. +> `useSystemHosts`: true | false + +Если установлено значение `true`, системные хосты добавляются к хостам, определённым в конфигурации, при запуске. Значение по умолчанию — `false`. + > `tag`: string Трафик запросов, отправляемых встроенным DNS, за исключением режимов `localhost`, `fakedns`, `TCPL`, `DOHL` и `DOQL`, можно сопоставить в маршрутизации с помощью `inboundTag` по этому тегу. @@ -231,10 +240,14 @@ DNS-запросы, отправляемые встроенным DNS-серве "port": 5353, "domains": ["domain:xray.com"], "expectedIPs": ["geoip:cn"], + "unexpectedIPs": ["geoip:cloudflare"], "skipFallback": false, "clientIP": "1.2.3.4", + "queryStrategy": "UseIPv4", + "tag": "server-1", "timeoutMs": 4000, - "allowUnexpectedIPs": false + "disableCache": false, + "finalQuery": false, } ``` @@ -290,14 +303,41 @@ DNS-запросы, отправленные модулем DNS, делятся Если этот элемент не настроен, IP-адреса будут возвращены как есть. +если вы добавите "*" в этот список, исходные IP-адреса все равно будут возвращены, если ни один IP-адрес не совпадет. + +> `unexpectedIPs`: [\[string\] + +Противоположность `expectedIPs`. IP-адрес считается совпавшим тогда и только тогда, когда он не совпадает ни с одним из диапазонов IP-адресов в списке. Другими словами: +`expectedIPs = [0.0.0.0/0, ::/0] - unexpectedIPs.` + +если вы добавите "*" в этот список, исходные IP-адреса все равно будут возвращены, если ни один IP-адрес не совпадет. + > `skipFallback`: true | false `true` - этот сервер будет пропущен при выполнении отката DNS-запроса (fallback), по умолчанию `false`, то есть сервер не будет пропущен. +> `finalQuery`: true | false + +Если `true`, результат запроса возвращается в любом случае (даже если список IP-адресов пуст), и никакой другой запасной вариант (fallback) не будет выполнен. + +> `disableCache`: true | false + +Если `true`, кеш отключается только для этого DNS-сервера. + +Этот параметр не влияет на DNS для `localhost`, который всегда использует системный кеш DNS. + > `timeoutMs`: number -Время ожидания DNS-сервера, по умолчанию 4000 мс. +Тайм-аут DNS-сервера, по умолчанию 4000 мс. -> `allowUnexpectedIPs`: bool +Этот параметр не влияет на DNS для `localhost`, который всегда использует системный тайм-аут DNS. -Если включено: когда `expectedIPs` завершит фильтрацию IP-адресов, и если все IP-адреса были отфильтрованы как не соответствующие условиям, то все равно вернуть IP-адреса. В противном случае запрос считается неудачным. +> `tag`: string + +Тег этого DNS-сервера. Если он установлен, то будет использоваться как тег входящего соединения для инициации запроса (в нелокальном режиме), переопределяя глобальный параметр тега. + +> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6" | "UseSystem" + +`UseIPv4` запрашивает только записи A; `UseIPv6` запрашивает только записи AAAA. Значение по умолчанию — `UseIP`, которое запрашивает и A, и AAAA записи. + +`UseSystem`: при каждом DNS-запросе выполняется проверка системной сети на предмет поддержки IPv6 (и IPv4). Если поддерживается IPv6 (или IPv4), то адреса IPv6 (или IPv4) также возвращаются, в противном случае — нет. diff --git a/docs/ru/config/inbound.md b/docs/ru/config/inbound.md index bb5bd88..fef651a 100644 --- a/docs/ru/config/inbound.md +++ b/docs/ru/config/inbound.md @@ -62,6 +62,8 @@ Если указан только один порт, Xray будет прослушивать входящие подключения на этом порту. Если указан диапазон портов, то фактическое поведение зависит от настройки `allocate`. +Обратите внимание, что прослушивание порта — это довольно ресурсоемкая операция. Прослушивание слишком большого диапазона портов может привести к значительному увеличению потребляемых ресурсов и даже нарушить нормальную работу Xray. Как правило, проблемы могут начаться, когда количество прослушиваемых портов приближается к четырехзначным числам. Если вам нужен большой диапазон, рассмотрите возможность использования iptables для перенаправления вместо того, чтобы настраивать его здесь. + > `protocol`: "dokodemo-door" | "http" | "shadowsocks" | "mixed" | "vless" | "vmess" | "trojan" | "wireguard" Название протокола подключения. diff --git a/docs/ru/config/outbounds/dns.md b/docs/ru/config/outbounds/dns.md index 0bf9375..8816c2d 100644 --- a/docs/ru/config/outbounds/dns.md +++ b/docs/ru/config/outbounds/dns.md @@ -32,7 +32,9 @@ DNS — это исходящий протокол, который в основ > `nonIPQuery`: string -Управляет запросами, не относящимися к IP-адресам (не A и AAAA). `"drop"` — отклонять, `"skip"` — не обрабатывать встроенным DNS-сервером, а пересылать на целевой сервер. Значение по умолчанию — `"drop"`. +Управляет запросами, не относящимися к IP-адресам (не A и AAAA). `"drop"` — отклонять, `"skip"` — не обрабатывать встроенным DNS-сервером, а пересылать на целевой сервер. В отличие от `"drop"`, это позволяет избежать ситуации, когда приложение тратит слишком много времени в ожидании ответа DNS до тайм-аута. + +Значение по умолчанию — `"drop"`. > `blockTypes`: array @@ -40,4 +42,6 @@ DNS — это исходящий протокол, который в основ Поскольку `nonIPQuery` по умолчанию отклоняет все запросы, не относящиеся к A и AAAA, необходимо установить для него значение `skip`, чтобы этот параметр заработал. Конечно, можно и не менять, а использовать его только для блокировки запросов A или AAAA, чтобы блокировать запросы IPv4/IPv6, но это крайне не рекомендуется. Рекомендуется настроить соответствующие параметры в `queryStrategy` встроенного DNS-сервера. +Примечание: когда `blockTypes` используется только для блокировки A или AAAA, если `nonIPQuery` установлен в `reject`, то способом блокировки также будет возврат DNS reject, а не отбрасывание запроса. + ## Примеры конфигурации DNS diff --git a/docs/ru/config/transport.md b/docs/ru/config/transport.md index 99c1c40..f84b57d 100644 --- a/docs/ru/config/transport.md +++ b/docs/ru/config/transport.md @@ -27,6 +27,7 @@ "tcpFastOpen": false, "tproxy": "off", "domainStrategy": "AsIs", + "happyEyeballs": {}, "dialerProxy": "", "acceptProxyProtocol": false, "tcpKeepAliveInterval": 0, @@ -105,7 +106,7 @@ Reality — это самое безопасное на данный момен ```json { "serverName": "xray.com", - "serverNameToVerify": "", + "verifyPeerCertInNames": "", "rejectUnknownSni": false, "allowInsecure": false, "alpn": ["h2", "http/1.1"], @@ -134,9 +135,11 @@ Reality — это самое безопасное на данный момен В частности, если клиент устанавливает его в IP-адрес, Xray не будет отправлять SNI, и для использования этой функции также необходимо включить `allowInsecure`. ::: -> `serverNameToVerify`: string +> `verifyPeerCertInNames`: \[ string \] -Только для клиента. Используется для проверки SNI сертификата, переопределяя `serverName`, используемый для проверки. Предназначен для таких специальных целей, как domain fronting. Более безопасен, чем изменение `serverName` и включение `allowInsecure`, так как по-прежнему выполняется проверка подписи сертификата. Однако это эксклюзивная функция utls, требующая настройки `fingerprint` для активации utls. +Только для клиента. Список SNI, используемый для проверки сертификата (достаточно, чтобы хотя бы один SAN из сертификата находился в этом списке). Этот список переопределит `serverName`, который используется для проверки, и предназначен для особых целей, таких как domain fronting. По сравнению с предыдущим методом изменения `serverName` и включения `allowInsecure`, этот способ более безопасен, так как он по-прежнему выполняет проверку подписи сертификата. + +Специальное значение `"FromMitM"`: при его использовании в список будет дополнительно добавлен SNI из TLS-трафика, расшифрованного входящим соединением `dokodomo-door`. > `rejectUnknownSni`: bool @@ -146,6 +149,8 @@ Reality — это самое безопасное на данный момен Массив строк, указывающий значения ALPN, указанные во время рукопожатия TLS. Значение по умолчанию: `["h2", "http/1.1"]`. +Специальное значение: `["FromMitM"]` (когда это единственный элемент) заставит исходящий TLS использовать ALPN из TLS-соединения, расшифрованного входящим `dokodemo-door`. + > `minVersion`: string `minVersion` — это минимально допустимая версия TLS. @@ -439,7 +444,7 @@ Reality лишь модифицирует TLS, и для реализации н ```json { - "ocspStapling": 3600, + "ocspStapling": 0, "oneTimeLoading": false, "usage": "encipherment", "buildChain": false, @@ -496,15 +501,18 @@ Reality лишь модифицирует TLS, и для реализации н } ``` +Сертификат сервера будет автоматически перезагружаться каждые 3600 секунд (то есть каждый час). + > `ocspStapling`: number -Интервал обновления OCSP-скрепления, совпадает с интервалом перезагрузки сертификата. Единица измерения: секунды. Значение по умолчанию: `3600`, то есть один час. +Интервал обновления OCSP Stapling в секундах, по умолчанию 0. Любое ненулевое значение включит OCSP Stapling и переопределит время горячей перезагрузки сертификата по умолчанию в 3600 секунд (OCSP Stapling выполняется во время перезагрузки). > `oneTimeLoading`: true | false -Загружать только один раз. Если значение равно `true`, то функция горячей перезагрузки сертификата и функция OCSP-скрепления будут отключены. +Загружать только один раз, по умолчанию `false`. Если значение `true`, функции горячей перезагрузки сертификата и OCSP Stapling будут отключены. + ::: warning -Если значение равно `true`, то OCSP-скрепление будет отключено. +Если значение равно `true`, то OCSP-Stapling будет отключено. ::: > `usage`: "encipherment" | "verify" | "issue" @@ -573,6 +581,7 @@ Reality лишь модифицирует TLS, и для реализации н "tproxy": "off", "domainStrategy": "AsIs", "dialerProxy": "", + "happyEyeballs": {}, "acceptProxyProtocol": false, "tcpKeepAliveInterval": 0, "tcpKeepAliveIdle": 300, @@ -824,3 +833,39 @@ PS: Если трафик домена, например, обычный веб- Значение, которое нужно установить для опции. В примере устанавливается значение bbr. Если `type` указан как int, значение должно быть десятичным числом. + + +> `happyEyeballs`: {} + +Реализация happyEyeballs по RFC-8305 применима только к TCP. Когда целью является доменное имя, она запускает "гонку" между IP-адресами и выбирает первый, с которым удалось установить соединение. Это работает, когда `domainStrategy` установлен на `UseIP`/`ForceIP` (включая их v4/v6/v4v6 версии, но это сокращает список доступных IP-адресов только до v4 или v6, что не рекомендуется). + +::: warning +При использовании этой функции не используйте `domainStrategy` для исходящего соединения `Freedom`, так как это приведет к тому, что `Sockopt` будет видеть только конечный, уже выбранный IP-адрес. +::: + +```json +"happyEyeballs": { + "tryDelayMs": 250, + "prioritizeIPv6": false, + "interleave": 1, + "maxConcurrentTry": 4, +} +``` + +> `tryDelayMs`: number + +Интервал времени между каждым запросом "гонки", в миллисекундах. По умолчанию 0 (что означает, что функция отключена), рекомендуемое значение — 250. + +> `prioritizeIPv6`: bool + +Тип первого IP-адреса при сортировке IP-адресов. По умолчанию `false` (то есть IPv4 будет первым). + +> `interleave`: number + +"First Address Family count" из RFC-8305, значение по умолчанию — 1. Этот параметр определяет чередование при сортировке IP-адресов разных версий. + +Например, очередь IP-адресов для набора номера будет отсортирована как 46464646 (при значении 1) или 44664466 (при значении 2) (где 6 — это IPv6-адрес, а 4 — IPv4-адрес). + +> `maxConcurrentTry`: number + +Максимальное количество одновременных попыток. Используется для предотвращения ситуации, когда ядро создает большое количество соединений, если разрешено много IP-адресов и ни одно из соединений не увенчалось успехом. По умолчанию 4, установка значения 0 отключает happyEyeballs. diff --git a/docs/ru/document/install.md b/docs/ru/document/install.md index 41099e9..1fb8257 100644 --- a/docs/ru/document/install.md +++ b/docs/ru/document/install.md @@ -81,14 +81,39 @@ Xray предлагает два способа проверки: ## Установка с помощью Docker -- [teddysun/xray](https://hub.docker.com/r/teddysun/xray) +- [teddysun/xray](https.hub.docker.com/r/teddysun/xray) Имеет root-права, есть оболочка (shell), совместим со всеми архитектурами, поддерживаемыми Alpine. Скомпилирован и собран на частном сервере dl.lamp.sh. Более удобен в использовании. +- [ghcr.io/xtls/xray-core](https.ghcr.io/xtls/xray-core) Не имеет root-прав, нет оболочки (shell), поддерживает большее количество архитектур. Скомпилирован и собран из официального репозитория с поддержкой отслеживания. Удобство принесено в жертву ради более высокой безопасности. ### Файловая структура образа Docker -- `/etc/xray/config.json`: файл конфигурации; -- `/usr/bin/xray`: основная программа Xray; -- `/usr/share/xray/geoip.dat`: файл данных IP; -- `/usr/share/xray/geosite.dat`: файл данных доменных имен. + +Образ версии teddysun/xray: + +- `/usr/bin/xray`: Основная программа Xray +- `/etc/xray/config.json`: Единый конфигурационный файл (каталог, в котором он находится, является точкой монтирования) +- `/usr/share/xray/`: Каталог с файлами ресурсов, содержит файлы геолокационных данных от v2fly + - geoip.dat + - geosite.dat + +Образ версии ghcr.io/xtls/xray-core: + +- `/usr/local/bin/xray`: Основная программа Xray (владелец root:root, права доступа к файлу 755) +- `/usr/local/etc/xray/`: Каталог конфигурационных файлов (точка монтирования) (владелец каталога root:root, права доступа к каталогу 755, права доступа к файлам 644) + - 01_api.json + - 02_dns.json + - 03_routing.json + - 04_policy.json + - 05_inbounds.json + - 06_outbounds.json + - 07_transport.json + - 08_stats.json + - 09_reverse.json +- `/usr/local/share/xray/`: Каталог с файлами ресурсов, содержит файлы геолокационных данных от Loyalsoldier (права доступа те же, что и выше) + - geoip.dat + - geosite.dat +- `/var/log/xray/`: Каталог лог-файлов (точка монтирования) (владелец каталога root:root, права доступа 755; владелец файлов 65532:65532, права доступа 600) + - access.log + - error.log # Графические клиенты