Обратный прокси

Обратный прокси позволяет перенаправлять трафик с сервера на клиент, то есть перенаправлять трафик в обратном направлении.

Принцип работы обратного прокси:

  • Предположим, что на хосте A запущен веб-сервер, но у этого хоста нет публичного IP-адреса, и к нему нельзя получить доступ из Интернета.
    У нас есть другой хост B с публичным IP-адресом.
    Мы хотим использовать хост B в качестве шлюза и перенаправлять трафик с B на A.
  • На хосте A настроен Xray, называемый bridge, и на хосте B также настроен Xray, называемый portal.
  • bridge устанавливает соединение с portal.
    Целевой адрес этого соединения можно настроить произвольно.
    portal получает два типа соединений: соединения от bridge и соединения от пользователей из Интернета.
    portal автоматически объединяет эти два типа соединений.
    Таким образом, bridge может получать трафик из Интернета.
  • После получения трафика из Интернета bridge перенаправляет его на веб-сервер на хосте A без изменений.
    Конечно, для этого требуется настроить маршрутизацию.
  • bridge выполняет динамическую балансировку нагрузки в зависимости от объема трафика.

Подсказка

Обратный прокси по умолчанию использует Mux.
Не включайте Mux для исходящих подключений, используемых обратным прокси.

Внимание

Функция обратного прокси находится в стадии тестирования и может работать некорректно.

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 идентифицирует и объединяет эти два типа соединений.

Подсказка

Один и тот же экземпляр Xray может выступать в роли bridge, portal или и того, и другого, в зависимости от сценария использования.

Примеры полных конфигураций

Подсказка

Рекомендуется сначала запустить 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"
    }
  ]
}