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