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": "tcp",
        "security": "reality",
        "realitySettings": {
          "dest": "yahoo.com:443",
          "serverNames": [
            "yahoo.com"
          ],
          "privateKey": "<SERVER_B_PRIVATE_KEY>",
          "shortIds": [
            "<SHORT_ID>"
          ]
        }
      },
      "sockopt": {
        "tcpFastOpen": true,
        "tcpNoDelay": true,
        "tcpKeepAliveIdle": 60,
        "tcpKeepAliveInterval": 15
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct",
      "settings": {
        "destination": "127.0.0.1:8443"
      }
    }
  ],
  "routing": {
    "rules": [
      {
        "type": "field",
        "inboundTag": ["all-in"],
        "outboundTag": "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": "tcp",
        "security": "reality",
        "realitySettings": {
          "serverName": "yahoo.com",
          "publicKey": "<SERVER_B_PUBLIC_KEY>",
          "shortId": "<SHORT_ID>",
          "spiderX": "",
          "fingerprint": "chrome"
        },
        "sockopt": {
          "tcpFastOpen": true,
          "tcpNoDelay": true,
          "tcpKeepAliveIdle": 60,
          "tcpKeepAliveInterval": 15
        }
      },
      "mux": {
        "enabled": true,
        "concurrency": 256,
        "xudpConcurrency": 16,
        "xudpProxyUDP443": "reject"
      }
    }
  ]
}

Замените <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
    maxconn 10000

defaults
    log     global
    mode    tcp
    option  tcplog
    option  clitcpka
    option  srvtcpka
    timeout connect 5s
    timeout client  2h
    timeout server  2h
    timeout check   5s

frontend tcp_in_443
    bind *:443
    maxconn 8000
    option tcp-smart-accept
    default_backend telemt_nodes

backend telemt_nodes
    option tcp-smart-connect
    server telemt_core 127.0.0.1:10443 check inter 5s rise 2 fall 3 maxconn 250000 send-proxy-v2

[!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, и клиенты смогут подключаться по выданным ссылкам.