使用Nginx TLS加密MTProxy流量

介绍

为什么需要TLS加密?
答:MTProxy搭建在海外服务器上直接使用太过容易被封锁,使用TLS加密流量进行转发可有效避免封锁

方案

需要准备

  • 一台国内服务器
  • 一台海外服务器
  • 一个SSL证书及私钥

国内服务器上

搭建一个Nginx服务器作为入口,推荐使用docker,官方已集成四层转发需要的stream相关模块,不需要自行编译

  1. 创建Nginx配置文件 nginx.conf,注意修改证书名称及转发的目的ip和端口,参考如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    user  nginx;
    worker_processes auto;
    worker_rlimit_nofile 65535;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    events {
    worker_connections 102400;
    }

    stream {
    log_format proxy '$remote_addr:$remote_port $server_port [$time_local] '
    '$protocol $status $bytes_sent $bytes_received '
    '$session_time "$upstream_addr" '
    '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    access_log /var/log/nginx/access.log proxy;
    proxy_ssl on;
    proxy_ssl_protocols TLSv1.3;
    proxy_ssl_server_name on;
    proxy_ssl_name xxx.kwin.win; #改为你的SSL证书名称
    server {
    listen 6666;
    listen 6666 udp;
    proxy_pass x.x.x.x:6666; #改为海外服务器ip
    }
    }
  2. 创建Nginx容器(注意修改/path/to/your/nginx.conf 为你的 nginx.conf 绝对路径)
    1
    2
    3
    4
    5
    6
    7
    docker run -d --name nginx \
    --net=host \
    -e TZ=Asia/Shanghai \
    --log-opt max-size=10m \
    --restart=always \
    -v "/path/to/your/nginx.conf:/etc/nginx/nginx.conf" \
    nginx:latest

海外服务器上

同样搭建一个Nginx服务器(配置文件有所不同),以及MTProxy(不再赘述)

  1. 将你的证书和证书私钥放至同一文件夹
  2. 创建Nginx配置文件 nginx.conf,注意证书及证书私钥的文件名及修改MTProxy端口,参考如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    user  nginx;
    worker_processes auto;
    worker_rlimit_nofile 65535;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;


    events {
    worker_connections 102400;
    }

    stream {
    log_format proxy '$remote_addr:$remote_port $server_port [$time_local] '
    '$protocol $status $bytes_sent $bytes_received '
    '$session_time "$upstream_addr" '
    '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    access_log /var/log/nginx/access.log proxy;
    ssl_protocols TLSv1.3;
    ssl_certificate /home/cert/fullchain.pem; #证书
    ssl_certificate_key /home/cert/privkey.pem; #证书私钥
    server {
    listen 6666 ssl;
    listen 6666 udp;
    proxy_pass 127.0.0.1:你的MTProxy端口;
    }
    }
  3. 创建Nginx容器
  • 注意修改/path/to/your/nginx.conf 为你的 nginx.conf 绝对路径
  • 注意修改/path/to/your/cert 为证书所在文件夹的绝对路径
    1
    2
    3
    4
    5
    6
    7
    8
    docker run -d --name nginx \
    --net=host \
    -e TZ=Asia/Shanghai \
    --log-opt max-size=10m \
    --restart=always \
    -v "/path/to/your/nginx.conf:/etc/nginx/nginx.conf" \
    -v "/path/to/your/cert:/home/cert" \
    nginx:latest

完成

打开Telegram,修改代理MTProxy中的hostname为国内服务器ip,port为6666即可

Author: kwin
Link: https://blog.kwin.win/2021/03/08/nginx-tls-mtproxy/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.