MTProto 代理在单一 443 端口上通过 SNI 路由实现
为 Telegram 开发 MTProto 代理的开发者常面临 IP 和端口被快速封锁的问题。解决方案是利用 nginx 流模块和基于 SNI 的路由,在单一 443 端口上组织多个代理。这能将流量伪装成热门域名,无需更换 IP 即可扩展网络。
该方法分为控制面板和服务器代理两部分。面板生成配置,代理则部署 Docker 容器。每个代理从域名池(如 wikipedia.org、netflix.com)获取唯一的 SNI。Nginx 分析 SNI 并将 TLS 连接重定向到对应的容器。
此方案的优势:
- 所有代理均使用标准 HTTPS 端口
- 伪装成合法流量
- 可扩展至多个容器而无需更改端口
- 通过 Web 界面实现自动化管理
配置 nginx 实现流路由
关键要素是 nginx 流块中的 ssl_preread 模块。它能在不解密 TLS 的情况下提取 SNI,确保零延迟和对客户端的完全透明。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
}
stream {
resolver 127.0.0.11 valid=10s;
log_format proxy '$remote_addr [$time_local] $ssl_preread_server_name $status';
access_log /dev/stdout proxy;
map $ssl_preread_server_name $backend {
en.wikipedia.org mtproto-proxy-3d9d46ba:443;
netflix.com mtproto-proxy-475ecb29:443;
assets.msn.com mtproto-proxy-3f8875a4:443;
default mtproto-proxy-3d9d46ba:443;
}
server {
listen 443;
proxy_pass $backend;
ssl_preread on;
proxy_connect_timeout 10s;
proxy_timeout 300s;
}
}
重要参数:
resolver 127.0.0.11— Docker 网络内的 DNSworker_connections 4096— 高并发限制- 针对移动连接优化的超时设置
- SNI 日志记录用于调试封锁
控制面板与代理架构
控制面板(Node.js/Go)独立于代理服务器运行。服务器上的代理接收 API 命令,并基于 telemt/telemt 镜像管理 Docker 容器。
代理创建流程:
- 面板生成密钥并从池中选择 SNI
- 将配置发送给代理
- 代理运行
docker run并创建唯一卷 - Nginx 重新加载并添加新的映射块
域名池需手动更新,排除已封锁的 CDN。每个域名严格用于一个代理。
扩展性与抗封锁能力
测试显示,使用非标准端口(4443+)的代理在 15-20 名用户下 3-4 天内会被封锁。而采用 443 端口和 SNI 路由的方案,在 50+ 设备下能维持超过 7 天的寿命。
操作建议:
- 使用无深度包检测(DPI)的司法管辖区 VPS(如德国、荷兰)
- 每 7-10 天轮换 SNI
- 监控 nginx 日志以识别封锁模式
- 限制每个代理的用户数(最多 20-30 人)
为实现容错,可在多个 VPS 上部署代理,并统一使用一个面板域名。
关键要点
- 单一 443 端口:将 MTProto 伪装成 HTTPS 流量
- SNI 路由:允许在一个 IP 上运行 10+ 代理而无冲突
- 自动化:面板 + 代理最小化手动操作
- 抗封锁性:在 50+ 连接下寿命超过 7 天
- 可扩展性:轻松添加新节点
— Editorial Team
暂无评论。