10 KiB
Концепция
- Сервер 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:
- UUID клиента:
xray uuid
# Сохраните вывод (например: 12345678-abcd-1234-abcd-1234567890ab) — это <XRAY_UUID>
- Пара ключей X25519 (Private & Public) для Reality:
xray x25519
# Сохраните Private key (<SERVER_B_PRIVATE_KEY>) и Public key (<SERVER_B_PUBLIC_KEY>)
- 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, и клиенты смогут подключаться по выданным ссылкам.