telemt/docs/VPS_DOUBLE_HOP.ru.md

11 KiB
Raw Blame History

Концепция

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

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

На всех серверах необходимо установить amneziawg.
Далее все команды даны для Ununtu 24.04.
Для RHEL-based дистрибутивов инструкция по установке есть по ссылке выше.

Установка AmneziaWG (Сервера A и B)

На каждом из серверов необходимо выполнить следующие шаги:

1. Добавление репозитория AmneziaWG и установка необходимых пакетов:

sudo apt install -y software-properties-common python3-launchpadlib gnupg2 linux-headers-$(uname -r) && \
sudo add-apt-repository ppa:amnezia/ppa && \
sudo apt-get install -y amneziawg

2. Генерация уникальной пары ключей:

cd /etc/amnezia/amneziawg && \
awg genkey | tee private.key | awg pubkey > public.key

В результате вы получите в папке /etc/amnezia/amneziawg два файла:
private.key - приватный и
public.key - публичный ключи сервера

3. Настройка сетевых интерфейсов:

Параметры обфускации S1, S2, H1, H2, H3, H4 должны быть строго идентичными на обоих серверах.
Параметры Jc, Jmin и Jmax могут отличатся.
Параметры I1-I5 (Custom Protocol Signature) нужно указывать на стороне клиента (Сервер А).

Рекомендации по выбору значений:

Jc — 1 ≤ Jc ≤ 128; от 4 до 12 включительно
Jmin — Jmax > Jmin < 1280*; рекомендовано 8
Jmax — Jmin < Jmax ≤ 1280*; рекомендовано 80
S1 — S1 ≤ 1132* (1280* - 148 = 1132); S1 + 56 ≠ S2;
рекомендованный диапазон от 15 до 150 включительно
S2 — S2 ≤ 1188* (1280* - 92 = 1188);
рекомендованный диапазон от 15 до 150 включительно
H1/H2/H3/H4 — должны быть уникальны и отличаться друг от друга;
рекомендованный диапазон от 5 до 2147483647 включительно

* Предполагается, что подключение к Интернету имеет MTU 1280.

[!IMPORTANT] Рекомендуется использовать собственные, уникальные значения.
Для выбора параметров можете воспользоваться генератором.

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

Создаем файл конфигурации интерфейса (awg0)

nano /etc/amnezia/amneziawg/awg0.conf

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

[Interface]
Address = 10.10.10.1/24
ListenPort = 8443
PrivateKey = <PRIVATE_KEY_SERVER_B>
SaveConfig = true
Jc = 4
Jmin = 8
Jmax = 80
S1 = 29
S2 = 15
H1 = 2087563914
H2 = 188817757
H3 = 101784570
H4 = 432174303

[Peer]
PublicKey = <PUBLIC_KEY_SERVER_A>
AllowedIPs = 10.10.10.2/32

ListenPort - порт, на котором сервер будет ждать подключения, можете выбрать любой свободный.
<PRIVATE_KEY_SERVER_B> - содержимое файла private.key с сервера B.
<PUBLIC_KEY_SERVER_A> - содержимое файла public.key с сервера A.

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

sudo ufw allow from <PUBLIC_IP_SERVER_A> to any port 8443 proto udp

<PUBLIC_IP_SERVER_A> - внешний IP адрес Сервера A.

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

Создаем файл конфигурации интерфейса (awg0)

nano /etc/amnezia/amneziawg/awg0.conf

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

[Interface]
Address = 10.10.10.2/24
PrivateKey = <PRIVATE_KEY_SERVER_A>
Jc = 4
Jmin = 8
Jmax = 80
S1 = 29
S2 = 15
H1 = 2087563914
H2 = 188817757
H3 = 101784570
H4 = 432174303
I1 = <b 0xc10000000108981eba846e21f74e00>
I2 = <b 0xc20000000108981eba846e21f74e00>
I3 = <b 0xc30000000108981eba846e21f74e00>
I4 = <b 0x43981eba846e21f74e>
I5 = <b 0x43981eba846e21f74e>

[Peer]
PublicKey = <PUBLIC_KEY_SERVER_B>
Endpoint = <PUBLIC_IP_SERVER_B>:8443
AllowedIPs = 10.10.10.1/32
PersistentKeepalive = 25

<PRIVATE_KEY_SERVER_A> - содержимое файла private.key с сервера A.
<PUBLIC_KEY_SERVER_B> - содержимое файла public.key с сервера B.
<PUBLIC_IP_SERVER_B> - публичный IP адресс сервера B.

Включаем туннель на обоих серверах:

sudo systemctl enable --now awg-quick@awg0 

Убедитесь, что с Сервера A доступен Сервер B через туннель.

ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=35.1 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=35.0 ms
64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=35.1 ms
^C


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

Установка и настройка описаны здесь или здесь.
Подразумевается что telemt ожидает подключения на порту 443\tcp.

В конфиге telemt необходимо включить протокол Proxy и ограничить подключения к нему только через туннель.

[server]
port = 443
listen_addr_ipv4 = "10.10.10.1"
proxy_protocol = true

А также, для правильной генерации ссылок, указать FQDN или IP адрес и порт Сервера A

[general.links]
show = "*"
public_host = "<FQDN_OR_IP_SERVER_A>"
public_port = 443

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

sudo ufw allow from 10.10.10.2 to any port 443 proto tcp

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

Т.к. в стандартном репозитории Ubuntu версия относительно старая, имеет смысл воспользоваться официальным образом Docker.
Инструкция по установке Docker на Ubuntu.

[!WARNING] По умолчанию у обычных пользователей нет прав на использование портов < 1024.
Попытки запустить HAProxy на 443 порту могут приводить к ошибкам:

[ALERT] (8) : Binding [/usr/local/etc/haproxy/haproxy.cfg:17] for frontend tcp_in_443: 
protocol tcpv4: cannot bind socket (Permission denied) for [0.0.0.0:443].

Есть два простых способа обойти это ограничение, выберите что-то одно:

  1. На уровне ОС изменить настройку net.ipv4.ip_unprivileged_port_start, разрешив пользователям использовать все порты:
echo "net.ipv4.ip_unprivileged_port_start = 0" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

или

  1. Запустить HAProxy под root:
    Раскомментируйте в docker-compose.yaml параметр user: "root".

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

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

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

nano 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

Принимаем подключения на порту 443\tcp и отправляем их через туннель на Сервер B 10.10.10.1:443

nano 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 server_a 10.10.10.1:443 check inter 5s rise 2 fall 3 send-proxy-v2


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

Разрешаем порт 443\tcp в фаерволе (если включен)

sudo ufw allow 443/tcp

Запускаем контейнер HAProxy

docker compose up -d

Если все настроено верно, то теперь можно пробовать подключить клиентов Telegram с использованием ссылок из лога\api telemt.