Warning
Инструкция переехала в основной репозиторий telemt.
Здесь остается копия, но без гарантии актуальности.
- Сервер 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
На всех серверах необходимо установить amneziawg.
Далее все команды даны для Ununtu 24.04.
Для RHEL-based дистрибутивов инструкция по установке есть по ссылке выше.
На каждом из серверов необходимо выполнить следующие шаги:
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 amneziawgcd /etc/amnezia/amneziawg && \
awg genkey | tee private.key | awg pubkey > public.keyВ результате вы получите в папке /etc/amnezia/amneziawg два файла:
private.key - приватный и
public.key - публичный ключи сервера
Параметры обфускации 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
Рекомендуется использовать собственные, уникальные значения.
Для выбора параметров можете воспользоваться генератором.
Создаем файл конфигурации интерфейса (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
S3 = 18
S4 = 0
H1 = 2087563914
H2 = 188817757
H3 = 101784570
H4 = 432174303
[Peer]
PublicKey = <PUBLIC_KEY_SERVER_A>
AllowedIPs = 10.10.10.2/32ListenPort - порт, на котором сервер будет ждать подключения, можете выбрать любой свободный.
<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.
Создаем файл конфигурации интерфейса (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
S3 = 18
S4 = 0
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
Установка и настройка описаны здесь или здесь.
Подразумевается что 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Т.к. в стандартном репозитории 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".
mkdir -p /opt/docker-compose/haproxy && cd $_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"Принимаем подключения на порту 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 не запустится!
sudo ufw allow 443/tcpdocker compose up -dЕсли все настроено верно, то теперь можно пробовать подключить клиентов Telegram с использованием ссылок из лога\api telemt.