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