我从去年开始使用 Telegram 这个即时通讯软件,现在已经是我使用最频繁的聊天软件了,相比 qq 和微信来说 Telegram 更加符合我对聊天软件的胃口,简洁、专注、消息永久云存储全平台免费同步、端到端的强加密通讯等功能正好满足我的需求。最近开一个 Telegram 频道,想找一些推广渠道,正好看到 Telegram 的专用代理 MTProxy 可以添加频道推广,所以决定用vps搭建一个 MTProxy 代理用来推广自己的频道,我尝试根据 MTProxy 的官方搭建教程来搭建,其中遇到了一些坑,但是最后还是成功搭好了。

什么是 MTProxy ?

MTProxy 是一个专门为 Telegram 开发的轻量级代理协议,该协议根据 Telegram 自己开发的MTProto协议而设计,使用 C 语言编写。相比 ss 来说,它使用更加方便(Telegram 客户端内置该代理协议),占用系统资源也比较少,但是只能用于 Telegram 。
开源地址:https://github.com/TelegramMessenger/MTProxy

搭建教程

本教程适用于 Centos7 系统,其它 Linux 发行版可以参考 GitHub 的教程(其实只是依赖环境的安装方法不一样,毕竟不同发行版的包管理器不同)

安装构建及运行所需依赖环境

搭建MTProxy代理需要先安装源码构建工具和opensslzlib的开发包:

yum install openssl-devel zlib-devel
yum groupinstall "Development Tools"

下载源码并构建

从 GitHub 下 Clone 源码:

cd /opt
git clone https://github.com/TelegramMessenger/MTProxy
cd MTProxy

编译源码,生成的可执行二进制文件 mtproto-proxy 存放在objs/bin目录中:

make && cd objs/bin

编译成功的话在objs/bin目录下就能找到 mtproto-proxy 文件。
如果编译失败的话就执行make clean后再重新编译。

运行 MTProxy

1.获取连接 Telegram 服务器的密钥:

curl -s https://core.telegram.org/getProxySecret -o proxy-secret

生成的密钥文件 proxy-secret 会存放在当前目录。
2.获取 telegram 配置文件,配置文件会经常更新,所以官方推荐一天更新一次:

curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf

同样,生成的配置文件 proxy-multi.conf 会放在当前目录。
3.自动生成用户使用的密码:

head -c 16 /dev/urandom | xxd -ps

执行这个命令后终端会随机生成一个32位的随机字符串,把它保存下来用作密码。
4.运行 mtproto-proxy:

./mtproto-proxy -u nobody -p 8888 -H 443 -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1
  • nobody 为用户名,不用修改
  • 8888 为本地端口号,可以使用它获得代理运行的统计信息
  • 443 为外部端口号。用于客户端与服务器连接
  • <secret> 为用户连接代理用的密码,替换为第3步中生成的32位随机字符串
  • proxy-secret 和 proxy-multi.conf 即为第1、2步获取的文件
  • 1 为进程数,如果你的服务器配置够高的话,可以增加进程数
    注意:如果你的 vps 是 NAT 服务器(比如谷歌云),则要加上内网 IP 和外网 IP 地址,运行命令如下:
./mtproto-proxy -u nobody -p 8888 -H 443 --nat-info <local-addr>:<global-addr>  -S 571e4835590b3fc2661ecf7841848872 --aes-pwd proxy-secret proxy-multi.conf -M 1

把 <local-addr> 替换为内网IP,<global-addr> 替换为外网IP。
运行上述命令后,出现以下代码则代理搭建完成:

[8425][2019-01-12 15:25:58.354107 local] Invoking engine mtproxy-0.01 compiled at Jan 12 2019 06:51:46 by gcc 4.8.5 20150623 (Red Ht 4.8.5-36) 64-bit after commit b9950a18f8f289837545a5152c2fd423717c0b48
[8425][2019-01-12 15:25:58.354925 local] config_filename = 'proxy-multi.conf'
[8425][2019-01-12 15:25:58.355165 local] creating 1 workers
[8425][2019-01-12 15:25:58.361546 local] Started as [10.146.0.2:8888:8425:1547277958]
[8425][2019-01-12 15:25:58.361806 local] configuration file proxy-multi.conf re-read successfully (809 bytes parsed), new configuraion active
[8426][2019-01-12 15:25:58.363800 local] Started as [10.146.0.2:8888:8426:1547277958]
[8426][2019-01-12 15:25:58.364002 local] configuration file proxy-multi.conf re-read successfully (809 bytes parsed), new configuraion active
[8426][2019-01-12 15:25:58.364850 local] main loop
[8425][2019-01-12 15:25:58.371705 local] main loop

5.客户端连接 MTProxy 测试:
打开 Telegram 客户端,settings->Data and Storage->Proxy Settings->Add Proxy:
Server 填写你的 vps 外网 IP 地址,port 填写 443,Secret 填写之前生成的32位随机字符串即可。
如果连接失败的话,先检查防火墙有没有开启对应的端口号,还是不行的话尝试把 vps 的时区改成北京时区,然后同步时间后重新开启代理。

以Systemd service的方式运行MTProxy

上述的运行方式当 ssh 断开后则停止运行,以系统服务的方式启动可以持续运行而且可以开机启动
1.创建 System service 文件:

vim /etc/systemd/system/MTProxy.service

2.添加以下脚本:
非 NAT 主机:

[Unit]
Description=MTProxy
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/MTProxy/objs/bin
ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 443  -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1
Restart=on-failure

[Install]
WantedBy=multi-user.target

NAT 主机:

[Unit]
Description=MTProxy
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/MTProxy/objs/bin
ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 443 --nat-info <local-addr>:<global-addr> -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1  #添加内网及外网IP地址
Restart=on-failure

[Install]
WantedBy=multi-user.target

这里要注意路径问题,WorkingDirectory 和 ExecStart 的路径一定要是 mtproto-proxy 文件所在目录。
3.重载daemons并启动 MTProxy 服务:

systemctl daemon-reload
systemctl restart MTProxy.service
systemctl status MTProxy.service

终端出现以下提示则 MTProxy 启动成功:

● MTProxy.service - MTProxy
   Loaded: loaded (/etc/systemd/system/MTProxy.service; enabled; vendor preset: disabled)
   #此处为 active(running)则服务正在运行中
   Active: active (running) since Sun 2019-01-13 00:02:41 CST; 1 day 21h ago 
 Main PID: 16083 (mtproto-proxy)
   CGroup: /system.slice/MTProxy.service
           ├─16083 /opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 443 --nat-info 10.146.0.2 xx.xx.xx.xx -P 43abc8...
           └─16085 /opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 443 --nat-info 10.146.0.2 xx.xx.xx.xx -P 43abc8...

如果启动失败的话请检查文件路径和运行命令是否正确。
4.设置开机启动:

systemctl enable MTProxy.service

注册MTProxy并添加频道推广

Telegram 官方有一个管理MTProxy的 bot @MTProxybot,在这个 bot 中注册自己的 MTProxy,可以添加频道推广,也可以看到 MTProxy 的连接数量及连接用户IP地址归属地。

注册MTProxy

  1. 关注 @MTProxybot 机器人。
  2. 发送/newproxy指令,bot返回添加方式。
  3. 发送 host:port,host即你的 vps 外网 ip 地址,port 就是端口号。
  4. 发送连接密码,即之前生成的 32 位随机字符串。
  5. 接下来 bot 会返回生成的分享链接和代理tag:
Success!
Your proxy has been successfully registered. You can now pass this proxy tag to the software you are using: 43abc80fc213xxxxxxxxxxxxxxxxxxx.
Here is a link to your proxy server: https://t.me/proxy?server=xx.xx.xx.xx&port=443&secret=xxxxxxxxxxxxxxxx661ecf7841848872
And here is a direct link for those who have the Telegram app installed: tg://proxy?server=xx.xx.xx.xx&port=443&secret=xxxxxxxxxxxxxfc2661ecxxxxxxxxxx

把链接分享出去,别人点击链接 Telegram 客户端就会自动添加代理。如果你不需要使用代理来推广频道,则不用理会 bot 生成的tag。

利用MTProxy推广自己的频道

  1. 注册MTProxy后发送/myproxies,bot 会返回你的代理 tag。
  2. 点击 tag,点击 Set promotion,发送自己的频道id或者链接,bot会提示添加成功需要一段时间来让设置生效,可能需要1个小时以上。
  3. 在 System service 文件中加入 bot 返回的tag:
[Unit]
Description=MTProxy
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/MTProxy/objs/bin
# 在-P后面添加tag
ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p 8888 -H 443 --nat-info 10.146.0.2:xx.xx.xx.xx -P 43abc80fxxxxxxxxxxxxxxx68b128557  -S 571xxxxxxxxxxxxxx1848872  --aes-pwd proxy-secret proxy-multi.conf -M 1
Restart=on-failure

[Install]
WantedBy=multi-user.target

重载 daemons 并重启 MTProxy 服务:

systemctl daemon-reload
systemctl restart MTProxy.service
systemctl status MTProxy.service

待设置生效后,别人使用你的 MTProxy 时就会在消息列表顶端看到你推广的频道,关注频道后则取消置顶,就像下图一样,右上角会显示 Proxy sponsor 表示这是代理推广频道,第一次点开频道也会有官方提示消息:
MTProxy

Channel

添加中国 IP 白名单

代理通过公共分享频道分享出去的话,会出现很多伊朗人使用的情况,这样会很快耗光vps资源,所以最好使用 ipset + iptables 添加中国 IP 白名单,只允许中国 IP 访问,设置方法请看这篇博文,在此不再赘述。

分享 MTProxy

最后通过各种渠道把你的 MTProxy 分享出去,使用代理的人都会看到你的推广频道了。(vps流量不多的慎重考虑,我分享出去5天烧掉三百多 GB 流量)

顺便推广一波自己的频道:博文精选

使用 docker 或者 一键脚本搭建 MTProxy

wget --no-check-certificate https://raw.githubusercontent.com/lrinQVQ/script/master/other/china_only && chmod +x china_only && ./china_only

该脚本会自动设置仅限中国地区访问。

参考文章

https://github.com/TelegramMessenger/MTProxy/blob/master/README.md