# Обратный прокси Обратный прокси позволяет перенаправлять трафик с сервера на клиент, то есть перенаправлять трафик в обратном направлении. Принцип работы обратного прокси: - Предположим, что на хосте 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 для исходящих подключений, используемых обратным прокси. ::: ::: warning Функция обратного прокси находится в стадии тестирования и может работать некорректно. ::: ## ReverseObject `ReverseObject` соответствует полю `reverse` в конфигурационном файле. ```json { "reverse": { "bridges": [ { "tag": "bridge", "domain": "test.xray.com" } ], "portals": [ { "tag": "portal", "domain": "test.xray.com" } ] } } ``` > `bridges`: \[[BridgeObject](#bridgeobject)\] Массив, каждый элемент которого представляет собой `bridge`. Настройки каждого `bridge` определяются в [BridgeObject](#bridgeobject). > `portals`: \[[PortalObject](#portalobject)\] Массив, каждый элемент которого представляет собой `portal`. Настройки каждого `portal` определяются в [PortalObject](#bridgeobject). ### BridgeObject ```json { "tag": "bridge", "domain": "test.xray.com" } ``` > `tag`: string Все соединения, исходящие от `bridge`, будут иметь этот тег. Его можно использовать для идентификации соединений в [настройках маршрутизации](./routing.md) с помощью `inboundTag`. > `domain`: string Доменное имя, которое `bridge` будет использовать для установления соединения с `portal`. Это доменное имя используется только для связи между `bridge` и `portal` и не должно существовать на самом деле. ### PortalObject ```json { "tag": "portal", "domain": "test.xray.com" } ``` > `tag`: string Тег `portal`. Используйте `outboundTag` в [настройках маршрутизации](./routing.md), чтобы перенаправить трафик на этот `portal`. > `domain`: string Доменное имя. Когда `portal` получает трафик, если целевое доменное имя трафика совпадает с этим доменным именем, `portal` считает, что это соединение для связи с `bridge`. Весь остальной трафик считается трафиком, который нужно перенаправить. `portal` идентифицирует и объединяет эти два типа соединений. ::: tip Один и тот же экземпляр Xray может выступать в роли `bridge`, `portal` или и того, и другого, в зависимости от сценария использования. ::: ## Примеры полных конфигураций ::: tip Рекомендуется сначала запустить `bridge`, а затем `portal`. ::: ### Настройка bridge `bridge` обычно требуется два исходящих подключения: одно для подключения к `portal`, а другое - для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию, чтобы разделять эти два типа трафика. Настройки обратного прокси: ```json { "bridges": [ { "tag": "bridge", "domain": "test.xray.com" } ] } ``` Исходящие подключения: ```json { "tag": "out", "protocol": "freedom", "settings": { "redirect": "127.0.0.1:80" // Перенаправить весь трафик на веб-сервер } } ``` ```json { "protocol": "vmess", "settings": { "vnext": [ { "address": "IP-адрес portal", "port": 1024, "users": [ { "id": "5783a3e7-e373-51cd-8642-c83782b807c5" } ] } ] }, "tag": "interconn" } ``` Настройки маршрутизации: ```json { "rules": [ { "type": "field", "inboundTag": ["bridge"], "domain": ["full:test.xray.com"], "outboundTag": "interconn" }, { "type": "field", "inboundTag": ["bridge"], "outboundTag": "out" } ] } ``` ### Настройка portal `portal` обычно требуется два входящих подключения: одно для приема соединений от `bridge`, а другое - для приема фактического трафика. Вам также нужно использовать маршрутизацию, чтобы разделять эти два типа трафика. Настройки обратного прокси: ```json { "portals": [ { "tag": "portal", "domain": "test.xray.com" // Должно совпадать с настройками bridge } ] } ``` Входящие подключения: ```json { "tag": "external", "port": 80, "protocol": "dokodemo-door", "settings": { "address": "127.0.0.1", "port": 80, "network": "tcp" } } ``` ```json { "port": 1024, "tag": "interconn", "protocol": "vmess", "settings": { "clients": [ { "id": "5783a3e7-e373-51cd-8642-c83782b807c5" } ] } } ``` Настройки маршрутизации: ```json { "rules": [ { "type": "field", "inboundTag": ["external"], "outboundTag": "portal" }, { "type": "field", "inboundTag": ["interconn"], "outboundTag": "portal" } ] } ```