2025-02-21 20:17:06 +05:00

258 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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