diff --git a/docs/ru/config/reverse.md b/docs/ru/config/reverse.md index 2d45b10..4d97fa2 100644 --- a/docs/ru/config/reverse.md +++ b/docs/ru/config/reverse.md @@ -1,48 +1,51 @@ # Обратный прокси -Обратный прокси позволяет перенаправлять трафик с сервера на клиент, то есть перенаправлять трафик в обратном направлении. +Обратный прокси может перенаправлять трафик с сервера на клиент, то есть выполнять обратную переадресацию трафика. -Принцип работы обратного прокси: +В основе его лежит протокол Mux.cool, который, будучи протоколом мультиплексирования, также обладает свойствами, подобными QUIC. Клиент и сервер равноправны, и обе стороны могут создавать новые подсоединения. Обычно только клиент открывает подсоединения, но здесь открытие подсоединения сервером используется для отправки запросов обратного прокси. + +Принцип работы обратного прокси примерно следующий: + +- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A. + - На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал). + - На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост). + +- `bridge` + - `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно. + - После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации. + - После получения ответа `bridge` также возвращает его без изменений `portal`. + +- `portal` + - Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала. + - Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`. -- Предположим, что на хосте A запущен веб-сервер, но у этого хоста нет публичного IP-адреса, и к нему нельзя получить доступ из Интернета. - У нас есть другой хост B с публичным IP-адресом. - Мы хотим использовать хост B в качестве шлюза и перенаправлять трафик с B на A. -- На хосте A настроен Xray, называемый `bridge`, и на хосте B также настроен Xray, называемый `portal`. -- `bridge` устанавливает соединение с `portal`. - Целевой адрес этого соединения можно настроить произвольно. - `portal` получает два типа соединений: соединения от `bridge` и соединения от пользователей из Интернета. - `portal` автоматически объединяет эти два типа соединений. - Таким образом, `bridge` может получать трафик из Интернета. -- После получения трафика из Интернета `bridge` перенаправляет его на веб-сервер на хосте A без изменений. - Конечно, для этого требуется настроить маршрутизацию. - `bridge` выполняет динамическую балансировку нагрузки в зависимости от объема трафика. ::: tip -Обратный прокси по умолчанию использует [Mux](../../development/protocols/muxcool/). -Не включайте Mux для исходящих подключений, используемых обратным прокси. +Как указано выше, обратный прокси по умолчанию использует [Mux](../../development/protocols/muxcool/). Пожалуйста, не включайте Mux повторно на используемых исходящих соединениях. ::: ::: warning -Функция обратного прокси находится в стадии тестирования и может работать некорректно. +Функция обратного прокси все еще находится в стадии тестирования и может иметь некоторые проблемы. ::: ## ReverseObject -`ReverseObject` соответствует полю `reverse` в конфигурационном файле. +`ReverseObject` соответствует параметру `reverse` в файле конфигурации. -```json +```jsonc { "reverse": { "bridges": [ { "tag": "bridge", - "domain": "test.xray.com" + "domain": "reverse-proxy.xray.internal" } ], "portals": [ { "tag": "portal", - "domain": "test.xray.com" + "domain": "reverse-proxy.xray.internal" } ] } @@ -51,96 +54,91 @@ > `bridges`: \[[BridgeObject](#bridgeobject)\] -Массив, каждый элемент которого представляет собой `bridge`. -Настройки каждого `bridge` определяются в [BridgeObject](#bridgeobject). +Массив, каждый элемент которого представляет собой `bridge`. Конфигурация каждого `bridge` является [BridgeObject](#bridgeobject). > `portals`: \[[PortalObject](#portalobject)\] -Массив, каждый элемент которого представляет собой `portal`. -Настройки каждого `portal` определяются в [PortalObject](#bridgeobject). +Массив, каждый элемент которого представляет собой `portal`. Конфигурация каждого `portal` является [PortalObject](#bridgeobject). ### BridgeObject -```json +```jsonc { "tag": "bridge", - "domain": "test.xray.com" + "domain": "reverse-proxy.xray.internal" } ``` > `tag`: string -Все соединения, исходящие от `bridge`, будут иметь этот тег. -Его можно использовать для идентификации соединений в [настройках маршрутизации](./routing.md) с помощью `inboundTag`. +Все соединения, исходящие от `bridge`, будут иметь эту метку. Ее можно использовать для идентификации в [конфигурации маршрутизации](./routing.md) с помощью `inboundTag`. > `domain`: string -Доменное имя, которое `bridge` будет использовать для установления соединения с `portal`. -Это доменное имя используется только для связи между `bridge` и `portal` и не должно существовать на самом деле. +Указывает домен, который `bridge` будет использовать для установления соединения с `portal`. +Этот домен используется только для связи между `bridge` и `portal` и не обязательно должен существовать. ### PortalObject -```json +```jsonc { "tag": "portal", - "domain": "test.xray.com" + "domain": "reverse-proxy.xray.internal" } ``` > `tag`: string -Тег `portal`. -Используйте `outboundTag` в [настройках маршрутизации](./routing.md), чтобы перенаправить трафик на этот `portal`. +Метка `portal`. Используется в [конфигурации маршрутизации](./routing.md) с `outboundTag` для перенаправления трафика на этот `portal`. > `domain`: string -Доменное имя. -Когда `portal` получает трафик, если целевое доменное имя трафика совпадает с этим доменным именем, `portal` считает, что это соединение для связи с `bridge`. -Весь остальной трафик считается трафиком, который нужно перенаправить. -`portal` идентифицирует и объединяет эти два типа соединений. +Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку. + ::: tip -Один и тот же экземпляр Xray может выступать в роли `bridge`, `portal` или и того, и другого, в зависимости от сценария использования. +Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев. ::: -## Примеры полных конфигураций +## Полный пример конфигурации ::: tip -Рекомендуется сначала запустить `bridge`, а затем `portal`. +Во время работы рекомендуется сначала запустить `bridge`, а затем `portal`. ::: -### Настройка bridge +### Конфигурация bridge -`bridge` обычно требуется два исходящих подключения: одно для подключения к `portal`, а другое - для отправки фактического трафика. -Другими словами, вам нужно использовать маршрутизацию, чтобы разделять эти два типа трафика. +`bridge` обычно требует двух исходящих соединений (outbound): одно для подключения к `portal`, другое для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию для различения двух типов трафика. -Настройки обратного прокси: +Конфигурация обратного прокси: -```json -{ +```jsonc +"reverse": { "bridges": [ { "tag": "bridge", - "domain": "test.xray.com" + "domain": "reverse-proxy.xray.internal" } ] } ``` -Исходящие подключения: +outbound: -```json +```jsonc { + // Переадресация на веб-сервер "tag": "out", "protocol": "freedom", "settings": { - "redirect": "127.0.0.1:80" // Перенаправить весь трафик на веб-сервер + "redirect": "127.0.0.1:80" } } ``` -```json +```jsonc { + // Подключение к portal "protocol": "vmess", "settings": { "vnext": [ @@ -159,18 +157,23 @@ } ``` -Настройки маршрутизации: +Конфигурация маршрутизации: -```json +```jsonc { "rules": [ { + // Запрос от bridge, и домен соответствует настроенному домену, + // это означает, что это попытка установить обратный туннель к portal, + // маршрутизируем на interconn, то есть подключаемся к portal "type": "field", "inboundTag": ["bridge"], - "domain": ["full:test.xray.com"], + "domain": ["full:reverse-proxy.xray.internal"], "outboundTag": "interconn" }, { + // Трафик от portal также будет выходить из bridge, но без указанного выше домена + // маршрутизируем на out, то есть перенаправляем на веб-сервер "type": "field", "inboundTag": ["bridge"], "outboundTag": "out" @@ -179,28 +182,28 @@ } ``` -### Настройка portal +### Конфигурация portal -`portal` обычно требуется два входящих подключения: одно для приема соединений от `bridge`, а другое - для приема фактического трафика. -Вам также нужно использовать маршрутизацию, чтобы разделять эти два типа трафика. +`portal` обычно требует двух входящих соединений (inbound): одно для приема соединений от `bridge`, другое для приема фактического трафика. Вам также нужно использовать маршрутизацию для различения двух типов трафика. -Настройки обратного прокси: +Конфигурация обратного прокси: -```json -{ +```jsonc +"reverse": { "portals": [ { "tag": "portal", - "domain": "test.xray.com" // Должно совпадать с настройками bridge + "domain": "reverse-proxy.xray.internal" // Должно совпадать с конфигурацией bridge } ] } ``` -Входящие подключения: +inbound: -```json +```jsonc { + // Прямой прием запросов из Интернета "tag": "external", "port": 80, "protocol": "dokodemo-door", @@ -212,10 +215,11 @@ } ``` -```json +```jsonc { - "port": 1024, + // Прием запросов от bridge для установления обратного туннеля "tag": "interconn", + "port": 1024, "protocol": "vmess", "settings": { "clients": [ @@ -227,21 +231,27 @@ } ``` -Настройки маршрутизации: +Конфигурация маршрутизации: -```json +```jsonc { "rules": [ { + // Если входящее соединение помечено external, значит, это запрос из Интернета, + // маршрутизируем на portal, который в конечном итоге перенаправит его на bridge "type": "field", "inboundTag": ["external"], "outboundTag": "portal" }, { + // Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля, + // маршрутизируем на portal, который в конечном итоге перенаправит его соответствующему клиенту в Интернете. + // Обратите внимание: этот запрос будет содержать домен, настроенный ранее, поэтому portal сможет различать два типа запросов, + // маршрутизируемых на portal. "type": "field", "inboundTag": ["interconn"], "outboundTag": "portal" } ] } -``` \ No newline at end of file +```