即使是使用mtg2.0,依然很容易被GFW所封锁,在找Telegram 直连解决办法时看到了两种解决思路。
一是给 MTProxy 搭建伪装网页,这个是 freejohn123 为伊朗用户提供的方案,由于GFW针对MTProxy协议精准识别,可能不适用于中国大陆地区。(2021年6月1号更新,经过验证单独使用此方法无法有效抗 GFW 封锁,建议搭配白名单使用)。
二是使用国内中隧道中转,在墙外落地机上搭建socks5或mtg代理,墙内中转机转发流量,通过socks5代理方式来实现直连 Telegram。这里需要提到的是,由于MTProto协议特征明显,千万不要用墙内的中转机搭建MTProxy,轻则被主机商删机,重则进局子喝茶。(据说跨省MTP会被精准识别)
本文便是第一种方案的教程,参考链接放在了最后面,也可以去查看英文博客教程。
需要提前准备好用来解析的域名,推荐使用二级域名。
如果是使用谷歌云需要先获取root权限
sudo -i
更新apt源
apt update && apt upgrade -y
安装git vim wget
apt install git vim wget -y
安装伪装网页
安装nginx
apt install nginx -y
编辑nginx 默认配置
vim /etc/nginx/sites-available/default
修改 server_name 为已经解析好的域名
server_name demo.jimubiedao.com;
重启 nginx
systemctl restart nginx
此时可以在浏览器中输入域名,检查nginx是否正常安装。
安装https证书
安装snapd 及更新核心
apt install snapd
snap install core
snap refresh core
安装certbot
snap install --classic certbot
指定目录
ln -s /snap/bin/certbot /usr/bin/certbot
配置证书
certbot --nginx
检查证书是否自动续签
certbot renew --dry-run
此时可以在浏览器中输入https地址检查证书是否正常安装。
安装Go
下载最新版Go程序压缩包,并解压到/usr/local 目录下
wget https://golang.org/dl/go1.16.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
安装mtg
使用Git命令克隆最新mtg源码,编译安装后,将二进制文件复制到可执行路径中。
git clone https://github.com/9seconds/mtg.git
cd mtg
go build
cp mtg /usr/local/bin
配置mtg
mtg目录下运行:
生成密钥:
mtg generate-secret --hex demo.jimubiedao.com
将会生成一串ee开头的密钥,需要保存好,后面的配置文件中要填写此密钥。
配置Nginx
vim /etc/nginx/sites-available/default
将443端口改为993或其他任意端口。
listen [::]:993 ssl ipv6only=on;
listen 993 ssl;
此时不要重启nginx,可能导致mtg设置失效。
为mtg创建一个系统服务文件
设置系统服务
vim /usr/lib/systemd/system/mtg.service
此时会创建一个新文件,写入配置,保存即可。
[Unit]
Description=mtg
[Service]
ExecStart=/usr/local/bin/mtg run /etc/mtg.toml
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
编辑mtg配置文件
vim /etc/mtg.toml
创建 mtg.toml 文件并写入配置。
极简配置:
只需要设置三行配置mtg即可正常运行,但更推荐使用完整配置。
secret = "ee4d9c81938450f549c68b9d4865eef2be617563612e636f6d"
bind-to = "0.0.0.0:443"
domain-fronting-port = 993
完整配置:
想要理解完整配置参数建议查看mtg项目主页,下面的中文内容为机器翻译,准确性不佳。
# mtg的配置文件示例
#
# 配置文件应该只包含那些你将会
# 使用的选项。你不需要列举所有的选项。换句话说,每个
# 选项都有一个默认值。如果你对一个键值对进行注释,它
# 应该不会产生任何影响。
# 统计数字是唯一的例外。
# Debug 在调试模式下启动应用程序。它开始相当粗略地
# 在输出方面。实际上,我们的想法是,只有当你遇到任何问题时,才以调试模式运行它。
# debug = true
# 此处是密钥。请记住,mtg只支持 FakeTLS 模式(ee开头),简单模式
# 和安全模式(dd开头)都是是禁止的。密钥应该是base64编码的或者
# 以ee开头。
secret = "ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d"
# 主机本机地址和端口
bind-to = "0.0.0.0:443"
# 定义了允许多少个并发连接到这个代理。
# 所有其他传入的连接都将被丢弃。
concurrency = 8192
# 一个供TCP使用的用户空间缓冲区的大小。因为我们有两个连接。
# 那么我们每个连接都有tcp-buffer * (4 + 2):每个连接的读/写
# 每个连接+2个拷贝缓冲区,以便在套接字之间抽取数据。
tcp-buffer = "4kb"
# 有时你想强制要求mtg使用某些类型的IP连接到Telegram。mtg有4种模式:
# - prefer-ipv6:
# 同时使用ipv4和ipv6,但ipv6有优先权
# - prefer-ipv4:
# 同时使用ipv4和ipv6,但ipv4有优先权
# - only-ipv6:
# 只使用ipv6连接
# - only-ipv4:
# 只使用ipv4连接
prefer-ip = "prefer-ipv4"
# FakeTLS使用域名前置保护。需要设置一个端口。
domain-fronting-port = 993
# FakeTLS可以比较时间戳以防止探测。每个消息都有加密的时间戳。
# 所以,MTG可以比较这个时间戳并决定是否需要继续进行连接。
#
# 有时时间会有偏差,所以我们接受所有在这个参数的在一定时间内。
tolerate-time-skewness = "5s"
# netfwork定义了不同的网络相关设置
[network]
#请注意,MTG需要做一些外部请求。如果你没有传递公共ip,它将从一些外部服务中请求你的公共ip地址。
#
# 至于2.0,如果你自己设置了一个公共ip,mtg就不会发出任何网络请求,除了Telegram需要的那些。
#
# 所以,为了执行这些请求,它需要进行DNS查询。mtg 默认使用DoH进行解析,而不是主机本身的DNS解析。
# 默认情况下,mtg使用9.9.9.9。
doh-ip = "9.9.9.9"
# mtg可以通过代理工作(目前,只支持socks5)。代理服务器
# 配置是通过列表完成的。所以,你可以指定许多代理。
#
# 实际上,如果你提供一个空的列表,那么就不会有任何代理被
# 使用。如果你提供一个单一的代理,那么MTG将只使用它。
# 如果你提供了>=2个,那么mtg将在它们之间进行负载平衡。
#
# 如果你在这里添加一个空字符串,这相当于 "普通网络"。
#
# 代理配置是通过普通URI模式完成的。
#
# socks5://user:password@host:port?open_threshold=5&half_open_timeout=1m&reset_failures_timeout=10s
#
# 使用socks5代理,user/password是可选的。正如你可以
# 看到,你可以在GET查询中指定一些参数。这些参数配置断路器。
#
# open_threshold指的是应该发生的错误数量,所以我们要停止
# 使用一个代理。
# half_open_timeout指的是一个时间段(用Golang持续时间表示)
# 之后,我们可以用这个代理重试
#
# reset_failures_timeout指的是当断路器处于关闭状态时,我们将冲掉错误的时间段。
# 当断路器处于关闭状态时。
#
# 关于断路器的细节。请参阅 https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker
proxies = [
# "socks5://user:password@host:port?open_threshold=5&half_open_timeout=1m&reset_failures_timeout=10s"
]
# network.timeout定义不同的超时设置。
# tcp超时定义一个建立网络连接的全局超时。
# idle意味着当没有任何事情发生时,在socks组之间传输数据。
#
# 请注意, 握手没有故意的超时。详细内容:
# https://www.ndss-symposium.org/wp-content/uploads/2020/02/23087-paper.pdf
#
[network.timeout]
tcp = "5s"
http = "10s"
idle = "1m"
# 一些国家对Telegram连接进行主动探测。这项技术可以防止这种行为。
#
# mtg有一个关于连接指纹的缓存。实际上,是每个连接的第一个字节
# 。所以,它把它们存储在内存中的LRU+TTL缓存中。
# 你可以在这里配置这个缓存。
[defense.anti-replay]
# You can enable/disable this feature.
enabled = true
# 最大缓存。请注意,这个数字是近似值,mtg程序努力将数据存储得很密集,但也有可能
# 在某些情况下,也可以超过这个极限10-20%。
max-size = "1mib"
# 我们使用稳定的Bloom过滤器进行防重播缓存。这有助于
# 保持一个理想的错误率。
error-rate = 0.001
# 你可以通过使用不同的阻止列表来保护代理。如果客户端有
# ip在给定的范围内,我们不会尝试进行适当的握手。我们
# 实际上是将其路由到前台域。所以,这个客户永远不会
# 有机会使用mtg来访问Telegram。
#
# 请记住,屏蔽列表是以异步方式初始化的。所以。
# 当你启动一个代理时,屏蔽列表是空的,它们在后台被填充和处理。
# 在后台进行处理。任何URL中的错误都会被忽略。
#
[defense.blocklist]
# You can enable/disable this feature.
enabled = true
# 这是一个并发性的限制器。为了保护网站
# 超载,我们以这个数量的线程下载文件。
download-concurrency = 2
# 一个FireHOL格式的URL列表(https://iplists.firehol.org/)
# 你可以在这里提供链接(以 https:// 或 http:// 开始)或
# 本地文件的路径,但在这种情况下,它应该是绝对路径。
urls = [
# "https://iplists.firehol.org/files/firehol_level1.netset",
# "/local.file"
]
#屏蔽列表更新时间
#
update-each = "24h"
# statsd 统计集成
[stats.statsd]
# enabled/disabled
enabled = false
# host:port 为statsd的UDP端点
address = "127.0.0.1:8888"
# 统计数据的前缀
metric-prefix = "mtg"
# 要使用的标签格式
# 支持的值是 "datadog"、"influxdb "和 "graphite"。
# 默认格式是 graphite.
tag-format = "datadog"
# prometheus 监控集成
[stats.prometheus]
# enabled/disabled
enabled = true
# host:port where to start http server for endpoint
bind-to = "127.0.0.1:3129"
# prefix of http path
http-path = "/"
# prefix for metrics for prometheus
metric-prefix = "mtg"
最后开启mtg
systemctl daemon-reload
systemctl enable mtg
systemctl start mtg
输出 MTProxy 代理链接:
支持tg、t.me格式链接还有二维码。
mtg access /etc/mtg.toml
复制 qrcode 链接在浏览器打开即可使用手机扫描二维码。
此时扫描二维码发现无法使用mtp代理,这是由于nginx占用443端口导致的,重启nginx就好了。
systemctl restart nginx
然后还可以为伪装网页增加一些内容而不是使用默认的nginx欢迎页。
流量监控
iftop
如果要共享mtp代理,还可以安装流量监控工具来查看实时流量:
apt install iftop
iftop 用法运行 iftop -h
https://github.com/freejohn123/mtproto-tls-server
https://v2how.github.io/post/2021-02-18-camouflage-telegram-mtproto-proxy-ubuntu-20-04/
https://github.com/9seconds/mtg/releases
https://snapcraft.io/docs/installing-snap-on-debian
https://serverfault.com/questions/828130/how-to-run-nginx-ssl-on-non-standard-port
文章评论