Telegram 的 MTProto Proxy 是一个运行在服务器端的应用程序,用于为 Telegram 消息服务提供安全且经过混淆的访问,主要用于绕过互联网审查,并通过中间服务器转发流量来提升隐私性。
什么是 MTProto Proxy?
MTProto Proxy 是专为 Telegram 消息协议(MTProto)定制的一类代理服务器。与普通的 SOCKS5 或 HTTP 代理不同,MTProto Proxy 直接实现 MTProto 协议,因此能与 Telegram 客户端无缝集成。它的主要作用是混淆 Telegram 流量,使其在深度包检测(DPI)系统看来与普通 HTTPS 流量难以区分。在 Telegram 被屏蔽或受限的环境中,这一能力至关重要。
主要特点:
* 协议专用: 直接处理 Telegram 的 MTProto 协议。
* 混淆: 加密并伪装 Telegram 流量以规避审查。
* 服务器端: 需要部署在独立服务器(VPS)上。
* 客户端集成: Telegram 客户端原生支持 MTProto 代理。
部署前提条件
搭建 MTProto Proxy 需要一台虚拟专用服务器(VPS)和基本的 Linux 管理知识。
- 服务器: 具备 root 权限的 VPS。
- 操作系统: 常用且支持良好的是 Debian 或 Ubuntu Linux 发行版,CentOS 同样可行。
- 资源: 基础代理对 CPU 和内存要求极低。512MB 内存和 1 vCPU 通常足以支撑数百名并发用户。
- 网络: 一个用于接收入站连接的开放端口(出于混淆考虑常用默认的 443 或 80,但任意端口均可配置)。
- 权限: 服务器上的 root 或 sudo 权限。
- 工具: 基本的 Linux 命令行工具(例如
ssh、curl、apt或yum、systemctl、ufw或iptables)。
搭建 MTProto Proxy 服务器
部署 MTProto Proxy 常用两种方法:使用官方 Telegram 代理程序,或使用 Docker 容器。
方法一:官方 Telegram 代理(推荐)
该方法需要编译并运行官方的 Telegram 代理服务器程序。
1. 更新系统并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y git build-essential libssl-dev zlib1g-dev
CentOS/RHEL:
sudo yum update -y
sudo yum install -y git make gcc openssl-devel zlib-devel
2. 克隆并编译代理
git clone https://github.com/TelegramMessenger/MTProxy.git
cd MTProxy
make && cd objs/bin
3. 生成 secret
客户端认证和流量混淆都需要一个 secret。
head -c 16 /dev/urandom | xxd -ps
该命令会生成一个 32 位十六进制字符串,即您的 SECRET。
例如:a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
4. 运行代理(初次测试)
./mtproxy -p <PORT> -H <HOST_IP> -S <SECRET> --aes-pwd <PATH_TO_PROXY_SECRET_FILE> -M <WORKER_THREADS>
<PORT>:客户端连接的端口(例如443)。<HOST_IP>:服务器的公网 IP 地址。<SECRET>:先前生成的 32 位十六进制 secret。<PATH_TO_PROXY_SECRET_FILE>:通常为/etc/mtproxy/proxy-secret(请用 64 字节随机 secret 创建该文件,供内部通信使用)。<WORKER_THREADS>:工作线程数(例如1)。
例如:
mkdir -p /etc/mtproxy
head -c 64 /dev/urandom > /etc/mtproxy/proxy-secret
./mtproxy -p 443 -H 0.0.0.0 -S a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --aes-pwd /etc/mtproxy/proxy-secret -M 1
0.0.0.0 表示绑定到所有可用网络接口。
5. 配置为 systemd 服务
为了持续运行,请创建一个 systemd 服务单元。
创建 /etc/systemd/system/mtproxy.service:
[Unit]
Description=MTProto Proxy for Telegram
After=network.target
[Service]
Type=simple
ExecStart=/root/MTProxy/objs/bin/mtproxy -p 443 -H 0.0.0.0 -S a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --aes-pwd /etc/mtproxy/proxy-secret -M 1
WorkingDirectory=/root/MTProxy/objs/bin
User=root
Restart=on-failure
[Install]
WantedBy=multi-user.target
请把 ExecStart 中的参数替换为您自己的端口、secret 和文件路径。如果 MTProxy 克隆到了其他目录,请相应调整 WorkingDirectory。
重新加载 systemd,启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable mtproxy
sudo systemctl start mtproxy
sudo systemctl status mtproxy
6. 防火墙配置
在服务器防火墙上开放所选端口(例如 443)。
UFW(Ubuntu/Debian):
sudo ufw allow 443/tcp
sudo ufw enable # if not already enabled
IPTables(CentOS/RHEL,或未使用 UFW 时):
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo service iptables save # or use firewalld
Firewalld(CentOS/RHEL 7+):
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload
方法二:Docker(备选)
使用 Docker 可以简化部署和依赖管理。
1. 安装 Docker
请按照您所用操作系统的官方 Docker 安装指南操作。
2. 生成 secret
head -c 16 /dev/urandom | xxd -ps
这就是您的 SECRET。
3. 用 Docker 运行代理
docker run -d --name mtproxy-server -p 443:443 --restart=always \
telegrammessenger/proxy:latest \
-S a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 \
--aes-pwd /etc/mtproxy/proxy-secret -M 1
-d:以后台(detached)模式运行。--name mtproxy-server:为容器指定名称。-p 443:443:将主机 443 端口映射到容器 443 端口。--restart=always:确保容器随 Docker 守护进程一起重启。telegrammessenger/proxy:latest:官方 Docker 镜像。-S <SECRET>:您生成的 secret。--aes-pwd /etc/mtproxy/proxy-secret:占位参数,Docker 镜像会在内部生成该值。-M 1:工作线程数。
请确保主机防火墙(UFW/Firewalld/IPTables)放行 443 端口的流量,内部网络由 Docker 处理。
获取 tag(可选)
tag 是一个可选参数,代理运营者可以借此把一个赞助频道关联到自己的代理。当用户通过带 tag 的代理连接时,赞助频道会显示在其聊天列表顶部。
获取 tag 的方法:
1. 在 Telegram 中给 @MTProxybot 发消息。
2. 向机器人发送 /newproxy。
3. 提供您代理的公网 IP 地址和端口。
4. 机器人会返回一个 tag 值。
把 tag 加入 systemd 服务的 ExecStart 命令或 Docker 命令中:
# Systemd(添加 --tag <YOUR_TAG>)
ExecStart=/root/MTProxy/objs/bin/mtproxy -p 443 -H 0.0.0.0 -S a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --aes-pwd /etc/mtproxy/proxy-secret -M 1 --tag <YOUR_TAG>
# Docker(添加 -T <YOUR_TAG>)
docker run -d --name mtproxy-server -p 443:443 --restart=always \
telegrammessenger/proxy:latest \
-S a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 -M 1 -T <YOUR_TAG>
添加 tag 后请重启 MTProto Proxy 服务或容器。
连接到 MTProto Proxy
代理服务器运行后,用户可以通过直达链接或手动配置进行连接。
代理链接格式
分享代理最方便的方式是使用 tg:// 链接:
tg://proxy?server=<SERVER_IP>&port=<PORT>&secret=<SECRET>
示例:tg://proxy?server=192.0.2.1&port=443&secret=a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
在已安装 Telegram 的设备上点击该链接,系统会提示用户添加此代理。
在 Telegram 应用中手动配置
- 打开 Telegram 设置。
- 进入"数据和存储"(部分客户端为"隐私和安全")。
- 选择"代理设置"。
- 开启"使用代理"或"SOCKS5/MTProto 代理"。
- 选择"MTProto 代理"。
- 在"服务器"字段填写服务器的公网 IP 地址。
- 在"端口"字段填写配置好的端口(例如 443)。
- 在"Secret"字段填写
SECRET。 - 保存设置。
随后 Telegram 客户端会尝试通过配置好的 MTProto Proxy 连接。
安全注意事项
- 保持系统更新: 定期更新服务器操作系统和已安装的软件包,以修补漏洞。
- 强 secret: 使用强度高、随机生成的 secret,避免可预测的模式。
- 防火墙: 用防火墙限制对代理端口的访问,只放行必要的入站连接。
- 监控日志: 定期检查代理日志(systemd 使用
journalctl -u mtproxy.service),留意异常活动或错误。 - 最小权限: 官方代理为图简便常以 root 运行,但如条件允许,可考虑用权限更低的用户运行,代价是文件权限配置会更复杂。
常见问题排查
- 连接失败:
- 防火墙: 确认服务器防火墙已开放代理端口。
- 信息有误: 仔细核对在 Telegram 客户端中填写的服务器 IP、端口和 secret。
- 代理未运行: 检查代理服务状态(
sudo systemctl status mtproxy或docker ps)。 - 网络问题: 确认服务器可以正常连接互联网。
- 速度慢:
- 服务器资源: 监控 VPS 的 CPU、内存和网络占用,资源耗尽时应升级配置。
- 网络延迟: 客户端与代理服务器之间的高延迟会影响速度。
- 带宽: 确保 VPS 的带宽足以支撑当前用户量。
- 代理无法启动:
- 日志: 查看 systemd 日志(
journalctl -u mtproxy.service)或 Docker 日志(docker logs mtproxy-server)中的错误信息。 - 依赖: 确认所有必需的编译依赖都已安装。
- 端口冲突: 确认所选代理端口没有被其他服务占用。
- 日志: 查看 systemd 日志(
对比:MTProto Proxy 与 SOCKS5/HTTP 代理
| 特性 | MTProto Proxy | SOCKS5/HTTP 代理 |
|---|---|---|
| 协议 | Telegram 原生的 MTProto 协议 | 通用的 SOCKS5 或 HTTP/HTTPS 协议 |
| 混淆 | 内置,专为绕过 DPI 设计 | 极少或没有;流量特征通常可被识别 |
| 抗审查 | 对 Telegram 封锁非常有效 | 效果较弱;可能被协议分析拦截 |
| 安全性 | 流量加密,专用于 Telegram | 配合 TLS(HTTPS)时加密,否则为明文 |
| 配置 | 需要专门的 "Secret";Telegram 应用原生支持 | 服务器、端口、(可选)用户名/密码;通用代理设置 |
| 使用场景 | 主要用于受限地区访问 Telegram | 通用互联网流量、各类应用 |
| 性能 | 针对 Telegram 流量优化 | 通用型;性能取决于具体实现 |
