MTProxy na portu 443 s Nginx: Skryté nastavení pro Telegram
Tento článek se věnuje aktuálnímu úkolu pro systémové administrátory a vývojáře: nasazení Telegram MTProxy na standardním HTTPS portu 443, aniž by narušil provoz stávajících webových služeb běžících pod Nginx. Taková konfigurace výrazně zvyšuje odolnost proxy proti detekci a blokování, maskuje jeho provoz jako běžný webový provoz. Hlavní složitost spočívá v tom, že Nginx musí správně směrovat požadavky, rozlišovat cílové HTTP/HTTPS weby a MTProxy, přičemž používá stejný port. Tento průvodce podrobně popisuje mechanismus fungování stream modulu Nginx a jeho integraci s mtprotoproxy pro vytvoření spolehlivého a nenápadného řešení.
Mechanismus fungování Nginx Stream pro multiplexování
Pro úspěšné soužití MTProxy a Nginx na portu 443 je zapotřebí inteligentní mechanismus směrování. Modul Nginx stream, fungující na úrovni TCP/UDP, umožňuje analyzovat počáteční data spojení před plnohodnotným zpracováním na aplikační úrovni. Klíčovým aspektem je, že pole Server Name Indication (SNI) ve zprávě TLS ClientHello je přenášeno v otevřené podobě, a to i pro šifrovaná spojení. To dává Nginx možnost přečíst požadované jméno hostitele bez dešifrování celého SSL toku.
Předkládané řešení využívá následující logiku:
- Přesměrování portů pro HTTPS hosty: Všechny stávající HTTPS virtuální hosty Nginx, které dříve naslouchaly na portu 443, jsou přesunuty na interní port, například 4443. Tím se uvolní port 443 pro centralizovaný obslužný program.
- Nginx Stream jako centrální směrovač: Na uvolněném portu 443 je nastaven Nginx
streamserver. Tento server používá direktivussl_preread onpro extrakci SNI z příchozích SSL spojení. - Dynamické směrování: Na základě získaného SNI se Nginx
streamrozhoduje:
* Pokud SNI odpovídá vybranému doménovému jménu pro MTProxy (například myprovider.ru), spojení je přesměrováno na MTProxy (který bude naslouchat na lokálním portu, například 7788).
* Pokud SNI odpovídá jakémukoli jinému doménovému jménu, spojení je přesměrováno zpět na Nginx, ale již na interní port 4443, kde bude zpracováno standardními HTTPS virtuálními hosty.
- Zachování reálné IP adresy: Pro správnou funkci logování a analýzy provozu, stejně jako pro správnou činnost aplikací za Nginxem, se používá
proxy_protocol. To umožňuje přenášet skutečnou IP adresu klienta po řetězci proxy.
Tento přístup umožňuje MTProxy maskovat se jako běžný HTTPS provoz, používající stejný port jako webový server, což výrazně zvyšuje jeho odolnost proti detekci a blokování, a činí jeho provoz nerozeznatelným od standardních webových spojení.
Nastavení Nginx pro kompromisní režim
Prvním krokem je úprava konfigurace všech stávajících HTTPS virtuálních hostů Nginx. Je nutné změnit port, na kterém naslouchají, z 443 na interní, například 127.0.0.1:4443. To zajistí, že Nginx bude zpracovávat tyto požadavky poté, co je modul stream přesměruje.
Příklad změny konfigurace server bloku:
server {
server_name mywebsite.ru;
listen 127.0.0.1:4443 ssl http2 proxy_protocol;
set_real_ip_from 127.0.0.1; # Důvěřujeme localhostu jako zdroji PROXY Protocol
real_ip_header proxy_protocol; # Extrahujeme IP z hlavičky PROXY Protocol
real_ip_recursive on; # Aplikujeme rekurzivně pro správné určení IP
# ... ostatní direktivy vašeho server bloku ...
ssl_certificate /etc/letsencrypt/live/mywebsite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mywebsite.ru/privkey.pem;
# ... další SSL/TLS nastavení ...
}
Direktiva proxy_protocol v listen instruuje Nginx, aby očekával hlavičku PROXY Protocol. set_real_ip_from a real_ip_header jsou kriticky důležité pro to, aby Nginx správně identifikoval a předával skutečnou IP adresu klienta, nikoli IP lokálního hostitele (127.0.0.1), která bude použita Nginx Stream. Bez těchto nastavení by všechny požadavky na vaše weby vypadaly, jako by pocházely z 127.0.0.1, což by mohlo narušit funkčnost aplikací, logování a bezpečnostních systémů.
Dalším krokem je vytvoření nového konfiguračního souboru pro modul stream Nginx. Doporučuje se umístit jej do /etc/nginx/conf.d/stream.conf nebo na jiné vhodné místo, které zajistí jeho načtení Nginxem.
stream {
log_format stream '$remote_addr [$time_local] host=$ssl_preread_server_name '
'prot=$protocol status=$status out=$bytes_sent in=$bytes_received';
# Volitelně: zapněte logování pro ladění
#access_log /var/log/nginx/stream_access.log stream;
#error_log /var/log/nginx/stream_error.log;
map $ssl_preread_server_name $backend_name {
myprovider.ru tg_proxy; # Provoz pro vybranou doménu MTProxy
default nginx_https; # Veškerý ostatní HTTPS provoz
}
upstream nginx_https {
server 127.0.0.1:4443; # Přesměrováváme na interní port Nginx
}
upstream tg_proxy {
server 127.0.0.1:7788; # Přesměrováváme na lokální port MTProxy
}
server {
listen 443 reuseport; # Nasloucháme na hlavním portu 443
proxy_pass $backend_name;
ssl_preread on; # Zapínáme čtení SNI pro určení hostname
proxy_protocol on; # Zapínáme PROXY Protocol pro přenos reálné IP
}
}
V tomto bloku map se používá pro mapování SNI ($ssl_preread_server_name) na název backendu. $backend_name bude buď tg_proxy, nebo nginx_https v závislosti na požadované doméně. Direktiva upstream definuje, kam přesně bude provoz pro každý backend přesměrován. listen 443 reuseport umožňuje několika procesům Nginx naslouchat na stejném portu, což zvyšuje výkon a odolnost proti chybám. ssl_preread on je klíčová direktiva, která umožňuje Nginx získat SNI bez dešifrování celého SSL provozu.
Pokud váš aktuální Nginx nepodporuje stream modul (například se jedná o minimální sestavení), je nutné jej nainstalovat. Pro Debian/Ubuntu se to provede příkazem:
sudo apt install nginx-full
Po provedení všech změn je nutné zkontrolovat konfiguraci Nginx a restartovat jej:
nginx -t && sudo systemctl restart nginx
Použití systemctl restart namísto service nginx restart je modernější a preferovaný přístup v systémech založených na systemd.
Instalace a konfigurace MTProxy
Pro implementaci MTProxy v tomto schématu bude použita vysoce efektivní Python implementace mtprotoproxy od alexberse, která se dobře integruje s Nginx proxy_protocol a podporuje požadovaný režim TLS maskování.
Proces instalace zahrnuje klonování repozitáře a přepnutí na aktuální větev:
(cd /opt || sudo mkdir /opt && sudo chown $(whoami):$(whoami) /opt) && cd /opt
git clone https://github.com/alexbers/mtprotoproxy.git
cd mtprotoproxy
# Důležité: v době psaní článku je stabilní provoz s touto konfigurací dosažen na větvi master
git checkout master
Dále následuje generování tajemství pro MTProxy. Toto tajemství bude používáno klienty Telegramu pro autentizaci a musí být unikátní:
head -c 16 /dev/urandom | xxd -ps
Získanou 32znakovou hexadecimální hodnotu je třeba uložit. Nyní je nutné vytvořit nebo upravit soubor config.py v adresáři mtprotoproxy:
# /opt/mtprotoproxy/config.py
PORT = 7788 # Lokální port, na který Nginx Stream bude přesměrovávat provoz
LISTEN_ADDR_IPV4 = "127.0.0.1" # Vazba na localhost pro zajištění bezpečnosti
LISTEN_ADDR_IPV6 = None # Vypnout IPv6, pokud není potřeba nebo není nastaveno
# Slovník uživatelů a jejich tajemství. Lze vytvořit několik pro různé skupiny.
USERS = {
"tg_user_1": "VAŠE_VYGENEROVANÉ_TAJEMSTVÍ_ZDE",
# "tg_user_2": "0123456789abcdef0123456789abcdef", # Příklad dodatečného tajemství
}
# Režimy provozu MTProxy
MODES = {
"classic": False, # Klasický režim, snadno detekovatelný
"secure": False, # Vylepšený režim, ale není optimální pro maskování
"tls": True # Režim TLS maskování, nejodolnější proti detekci
}
# Doména pro režim TLS. MTProxy bude kontrolovat její dostupnost při spuštění.
# Použijte doménu, kterou jste vybrali v konfiguraci Nginx Stream.
TLS_DOMAIN = "myprovider.ru" # Doména, která bude použita pro MTProxy
PROXY_PROTOCOL = True # Povinné nastavení pro práci s Nginx Stream
# AD_TAG = "ZÍSKEJTE_VÁŠ_AD_TAG_OD_@MTProxybot" # Volitelně: pro reklamní tag
Klíčová nastavení zde jsou: LISTEN_ADDR_IPV4 = "127.0.0.1" zajišťuje, že MTProxy bude dostupný pouze přes Nginx na stejném serveru, čímž se zvyšuje bezpečnost. MODES = {"tls": True} aktivuje režim TLS maskování, který činí provoz MTProxy nerozeznatelným od běžného HTTPS. TLS_DOMAIN musí odpovídat doménovému jménu uvedenému v direktivě map Nginx Stream, aby Nginx mohl správně identifikovat a přesměrovat provoz. A konečně, PROXY_PROTOCOL = True umožňuje MTProxy přijímat skutečnou IP adresu klienta od Nginx, což je důležité pro správnou funkci a logování.
Ověření a automatizace spouštění
Po nastavení Nginx a MTProxy je nutné pečlivě zkontrolovat funkčnost celého systému.
Ověření funkčnosti MTProxy a Nginx
- Ruční spuštění MTProxy: Přejděte do adresáře
/opt/mtprotoproxya spusťte MTProxy ručně pro počáteční ověření:
```bash
python3 mtprotoproxy.py
```
V konzoli by se měl objevit řádek s parametry pro připojení k proxy, například:
```
tg_user_1: tg://proxy?server=IP_VAŠEHO_VIRTUÁLNÍHO_SERVERU&port=7788&secret=DLOUHÉ_TAJEMSTVÍ
```
Důležitý detail: Tajemství zobrazené zde bude mít prefix ee a bude obsahovat zakódované doménové jméno TLS_DOMAIN, uvedené v config.py. To je součástí mechanismu TLS maskování. Zkopírujte tento odkaz.
- Testování s klientem Telegramu:
* Ve zkopírovaném odkazu změňte port z 7788 na 443.
* Odešlete výsledný odkaz sobě do "Uložených zpráv" v Telegramu.
* Klikněte na odkaz a zvolte "Připojit".
* Pokud je vše správně nastaveno, Telegram by se měl úspěšně připojit přes proxy. Pro dodatečnou kontrolu můžete poslat příkaz /ping libovolnému botovi (například @MTProxybot) – v odpovědi by měla přijít zpráva s aktuálním pingem proxy.
- Ověření maskování pod HTTPS: Abyste se ujistili, že MTProxy správně maskuje provoz jako běžný web, je nutné provést následující kontrolu:
* Přidejte do vašeho lokálního souboru hosts (pro Linux/macOS je to /etc/hosts, pro Windows – %SystemRoot%\System32\drivers\etc\hosts) řádek:
```
IP_VAŠEHO_VIRTUÁLNÍHO_SERVERU myprovider.ru
```
Nahraďte IP_VAŠEHO_VIRTUÁLNÍHO_SERVERU skutečnou IP adresou vašeho serveru.
* Otevřete v prohlížeči https://myprovider.ru.
* Pokud vše funguje správně, měli byste vidět obsah webu myprovider.ru (webu vašeho poskytovatele nebo jakékoli jiné domény, kterou jste uvedli v TLS_DOMAIN). To potvrzuje, že Nginx Stream přesměroval požadavek na MTProxy, a MTProxy, rozpoznávající jej jako netelegramový provoz, jej transparentně proxyoval na původní webový zdroj, čímž demonstroval úspěšné TLS maskování.
* Nezapomeňte odstranit přidaný řádek ze souboru hosts po ověření.
Nastavení MTProxy jako systémové služby (Systemd)
Pro zajištění automatického spouštění MTProxy při startu systému a jeho nepřetržitého provozu se doporučuje nastavit jej jako službu systemd.
- Zastavte ručně spuštěný MTProxy (
Ctrl+C). - Vytvořte soubor jednotky
systemdna cestě/etc/systemd/system/mtprotoproxy.service:
```ini
[Unit]
Description=MTProto Proxy
After=network.target
[Service]
Type=simple
User=nobody
Group=nogroup
WorkingDirectory=/opt/mtprotoproxy
ExecStart=/usr/bin/python3 /opt/mtprotoproxy/mtprotoproxy.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
```
Zde User=nobody a Group=nogroup zvyšují bezpečnost spuštěním služby s minimálními oprávněními. WorkingDirectory ukazuje na adresář, kde se nachází skript mtprotoproxy.py.
- Znovu načtěte konfiguraci
systemd, povolte službu a spusťte ji:
```bash
sudo systemctl daemon-reload
sudo systemctl enable mtprotoproxy.service
sudo systemctl start mtprotoproxy.service
```
- Zkontrolujte stav služby:
```bash
systemctl status mtprotoproxy.service
```
Ve výstupu by mělo být uvedeno, že služba je active (running).
- Prohlížení logů: Pro ladění nebo monitorování použijte:
```bash
journalctl -u mtprotoproxy.service -e
```
Toto komplexní nastavení umožňuje používat Telegram MTProxy na portu 443, efektivně jej maskovat jako běžný HTTPS provoz, a zároveň zachovat plnou funkčnost stávajících webových stránek na stejném serveru.
Co je důležité:
- Použití
ssl_prereadv Nginx Stream umožňuje směrovat provoz na základě SNI bez dešifrování, což je kritické pro oddělení MTProxy a HTTPS provozu na jednom portu. - Nastavení
proxy_protocolv Nginx a MTProxy zajišťuje přenos skutečné IP adresy klienta, což je důležité pro logování a bezpečnost. - MTProxy je konfigurován v režimu
tls: Trues uvedenímTLS_DOMAIN, aby provoz proxy byl nerozeznatelný od běžného HTTPS spojení s touto doménou. - Vázání MTProxy na
127.0.0.1zvyšuje bezpečnost omezením přímého externího přístupu. - Systémová služba
systemdzaručuje automatické spouštění a monitorování MTProxy, čímž zajišťuje jeho nepřetržitý provoz.
— Editorial Team
Zatím žádné komentáře.