近日,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
以上
如今越来越多的网站使用Telegram Bot签到,telegram-cli 是一个Telegram的非官方客户端,可以实现在终端中访问Telegram,本文使用telegram-cli+crontab完成了自动签到 #### 在 CentOS 下安装 telegram-cli
快速编译安装
cd ~/ git clone --recursive https://github.com/vysheng/tg.git && cd tg yum install jansson-devel lua-devel readline-devel libconfig-devel libevent-devel ./configure make |
将编译生成的bin/telegram-cli
和tg-server.pub
移动到同一目录下,这里创建一个mytg
目录 > 不必在 https://my.telegram.org/apps 上获取publickey,除非此项目自带的key已经过时
mkdir mytg |
在mytg
中创建telegram.config
配置文件,并放入以下内容
vim telegram.config |
default_profile = "mytg"; |
运行telegram-cli
./telegram-cli -k tg-server.pub -c telegram.config |
这里使用一个脚本文件来快速发送消息,新建~/tg/mytg/telegram_standalone.sh
vim ~/tg/mytg/telegram_standalone.sh |
|
修改脚本权限
chmod +x ~/tg/mytg/telegram_standalone.sh |
如果使用国外VPS执行crontab定期任务,务必修改时区并重启crontab服务
修改为北京时区
ntpdate -u cn.pool.ntp.org |
重启crontab服务
service crond restart |
将vim设为默认文本编辑器
export VISUAL=vim |
或
export EDITOR=vim |
新建crontab任务,运行
crontab -e |
将打开vim,进入Insert编辑模式,放入以下内容
* 10 * * * /root/tg/mytg/telegram_standalone.sh username 签到 |
其中,username
可修改为Telegram中任意Bot的id,签到
为向该Bot发送的签到指令,可任意修改,以上脚本每天上午10点会自动执行。
运行crontab -l
可查看目前创建的crontab任务。
假如你的账号添加了太多Telegram群组,telegram-cli可能无法接收/发送所有消息,可以使用dialog_list
来加载会话列表或使用-w
参数启动telegram-cli,使程序启动后会话列表先加载再发出信息。
关于telegram-cli更多的启动参数详见 https://github.com/vysheng/tg/wiki/Telegram-CLI-Arguments
msg <peer> Text - sends message to this peer
fwd <user> <msg-seqno> - forward message to user. You can see message numbers starting client with -N
chat_with_peer <peer> starts one on one chat session with this peer. /exit or /quit to end this mode.
add_contact <phone-number> <first-name> <last-name> - tries to add contact to contact-list by phone
rename_contact <user> <first-name> <last-name> - tries to rename contact. If you have another device it will be a fight
mark_read <peer> - mark read all received messages with peer
delete_msg <msg-seqno> - deletes message (not completly, though)
restore_msg <msg-seqno> - restores delete message. Impossible for secret chats. Only possible short time (one hour, I think) after deletion
send_photo <peer> <photo-file-name> - sends photo to peer
send_video <peer> <video-file-name> - sends video to peer
send_text <peer> <text-file-name> - sends text file as plain messages
load_photo/load_video/load_video_thumb/load_audio/load_document/load_document_thumb <msg-seqno> - loads photo/video/audio/document to download dir
view_photo/view_video/view_video_thumb/view_audio/view_document/view_document_thumb <msg-seqno> - loads photo/video to download dir and starts system default viewer
fwd_media <msg-seqno> send media in your message. Use this to prevent sharing info about author of media (though, it is possible to determine user_id from media itself, it is not possible get access_hash of this user)
set_profile_photo <photo-file-name> - sets userpic. Photo should be square, or server will cut biggest central square part
chat_info <chat> - prints info about chat
chat_add_user <chat> <user> - add user to chat
chat_del_user <chat> <user> - remove user from chat
rename_chat <chat> <new-name>
create_group_chat <chat topic> <user1> <user2> <user3> ... - creates a groupchat with users, use chat_add_user to add more users
chat_set_photo <chat> <photo-file-name> - sets group chat photo. Same limits as for profile photos.
search <peer> pattern - searches pattern in messages with peer
global_search pattern - searches pattern in all messages
create_secret_chat <user> - creates secret chat with this user
visualize_key <secret_chat> - prints visualization of encryption key. You should compare it to your partner's one
set_ttl <secret_chat> <ttl> - sets ttl to secret chat. Though client does ignore it, client on other end can make use of it
accept_secret_chat <secret_chat> - manually accept secret chat (only useful when starting with -E key)
user_info <user> - prints info about user
history <peer> [limit] - prints history (and marks it as read). Default limit = 40
dialog_list - prints info about your dialogs
contact_list - prints info about users in your contact list
suggested_contacts - print info about contacts, you have max common friends
stats - just for debugging
show_license - prints contents of GPLv2
help - prints this help
get_self - get our user info
export_card - print your 'card' that anyone can later use to import your contact
import_card <card> - gets user by card. You can write messages to him after that.
quit - quit
safe_quit - wait for all queries to end then quit
本次采用副本的部署方式,保证了数据安全和集群的可用性。本次共使用3台服务器,其中一台副本集主节点(172.17.120.121),两台副本节点(172.17.120.122,172.17.120.123)。
第一步,在要安装mongodb集群的主机上(172.17.120.121,172.17.120.122,172.17.120.123)创建mongodb用户,并设置密码(跟用户名一样),上传源码包mongodb-linux-x86_64-rhel62-3.2.7.tgz到三台主机的mongodb用户目录。
第二步:使用tar zxvf mongodb-linux-x86_64-rhel62-3.2.7.tgz解压文件。会再当前目录下生成一个mongodb-linux-x86_64-rhel62-3.2.7的目录,将目录重命名.
tar zxvf mongodb-linux-x86_64-rhel62-3.2.7.tgz
mv mongodb-linux-x86_64-rhel62-3.2.7 mongodb
建立副本集文件夹:
cd mongodb
mkdir -p replset/data
到此mongodb就安装好了,接下来开始配置。
在172.17.120.121,172.17.120.122,172.17.120.123上mongodb用户目录下执行命令:
cd ~
nohup ./mongodb/bin/mongod --port 27017 --dbpath=./mongodb/replset/data --replSet repset &
nohup ./mongodb/bin/mongod -f ./mongodb/etc/mongodb.conf --replSet repset &
来完成服务器的启动
mongodb.conf
dbpath = /home/mongodb/data/
fork=true
logpath = /home/mongodb/log/mongo.log
logappend=true
bind_ip = 172.17.120.121
port = 27017
~
连接三台机器的任意一台,进入用户目录,执行命令:
cd ~
./mongodb/bin/mongo
./mongodb/bin/mongo 172.17.120.121:27017
#选择admin库
#执行如下
config={_id:"repset", members:[{_id:0, host:" 172.17.120.121:27017"},{_id:0, host:" 172.17.120.122:27017"},{_id:1, host:" 172.17.120.123:27017", arbiterOnly: true}]}
#
初始化副本集配置
rs.initiate(config);
查看副本集情况:
cd ~
./mongodb/bin/mongo
rs.status();
设置副本节点可读,分别连接副本节点,然后执行:
cd ~
./mongodb/bin/mongo
db.getMongo().setSlaveOk();
./mongodb/bin/mongod --shutdown --dbpath ./replset/data
来自于157.0.111.176江苏省宿迁市 联通网友评分!
来自于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菲律宾网友评分!
来自于3.112.41.223日本东京网友评分!
来自于106.87.116.73重庆市重庆市 电信网友评分!
来自于156.224.31.74香港特别行政区网友评分!
来自于118.150.135.228台湾省新北市网友评分!
来自于138.199.21.219欧洲网友评分!
来自于49.230.8.237泰国网友评分!
来自于1.200.36.188台湾省网友评分!
来自于94.66.59.128希腊网友评分!
来自于101.9.174.29台湾省网友评分!
来自于218.35.154.227台湾省新北市网友评分!
来自于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南非网友评分!
来自于14.192.208.96马来西亚吉隆坡网友评分!
来自于98.98.83.85美国佛罗里达网友评分!