663 字
3 分钟
MTProxy 代理搭建
2019-02-08
2026-02-12

利用 Nginx SNI 分流隐藏 MTProto Proxy (mtg)#

在当前的防火墙环境下,直接暴露 MTProto 代理端口极易被精准识别并阻断。尝试利用 Nginx 的 stream 模块与 ssl_preread 功能,通过 SNI 分流技术mtg 隐藏在标准的 HTTPS(443 端口)流量中。

1. 方案优势#

  • 共用 443 端口:外部看来只是一个正常的 HTTPS 网站。
  • 主动探测防御:直接访问 IP 或错误域名只会看到普通的 Web 页面。
  • 协议混淆:结合 mtg 的 FakeTLS 特性,极大地提高了流量的隐蔽性。

2. 环境准备#

确保你的 Nginx 已经编译了 --with-stream--with-stream_ssl_preread_module 模块。你可以通过 nginx -V 命令查看。

Terminal window
wget https://raw.githubusercontent.com/findthewayxf/scripts/refs/heads/main/nginx13.sh
bash nginx13.sh

第一步:安装 mtg#

首先,下载并安装支持 FakeTLS 的 mtg

https://github.com/9seconds/mtg

Terminal window
# 设置 mtg 执行权限并移动到系统路径
chmod +x mtg
mv mtg /usr/local/bin/
mtg --version

第二步:生成 FakeTLS 密钥#

我们需要生成一个带有 ee 前缀的密钥,用于启用 Enhanced FakeTLS 模式。

Terminal window
# 生成密钥(请记录输出的密钥)
mtg generate-secret --hex mtg.test.com
# 示例输出:ee39489da88888888cf0f4bdfd1ad533a474756e6e656c2e788888888e6c69

3. 配置 mtg 服务#

创建配置文件#

新建 /etc/mtg/config.toml,并填入你的密钥:

secret = "你的生成的密钥"
bind-to = "127.0.0.1:3128" # 仅监听本地
domain-fronting-port = 443

创建 Systemd 服务#

为了保证 mtg 在后台稳定运行,创建服务文件 /etc/systemd/system/mtg.service

[Unit]
Description=MTPROTO Proxy
After=network.target
[Service]
ExecStart=/usr/local/bin/mtg run /etc/mtg/config.toml
Restart=always
RestartSec=3
DynamicUser=true
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target

启动服务:

Terminal window
systemctl daemon-reload
systemctl enable mtg --now
systemctl status mtg

4. Nginx 核心配置(SNI 分流)#

这是整套方案的“大脑”。修改 /etc/nginx/nginx.conf 或在 stream.d/ 目录下添加配置。

Nginx Stream 配置#

编辑 /etc/nginx/stream.d/mtg.conf

stream {
# 启用 ssl_preread 模块,读取 TLS ClientHello 中的 SNI
ssl_preread on;
map $ssl_preread_server_name $backend_name {
mtg.test.com mtg_backend; # 代理域名指向 mtg
www.test.com https_backend; # 正常域名指向网站
default https_backend; # 默认转发给网站
}
upstream mtg_backend {
server 127.0.0.1:3128;
}
upstream https_backend {
server 127.0.0.1:4443; # 网站后端监听内部端口
}
server {
listen 443;
proxy_pass $backend_name;
}
}

Nginx Web 配置#

确保你的 Web 服务(如 www.test.com)监听在内部端口 4443 上:

/etc/nginx/conf.d/mtg-server.conf

server {
listen 127.0.0.1:4443 ssl;
server_name www.test.com;
ssl_certificate /etc/nginx/ssl/crt.crt;
ssl_certificate_key /etc/nginx/ssl/key.key;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

5. 总结与注意事项#

配置完成后,重启 Nginx:systemctl restart nginx

  1. 域名选择:建议为 mtg 使用一个真实的二级域名,并为其配置合法的 SSL 证书(尽管 mtg 处理的是 FakeTLS)。
  2. 流量指纹:虽然本方案能隐藏协议特征,但大流量、长时间的连接依然可能被流量统计学识别。建议定期更换 secret
  3. 安全加固:建议配合 fail2ban 或防火墙策略,禁止 443 以外的不必要端口暴露。
MTProxy 代理搭建
https://harlon.me/posts/2019/02/08/mtproxy-代理搭建/
作者
Harlon
发布于
2019-02-08
许可协议
CC BY-NC-SA 4.0