From 5723d50d0b801ef1441385bd163171582ad6b1e1 Mon Sep 17 00:00:00 2001 From: Alexander <32452033+avbor@users.noreply.github.com> Date: Sun, 22 Mar 2026 20:04:14 +0300 Subject: [PATCH] Create VPS_DOUBLE_HOP.ru.md Added VPS double hop with AmneziaWG manual --- docs/VPS_DOUBLE_HOP.ru.md | 287 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 docs/VPS_DOUBLE_HOP.ru.md diff --git a/docs/VPS_DOUBLE_HOP.ru.md b/docs/VPS_DOUBLE_HOP.ru.md new file mode 100644 index 0000000..625c64c --- /dev/null +++ b/docs/VPS_DOUBLE_HOP.ru.md @@ -0,0 +1,287 @@ + + +## Концепция +- **Сервер 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](https://github.com/amnezia-vpn/amneziawg-linux-kernel-module).\ +Далее все команды даны для **Ununtu 24.04**.\ +Для RHEL-based дистрибутивов инструкция по установке есть по ссылке выше. + +### Установка AmneziaWG (Сервера A и B) +На каждом из серверов необходимо выполнить следующие шаги: + +#### 1. Добавление репозитория AmneziaWG и установка необходимых пакетов: +```bash +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. Генерация уникальной пары ключей: +```bash +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)](https://docs.amnezia.org/documentation/amnezia-wg/) нужно указывать на стороне _клиента_ (Сервер **А**). + +Рекомендации по выбору значений: +```text +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] +> Рекомендуется использовать собственные, уникальные значения.\ +> Для выбора параметров можете воспользоваться [генератором](https://htmlpreview.github.io/?https://gist.githubusercontent.com/avbor/955782b5c37b06240b243aa375baeac5/raw/e8b269ff0089a27effd88f8d925179b78e5666c4/awg-gen.html). + +#### Конфигурация Сервера B (_Нидерланды_): + +Создаем файл конфигурации интерфейса (`awg0`) +```bash +nano /etc/amnezia/amneziawg/awg0.conf +``` + +Содержимое файла +```ini +[Interface] +Address = 10.10.10.1/24 +ListenPort = 8443 +PrivateKey = +SaveConfig = true +Jc = 4 +Jmin = 8 +Jmax = 80 +S1 = 29 +S2 = 15 +H1 = 2087563914 +H2 = 188817757 +H3 = 101784570 +H4 = 432174303 + +[Peer] +PublicKey = +AllowedIPs = 10.10.10.2/32 +``` + +`ListenPort` - порт, на котором сервер будет ждать подключения, можете выбрать любой свободный.\ +`` - содержимое файла `private.key` с сервера **B**.\ +`` - содержимое файла `public.key` с сервера **A**. + +Открываем порт на фаерволе (если включен): +```bash +sudo ufw allow from to any port 8443 proto udp +``` + +`` - внешний IP адрес Сервера **A**. + +#### Конфигурация Сервера A (_РФ_): + +Создаем файл конфигурации интерфейса (`awg0`) +```bash +nano /etc/amnezia/amneziawg/awg0.conf +``` + +Содержимое файла +```ini +[Interface] +Address = 10.10.10.2/24 +PrivateKey = +Jc = 4 +Jmin = 8 +Jmax = 80 +S1 = 29 +S2 = 15 +H1 = 2087563914 +H2 = 188817757 +H3 = 101784570 +H4 = 432174303 +I1 = +I2 = +I3 = +I4 = +I5 = + +[Peer] +PublicKey = +Endpoint = :8443 +AllowedIPs = 10.10.10.1/32 +PersistentKeepalive = 25 +``` + +`` - содержимое файла `private.key` с сервера **A**.\ +`` - содержимое файла `public.key` с сервера **B**.\ +`` - публичный IP адресс сервера **B**. + +#### Включаем туннель на обоих серверах: +```bash +sudo systemctl enable --now awg-quick@awg0 +``` + +Убедитесь, что с Сервера `A` доступен Сервер `B` через туннель. +```bash +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 (_условно Нидерланды_) + +Установка и настройка описаны [здесь](https://github.com/telemt/telemt/blob/main/docs/QUICK_START_GUIDE.ru.md) или [здесь](https://gitlab.com/An0nX/telemt-docker#-quick-start-docker-compose).\ +Подразумевается что telemt ожидает подключения на порту `443\tcp`. + +В конфиге telemt необходимо включить протокол `Proxy` и ограничить подключения к нему только через туннель. + +```toml +[server] +port = 443 +listen_addr_ipv4 = "10.10.10.1" +proxy_protocol = true +``` + +А также, для правильной генерации ссылок, указать FQDN или IP адрес и порт Сервера `A` + +```toml +[general.links] +show = "*" +public_host = "" +public_port = 443 +``` + +Открываем порт на фаерволе (если включен): +```bash +sudo ufw allow from 10.10.10.2 to any port 443 proto tcp +``` + +--- + +### Шаг 3. Настройка HAProxy на Сервере A (_РФ_) + +Т.к. в стандартном репозитории Ubuntu версия относительно старая, имеет смысл воспользоваться официальным образом Docker.\ +[Инструкция](https://docs.docker.com/engine/install/ubuntu/) по установке 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 +> ``` +> или +> +> 2. Запустить HAProxy под root:\ +> Раскомментируйте в docker-compose.yaml параметр `user: "root"`. + +#### Создаем папку для HAProxy: +```bash +mkdir -p /opt/docker-compose/haproxy && cd $_ +``` +#### Создаем файл docker-compose.yaml + +`nano docker-compose.yaml` + +Содержимое файла +```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` + +Содержимое файла +```haproxy +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 в фаерволе (если включен) +```bash +sudo ufw allow 443/tcp +``` + +#### Запускаем контейнер HAProxy +```bash +docker compose up -d +``` + +Если все настроено верно, то теперь можно пробовать подключить клиентов Telegram с использованием ссылок из лога\api telemt.