nginx反代mtproxy 作者: 毕世平 时间: 2020-09-23 分类: 默认分类 前言:对于telegram内置代理`mtproxy`,个人向来是比较喜欢的,可无奈搭建好的服务很快就出现不稳定掉线情况...... 本文呢,主要是参考了网上这方面的教程,加上一点实测,尝试使用这种方法来搭建tg代理。 大概理解:nginx stream模块将来自443端口的流量进行分类处理,属于tg流量就分发给mtproxy主程序,将nginx前置在mtproxy程序前。达到tg客户端和浏览器通过同一个端口来访问nginx的效果。 # 一、安装docker ## 1.1 安装docker 以Debian 10为例,执行下面命令安装docker apt update && apt -y install wget wget -qO- get.docker.com | bash ## 1.2 简单设置docker systemd systemctl start docker //启动docker docker version //查看docker版本 systemctl enable docker //加入开机自启动 ## 1.3 配置docker-compose 执行下面命令进行配置 wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.27.3/docker-compose-Linux-x86_64 chmod +x /usr/local/bin/docker-compose //赋予可执行权限 docker-compose --version //查看版本号,也检验了docker-compose是否配置成功 **说明**:docker-compose releases地址是:[点我打开](https://github.com/docker/compose/releases "点我打开") # 二、安装mtproxy 这里使用`alexbers/mtprotoproxy`项目,项目地址是:https://github.com/alexbers/mtprotoproxy ,项目地址里作者也有视频介绍搭建过程。 具体操作命令如下: apt -y install git vim //安装一些会用到的软件 git clone -b master https://github.com/alexbers/mtprotoproxy cd mtprotoproxy vim config.py //编辑此文件 //下面是示例 PORT = 3000 USERS = { "tg": "xxxxxx" } MODES = { "classic": False, "secure": False, "tls": True } TLS_DOMAIN = "www.cloudflare.com" PROXY_PROTOCOL = True //上面是示例 值得注意的是:`TLS_DOMAIN`后面最好填开启了TLS1.3的网站域名,另外要将`PROXY_PROTOCOL = True`,设为`False`的话表示不使用nginx做前置,这里要设置为`True`,后面才能继续。 修改好`config.py`文件以后,执行下面命令,启动容器 docker-compose up -d //第一次执行此命令,它会先进行镜像的构建,后而用创建好的镜像启动容器 docker-compose logs //查看日志,获取tg代理链接 docker-compose down //删除并移除容器,注意,这些命令都要在../mtprotoproxy/目录下执行 # 三、配置nginx 对于nginx,我是很不熟悉的,所以很多参数功能不了解,若有错误,欢迎后面留言指正。 ## 3.1 拉取nginx镜像 docker pull nginx:latest ## 3.2 读取主配置文件信息 docker run --rm -it nginx:latest bash //切换到临时创建的容器 cd /etc/nginx cat nginx.conf //查看主配置文件信息,可以把看到的内容全部复制下来,用电脑本地记事本记录下来 //下面是默认主配置文件内容 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } //上面是主配置文件内容 exit //退出容器,因为在创建的时候加了--rm,所以退出容器,容器也自动被移除了 对于这个,目前我只了解`nginx.conf`作为主配置文件,它会读取`/etc/nginx/conf.d`文件夹内以`.conf`结尾的文件,作为`http`层的附加内容,这个跟`sudo`的`/etc/sudoers.d`操作有点类似。 ## 3.3 在宿主机创建nginx主配置文件 下面就是修改nginx.conf内容,添加`stream`模块,注意这个模块是跟`http`模块**平级**的。 mkdir /root/nginx && vim /root/nginx/nginx.conf //下面是示例 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } stream { map $ssl_preread_server_name $name { www.cloudflare.com mtproxy; # 映射域名到合适的后端 default web; } upstream mtproxy { server localhost:3000; # 这里是mtproxy监听端口 } upstream web { server localhost:1024; # 临时的服务器 } upstream real_web { server localhost:80; # 真正的后端,这里设置为/etc/nginx/conf.d/default.conf里的80端口 } server { listen 443 reuseport; # 对外的443端口 proxy_pass $name; proxy_protocol on; # 关键的一步,支持HAProxy的proxy_protocol ssl_preread on; # 预读SNI主机名 } server { listen localhost:1024 reuseport proxy_protocol; proxy_pass real_web; } } //上面是示例 **说明**:值得注意的是,如果你在`upstream real_web`下设置`trojan-go`监听的本地端口为上游时,也是可以成立的,也就达到了`mtproxy和trojan-go都走443`的效果。这里不再赘贴配置文件,欢迎有兴趣的自行尝试。 ## 3.4 创建nginx容器 执行下面命令创建nginx容器 docker run -d --name nginx --restart always --net host -v /root/nginx:/root/nginx nginx:latest **说明**:这里将宿主机和容器的`/root/nginx`进行映射,这代表着任何时候下宿主机和容器里这个文件夹下的内容都将保持一致。 ## 3.5 替换容器内nginx的主配置文件 docker exec -it nginx bash //-i:interaction互动 -t:terminal终端,-it连一起,代表切换到容器内的终端 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak //备份 cp /root/nginx/nginx.conf /etc/nginx/nginx.conf //将nginx主配置文件替换为自己后面改好的 exit //退出容器内的终端 ---------------------------------- docker restart nginx //重启nginx容器 从现在开始,你可以将上面获取到的`tg://`里的端口号从`3000`改为`443`了,可以在tg里面测试看是否可用。你也可以用浏览器访问`http://ip`和`http://ip:443`来查看那个nginx默认欢迎界面了。 **说明**:后面修改nginx主配置文件大致步骤:在宿主机的`/root/nginx`目录下进行修改,修改好后,exec进容器终端,因为“同步”,所以可以将容器内的`/root/nginx/nginx.conf`放到`/etc/nginx`目录下作为主配置文件,而后退出容器终端,重启nginx容器。 # 四、结语 本文几乎全部是按照网上教程来的,只是换用了docker部署而已,记录下来方便你我,若有错误,欢迎留言指正。 参考链接: 1.[nginx反代MTProxy和v2ray-plugin](https://lixingcong.github.io/2019/12/18/proxy-behind-nginx/ "nginx反代MTProxy和v2ray-plugin") 2.[mtprotoproxy项目地址](https://github.com/alexbers/mtprotoproxy "mtprotoproxy项目地址") 3.[docker-compose项目地址](https://github.com/docker/compose "docker-compose项目地址") 标签: none
你好up主 想请教一下使用nginx反代mtproxy后能否套cdn保证mtproxy安全。
cdn没法套的,因为mtproxy不属于websocket类型的流量,现在也不推荐使用mtproxy代理了,建议用shadowsocks,trojan,vmess这类稳定的代理协议
使用mtproxy主要原因还是为了实现telegram内置代理,不需要一直开着代理软件,up主是否有稳定安全得内置代理方案推荐?
没有,我已经放弃使用tg内置代理了,不稳定
好的 谢谢
up主否方便给一下tg联系方式,有空探讨一下技术知识
推荐你一个更好的技术交流群∶
https://t.me/qiushui2018