近日,Telegram 在俄罗斯遭封锁事件催生了基于其自有加密协议 MTProto 的代理服务器 MTProxy,官方源码使用 C 语言编写,托管于 TelegramMessenger/MTProxy。我试着在自己的 VPS 上搭建了一个,虽然官方文档非常简陋,但还算顺利。
服务器端编译
首先在 VPS (Ubuntu 18.04) 上克隆服务器端源码:
$ cd ~/dev/
$ git clone https://github.com/TelegramMessenger/MTProxy.git
$ cd MTProxy
编译之前需要安装必要的工具链和开发库:
$ sudo apt install build-essential libssl-dev zlib1g-dev
然后在 MTProxy 源码的根目录下直接执行 make
即可,编译出的可执行文件是 objs/bin/mtproto-proxy
。
之前的 README.md 没有说明需要安装的库文件,make
时在链接阶段有如下错误:
/usr/bin/x86_64-linux-gnu-ld: cannot find -lz
就是因为没有安装 zlib1g-dev
导致的。
服务器端运行
为简化说明,直接在编译结果目录中操作:
$ cd objs/bin/
获取 AES 密钥用于连接 Telegram 服务器:
$ curl -s https://core.telegram.org/getProxySecret -o proxy-secret
使用 hd proxy-secret
看看密钥长哪样:
00000000 c4 f9 fa ca 96 78 e6 bb 48 ad 6c 7e 2c e5 c0 d2 |.....x..H.l~,...|
00000010 44 30 64 5d 55 4a dd eb 55 41 9e 03 4d a6 27 21 |D0d]UJ..UA..M.'!|
00000020 d0 46 ea ab 6e 52 ab 14 a9 5a 44 3e cf b3 46 3e |.F..nR...ZD>..F>|
00000030 79 a0 5a 66 61 2a df 9c ae da 8b e9 a8 0d a6 98 |y.Zfa*..........|
00000040 6f b0 a6 ff 38 7a f8 4d 88 ef 3a 64 13 71 3e 5c |o...8z.M..:d.q>\|
00000050 33 77 f6 e1 a3 d4 7d 99 f5 e0 c5 6e ec e8 f0 5c |3w....}....n...\|
00000060 54 c4 90 b0 79 e3 1b ef 82 ff 0e e8 f2 b0 a3 27 |T...y..........'|
00000070 56 d2 49 c5 f2 12 69 81 6c b7 06 1b 26 5d b2 12 |V.I...i.l...&]..|
获取 Telegram 服务器列表及配置(不定时更新,官方推荐每天重新获取一次):
$ curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf
Telegram 服务器列表和配置长这样:
$ cat proxy-multi.conf
# force_probability 1 10
proxy_for 1 149.154.175.50:8888;
proxy_for -1 149.154.175.50:8888;
proxy_for 2 149.154.162.38:80;
proxy_for 2 149.154.162.32:80;
proxy_for -2 149.154.162.38:80;
proxy_for -2 149.154.162.32:80;
proxy_for 3 149.154.175.100:8888;
proxy_for -3 149.154.175.100:8888;
proxy_for 4 91.108.4.200:8888;
proxy_for 4 91.108.4.212:8888;
proxy_for 4 91.108.4.207:8888;
proxy_for 4 91.108.4.168:8888;
proxy_for 4 91.108.4.167:8888;
proxy_for 4 91.108.4.138:8888;
proxy_for 4 91.108.4.191:8888;
proxy_for 4 91.108.4.136:8888;
proxy_for 4 91.108.4.172:8888;
proxy_for 4 91.108.4.156:8888;
proxy_for -4 149.154.166.120:8888;
proxy_for -4 149.154.165.109:8888;
proxy_for 5 91.108.56.163:8888;
proxy_for 5 91.108.56.118:8888;
proxy_for -5 91.108.56.163:8888;
proxy_for -5 91.108.56.118:8888;
生成密钥用于客户端连接代理服务器:
$ head -c 16 /dev/urandom | xxd -ps
de731d1e955150d03ae40579efdfb3a3
记下这个密钥,后面还会多次用到。再以后台方式运行 mtproto-proxy
:
$ ./mtproto-proxy -u nobody -p 8888 -H 9527 -S de731d1e955150d03ae40579efdfb3a3 --aes-pwd proxy-secret proxy-multi.conf -M 0 &
其中的几个参数说明如下:
nobody
为用户名,mtproto-proxy
调用setuid()
以放弃权限。8888
为本地端口,用于获取统计数据。9527
为代理服务器端口,客户端使用此端口与代理服务器连接。de731d1e955150d03ae40579efdfb3a3
为此前生成的密钥,同样用于客户端。也可同时指定多个密钥:-S <secret1> -S <secret2>
。proxy-secret
为此前获取的用于连接 Telegram 服务器的 AES 密钥。proxy-multi.conf
为此前获取的 Telegram 服务器列表及配置。-M
参数指定除主线程之外的工作线程数目,此处指定为0
,仅用主线程。
看到主线程及工作线程(如果有)都进入 main loop 之后,表示代理服务器开始工作了:
[31648][2018-06-07 19:37:54.546575 local] Invoking engine mtproxy-0.01 compiled at Jun 7 2018 19:03:31 by gcc 7.3.0 64-bit after commit 580909cbca12a2f8529dbb387edf8e9bc5bd4e3a
[31648][2018-06-07 19:37:54.546833 local] config_filename = 'proxy-multi.conf'
[31648][2018-06-07 19:37:54.549856 local] Started as [X.X.X.X:8888:31648:1528371474]
[31648][2018-06-07 19:37:54.550720 local] configuration file proxy-multi.conf re-read successfully (797 bytes parsed), new configuration active
[31648][2018-06-07 19:37:54.551195 local] main loop
假如你的 VPS 开启了防火墙,别忘了允许对应的 TCP 端口接入,例如:
$ sudo iptables -A INPUT -p tcp --dport 9527 -j ACCEPT
此外,除了 TelegramMessenger/MTProxy 之外,官方还提供了 Docker 的方式搭建代理服务器。另有第三方的 Python、PHP 等其它语言的实现,详见 p1ratrulezzz/mtproxy-server-linux。
服务器注册及分享
此步骤非必须,但出于互联网分享精神,建议有条件的同学注册并分享自己的代理服务器,同时可通过设置「赞助频道(sponsored channel)」的方式获益。
服务器注册步骤如下:
- 添加官方机器人 @MTProxybot
- 发送
/newproxy
- 根据提示发送代理服务器地址及端口号: lancitou.net:9527
- 再根据提示发送此前生成的密钥: de731d1e955150d03ae40579efdfb3a3
- 注册完成
设置赞助频道的方法:
- 发送
/myproxies
,将列出你注册过的代理服务器列表 - 选择要设置的代理服务器: lancitou.net XXXXXXXX(此处并非以端口号型号列出,而是在注册成功后生成的十六进制标签,形如 850594e9…,请注意不要与密钥混淆)
- 再选择 Set promotion
- 根据提示发送赞助频道的链接或用户名: https://t.me/waytocrypto 或 @WayToCrypto
- 设置完成
此后所有连接到这个代理服务器的客户端,都会在聊天主界面置顶显示对应的赞助频道了。
客户端设置
为支持 MTProxy,首先需要把客户端升级到最新版本(具体哪个版本开始支持的无从获知)。添加代理服务器有手动添加和自动添加两种方法。
手动添加
仅以 iOS 客户端为例。首次设置代理的入口比较隐蔽,在 Settings -> Data and Storage -> Use Proxy,点击 Add Proxy 并选择 MTProto 类型,填上代理服务器的 IP 或域名、端口号及密钥:
此后在 Settings 页面会出现 Proxy 直达入口,所有曾经连接过的代理服务器都列于此,并且会自动检测是否可用、延时大小等信息。
自动添加
在注册服务器阶段生成的两个链接就可以用于自动添加代理服务器,其中第一个链接是标准公网链接;第二个链接为 URL Scheme 链接,在安装了 Telegram app 的设备上才能使用:
- https://t.me/proxy?server=lancitou.net&port=9527&secret=de731d1e955150d03ae40579efdfb3a3
- tg://proxy?server=lancitou.net&port=9527&secret=de731d1e955150d03ae40579efdfb3a3
以上。