近日,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 &
eval nohup ./mtproto-proxy -u nobody -p 8888 -H 18080 -S
de731d1e955150d03ae40579efdfb3a3 --nat-info 10.0.0.4:104.42.186.214 --aes-pwd proxy-secret proxy-multi.conf >> /usr/local/mtproxy/mtproxy.log 2>&1 &
其中的几个参数说明如下:
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。
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/mtproxy.sh && chmod +x mtproxy.sh
启动:/etc/init.d/mtproxy start
停止:/etc/init.d/mtproxy stop
重启:/etc/init.d/mtproxy restart
查看状态:/etc/init.d/mtproxy status
安装目录:/usr/local/mtproxy
配置文件:/usr/local/mtproxy/mtproxy.conf
日志文件:/usr/local/mtproxy/mtproxy.log
此步骤非必须,但出于互联网分享精神,建议有条件的同学注册并分享自己的代理服务器,同时可通过设置「赞助频道(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
以上
来自于23.227.193.227美国伊利诺斯芝加哥网友评分!
来自于42.119.148.32越南胡志明市网友评分!
来自于85.237.206.197英国英格兰伦敦网友评分!
来自于60.246.51.76澳门特别行政区网友评分!
来自于43.249.50.166印度网友评分!
来自于106.113.13.179河北省石家庄市 电信网友评分!
来自于101.94.224.43上海市上海市 电信网友评分!
来自于124.126.3.110北京市北京市 电信网友评分!
来自于106.87.116.73重庆市重庆市 电信网友评分!
来自于49.157.47.254菲律宾网友评分!
来自于183.200.16.191山西省太原市 移动网友评分!
来自于111.58.68.171广西壮族自治区贵港市 移动网友评分!
来自于94.66.59.128希腊网友评分!
来自于94.66.59.128希腊网友评分!
来自于103.151.173.102亚太地区网友评分!
来自于39.109.191.32新加坡网友评分!
来自于106.87.116.73重庆市重庆市 电信网友评分!
来自于106.87.116.73重庆市重庆市 电信网友评分!
来自于153.3.60.41江苏省南京市 联通网友评分!
来自于3.112.41.223日本东京网友评分!
来自于104.251.178.50美国德克萨斯达拉斯网友评分!
来自于104.251.178.50美国德克萨斯达拉斯网友评分!
来自于111.55.11.245中国 移动网友评分!
来自于103.205.179.169巴基斯坦网友评分!
来自于183.200.16.191山西省太原市 移动网友评分!
来自于183.200.16.191山西省太原市 移动网友评分!
来自于176.97.73.32英国网友评分!
来自于46.232.121.89俄罗斯莫斯科网友评分!
来自于114.45.39.108台湾省台北市网友评分!
来自于164.155.132.208南非网友评分!