11 KiB
Концепция
- Сервер 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].Есть два простых способа обойти это ограничение, выберите что-то одно:
- На уровне ОС изменить настройку net.ipv4.ip_unprivileged_port_start, разрешив пользователям использовать все порты:
echo "net.ipv4.ip_unprivileged_port_start = 0" | sudo tee -a /etc/sysctl.conf && sudo sysctl -pили
- Запустить 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.