telemt/docs/Setup_examples/XRAY_DOUBLE_HOP.ru.md

10 KiB
Raw Blame History

Концепция

  • Сервер A (РФ):
    Точка входа, принимает трафик пользователей Telegram-прокси через HAProxy (порт 443\tcp)
    и отправляет его через локальный клиент Xray (порт 10443\tcp) на Сервер B.
    Порт для клиентов HAProxy — 443\tcp
  • Сервер B (условно Нидерланды):
    Точка выхода, на нем работает Xray-сервер (принимает подключения точки входа) и telemt.
    На сервере должен быть неограниченный доступ до серверов Telegram.
    Порт для VLESS/REALITY (вход) — 443\tcp
    Внутренний порт telemt (куда пробрасывается трафик) — 8443\tcp

Туннель работает по протоколу VLESS-XTLS-Reality (или VLESS/xhttp/reality). Оригинальный IP-адрес клиента сохраняется благодаря протоколу PROXYv2, который HAProxy добавляет перед отправкой в Xray, и который прозрачно доходит до telemt.


Шаг 1. Настройка туннеля Xray (A <-> B)

На обоих серверах необходимо установить Xray-core (рекомендуется версия 1.8.4 или новее). Официальный скрипт установки (выполнить на обоих серверах):

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

Генерация ключей и параметров (выполнить один раз)

Для конфигурации потребуются уникальные ID и ключи Xray Reality. Выполните на любом сервере с установленным Xray:

  1. UUID клиента:
xray uuid
# Сохраните вывод (например: 12345678-abcd-1234-abcd-1234567890ab) — это <XRAY_UUID>
  1. Пара ключей X25519 (Private & Public) для Reality:
xray x25519
# Сохраните Private key (<SERVER_B_PRIVATE_KEY>) и Public key (<SERVER_B_PUBLIC_KEY>)
  1. Short ID (идентификатор Reality):
openssl rand -hex 16
# Сохраните вывод (например: 0123456789abcdef0123456789abcdef) — это <SHORT_ID>

Конфигурация Сервера B (Нидерланды):

Создаем или редактируем файл /usr/local/etc/xray/config.json. Этот Xray-сервер будет слушать порт 443 и прозрачно пропускать валидный Reality трафик дальше, а "замаскированный" трафик (например, если кто-то стучится в лоб веб-браузером) пойдет на yahoo.com.

nano /usr/local/etc/xray/config.json

Содержимое файла:

{
  "log": {
    "loglevel": "error",
    "access": "none"
  },
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "<XRAY_UUID>"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "xhttp",
        "security": "reality",
        "realitySettings": {
          "dest": "yahoo.com:443",
          "serverNames": [
            "yahoo.com"
          ],
          "privateKey": "<SERVER_B_PRIVATE_KEY>",
          "shortIds": [
            "<SHORT_ID>"
          ]
        },
        "xhttpSettings": {
          "mode": "auto",
          "path": "/api/v3/sync"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ]
}

Открываем порт на фаерволе (если включен):

sudo ufw allow 443/tcp

Перезапускаем Xray:

sudo systemctl restart xray
sudo systemctl enable xray

Конфигурация Сервера A (РФ):

Аналогично, редактируем /usr/local/etc/xray/config.json. Здесь Xray выступает клиентом: он локально принимает трафик на порту 10443\tcp (от HAProxy) и упаковывает его в Reality до Сервера B, прося тот доставить данные на свой локальный порт 127.0.0.1:8443 (именно там будет слушать telemt).

nano /usr/local/etc/xray/config.json

Содержимое файла:

{
  "log": {
    "loglevel": "error",
    "access": "none"
  },
  "inbounds": [
    {
      "port": 10443,
      "listen": "127.0.0.1",
      "protocol": "dokodemo-door",
      "settings": {
        "address": "127.0.0.1",
        "port": 8443,
        "network": "tcp"
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "<PUBLIC_IP_SERVER_B>",
            "port": 443,
            "users": [
              {
                "id": "<XRAY_UUID>",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "xhttp",
        "security": "reality",
        "realitySettings": {
          "serverName": "yahoo.com",
          "publicKey": "<SERVER_B_PUBLIC_KEY>",
          "shortId": "<SHORT_ID>",
          "spiderX": "",
          "fingerprint": "chrome"
        },
        "xhttpSettings": {
          "mode": "auto",
          "path": "/api/v3/sync",
          "xmux": {
            "maxConcurrency": 256
          }
        }
      }
    }
  ]
}

Замените <PUBLIC_IP_SERVER_B> на внешний IP-адрес Сервера B.

Перезапускаем Xray:

sudo systemctl restart xray
sudo systemctl enable xray

Шаг 2. Настройка HAProxy на Сервере A (РФ)

HAProxy будет висеть на публичном порту 443 Сервера A, принимать подключения от Telegram-клиентов, добавлять заголовок PROXYv2 (чтобы пробросить реальный IP пользователя) и отправлять в локальный клиент Xray. Установка Docker аналогична инструкции AmneziaWG варианта.

[!WARNING] Если запускаете не под root или возникают проблемы с правами на 443 порт:

echo "net.ipv4.ip_unprivileged_port_start = 0" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Создаем папку для HAProxy:

mkdir -p /opt/docker-compose/haproxy && cd $_

Создаем файл docker-compose.yaml

services:
  haproxy:
    image: haproxy:latest
    container_name: haproxy
    restart: unless-stopped
    # user: "root"
    network_mode: "host"
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

Создаем файл конфигурации haproxy.cfg

global
    # Отключить детальные логи соединений под нагрузкой
    log stdout format raw local0 err
    maxconn 250000
    # Использовать все ядра CPU
    nbthread 2
    # Тюнинг буферов и приема сокетов
    tune.bufsize 16384
    tune.maxaccept 64

defaults
    log     global
    mode    tcp
    option  clitcpka
    option  srvtcpka
    timeout connect 5s
    timeout client  1h
    timeout server  1h
    # Быстрая очистка мертвых пиров
    timeout client-fin 10s
    timeout server-fin 10s

frontend proxy_in
    bind *:443
    maxconn 250000
    option tcp-smart-accept
    default_backend telemt_backend

backend telemt_backend
    option tcp-smart-connect
    # Send-Proxy-V2 обязателен для сохранения IP клиента внутри внутренней логики Telemt
    server telemt_core 127.0.0.1:10443 maxconn 250000 send-proxy-v2 check inter 5s

[!WARNING] Файл должен заканчиваться пустой строкой, иначе HAProxy не запустится!

Разрешаем порт 443\tcp в фаерволе и запускаем контейнер

sudo ufw allow 443/tcp
docker compose up -d

Шаг 3. Установка и настройка telemt на Сервере B (Нидерланды)

Установка telemt описана в основной инструкции. Отличие в том, что telemt должен слушать внутренний порт (так как 443 занят Xray-сервером), а также ожидать PROXY протокол из Xray туннеля.

В конфиге config.toml прокси (на Сервере B) укажите:

[server]
port = 8443
listen_addr_ipv4 = "127.0.0.1"
proxy_protocol = true

[general.links]
show = "*"
public_host = "<FQDN_OR_IP_SERVER_A>"
public_port = 443
  • port = 8443 и listen_addr_ipv4 = "127.0.0.1" означают, что telemt принимает подключения только изнутри (приходящие от локального Xray-процесса).
  • proxy_protocol = true заставляет telemt парсить PROXYv2-заголовок (который добавил HAProxy на Сервере A и протащил Xray), восстанавливая IP-адрес конечного пользователя (РФ).
  • В public_host укажите публичный IP-адрес или домен Сервера A, чтобы ссылки на подключение генерировались корректно.

Перезапустите telemt, и клиенты смогут подключаться по выданным ссылкам.