Telegram 专用代理服务器 MTProxy 搭建

近日,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

来看看密钥长哪样:

获取 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 的设备上才能使用:

以上。