整体部署可以分为三个部分:Nginx+Web服务+Trojan
其中web服务可以是任意自定义的服务,在本文最后给出我的web服务的配置,但不做过多说明。
另外,Trojan使用docker部署,Nginx使用宿主机部署的服务
一些前提条件
需要有自己的域名,可以考虑申请使用免费的域名(eu.org),但是需要有一段时间的审核,申请的教程参考https://iweec.com/363.html
需要申请ssl证书,建议使用certbot,安装教程有很多,安装完成后可以使用如下命令申请自定义证书
1 2 3 4 5 6 7 8 apt install certbot apt install python3-certbot-nginx certbot certonly --nginx -d test.example.org crontab -e 0 12 * * * /usr/bin/certbot renew --quiet
Trojan代理服务部署 来自ChatGPT的说明:
Trojan代理服务是一种基于Trojan协议的网络代理工具,它可以在用户与互联网之间建立一个加密的通信隧道,以保护用户的网络通信安全和隐私。通过使用Trojan代理服务,用户可以隐藏其真实IP地址和位置,以避免被追踪或监视,同时还可以绕过地理限制和网络封锁,访问被屏蔽的内容和服务。
与其他传统的代理服务不同,Trojan代理服务使用了一种更加安全和高效的加密方式,可以在传输过程中对数据进行加密和解密,保证数据传输的安全性和可靠性。此外,Trojan代理服务还支持多种协议和代理模式,包括HTTP、SOCKS5等,可以满足不同用户的需求和应用场景。
然而,由于Trojan代理服务可以被用于绕过封锁和访问被屏蔽的内容,也可能被用于非法活动,因此在使用Trojan代理服务时,用户应该注意合法使用,不要用于违法行为,同时也需要选择可靠和安全的服务提供商,以保证使用的安全和隐私。
Tronjan代理服务使用docker部署,docker-compose文件如下:
将其中的test.example.org
换成你自己的域名
1 2 3 4 5 6 7 8 9 10 11 12 13 version: "3" services: trojan: image: trojangfw/trojan command: trojan /etc/trojan/config.json ports: - "6443:443/tcp" - "6443:443/udp" volumes: - ./config.json:/etc/trojan/config.json - /etc/letsencrypt/live/test.example.org/fullchain.pem:/etc/fullchain.pem - /etc/letsencrypt/live/test.example.org/privkey.pem:/etc/privkey.pem
trojan的配置文件如下:
注意修改文件注释的部分
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 28 29 30 31 32 33 34 35 36 { "run_type" : "server" , "local_addr" : "0.0.0.0" , "local_port" : 443 , "remote_addr" : "127.0.0.1" , "remote_port" : 80 , "password" : [ "11111" ] , "log_level" : 0 , "tcp" : { "fastopen" : true , "no_delay" : true , "keepalive" : true , "reuse_port" : true } , "udp" : { "prefer_gro" : true , "buffer_size" : 6291456 , "reuse_port" : true } , "ssl" : { "cert" : "/etc/fullchain.pem" , "key" : "/etc/privkey.pem" , "alpn" : [ "http/1.1" ] , "verify" : true , "verify_hostname" : true , "cipher" : "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA" , "session_ticket" : true , "reuse_session" : true , "prefer_server_cipher" : true , "sni" : "test.example.org" } }
直接docker-compose up -d
就可以启动了,可以先访问测试一下行不行,然后再配置通过nginx代理。
可以直接在clash的setting -> parsers
处增加如下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 parsers: - url: https://.... yaml: prepend-rules: - 'DOMAIN-SUFFIX,openai.com,CHATGPT_PERSONAL' append-proxies: - name: test.example.org type: trojan server: test.example.org port: 443 password: 11111 udp: true sni: test.example.org append-proxy-groups: - name: CHATGPT_PERSONAL type: select proxies: - "test.example.org"
或者直接编辑clash的配置文件
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 28 29 30 31 32 33 34 35 mixed-port: 7890 external-controller: 127.0 .0 .1 :58767 allow-lan: false mode: rule log-level: warning proxies: - name: TEST_TROJAN type: trojan server: test.example.org port: 443 password: 1111 udp: true sni: test.example.org proxy-groups: - name: 🎯 全球直连 type: select proxies: - TEST_TROJAN rules: - GEOIP,CN,🎯 全球直连
到现在,应该可以通过trojan进行代理了,接下来看下如何通过nginx在前面进行反向代理,实现端口复用。
Nginx配置 一般情况我们直接使用nginx进行http的反向代理,但是trojan不是标准http协议,直接用nginx的http模块无法使用,此时需要使用nginx的stream模块,最新版nginx可以直接使用。
stream模块与http模块同级,可以进行tcp/udp流量的反向代理,下面给出nginx不同部分的配置文件,在配置文件中进行说明。
代理Trojan服务配置 /etc/nginx/nginx.conf
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$proxy_protocol_addr - $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; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; } stream { log_format steam_main '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received' ; map $ssl_preread_server_name $backend_name { test.example.org trojan_proxy; default web; } upstream web { server 127.0.0.1:80; } upstream chat { server 127.0.0.1:1443; } upstream trojan { server 127.0.0.1:6443; } server { access_log /var/log/nginx/stream.access.log steam_main; error_log /var/log/nginx/stream.error.log debug; listen 443 reuseport; listen [::]:443 reuseport; proxy_protocol on; ssl_preread on; proxy_pass $backend_name ; } upstream trojan_proxy { server 127.0.0.1:6234; } server { listen 127.0.0.1:6234 proxy_protocol; proxy_pass trojan; } }
nginx文件做了如上配置后,就应该可以正常代理到后端的trojan服务了。
代理其他web服务配置 其他http服务中的server在进行监听时,就不能使用443端口了,需要指定其他端口,下面给出服务配置。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 server { server_name test.example.org; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; location / { proxy_pass http://127.0.0.1:3002; proxy_cache_bypass $http_upgrade ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection "upgrade" ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_set_header X-Forwarded-Host $host ; proxy_set_header X-Forwarded-Port $server_port ; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml; listen [::]:1443 ssl ipv6only=on proxy_protocol; listen 1443 ssl proxy_protocol; ssl_certificate /etc/letsencrypt/live/<你的web服务域名>/fullchain.pems; ssl_certificate_key /etc/letsencrypt/live/<你的web服务域名>/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { if ($host = <你的web服务域名>) { return 301 https://$host$request_uri ; } server_name <你的web服务域名>; listen 80; listen [::]:80; return 404; }
下面是nginx的http块默认的配置文件,我修改为,非指定域名均无返回的设置了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 server { listen 80 default_server; listen [::]:80 default_server; listen 1443 ssl http2 default_server proxy_protocol; listen [::]:1443 ssl http2 default_server proxy_protocol; server_name _; ssl_reject_handshake on ; return 444; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
参考资料
https://chat.openai.com/chat
https://razeen.me/posts/nginx-tcp-stream-proxy-keep-real-client-ip/
https://www.huangyuexiang.com/2020/05/09/Nginx%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E7%AB%AF%E5%8F%A3%E5%90%8C%E6%97%B6%E5%A4%84%E7%90%86%E5%A4%9A%E7%A7%8D%E5%8D%8F%E8%AE%AE/
https://www.chengxiaobai.com/trouble-maker/trojan-shared-443-port-scheme