1429 字
7 分钟
搭建TLS加密线路

开篇前还是那句老话:一款工具如何使用,是个人的意志决定的,工具本身没有好坏之分,请使用者自行斟酌

声明: 本站不会承认该方案为原创#

本次搭建服务端使用的是带公网IP的VPS设备,当然原理都是相同,在内网或黑盒环境做也是没问题忽略掉第一步即可,别忘了网关服务器自行解析或者服务端内部直接IP定向;本次搭建使用docker容器进行,同时容器在使用过程中防第三方监听、渗透有奇效

好,废话少说 现在开始#

  • 先梳理文件数据结构(工作目录)
容器目录一级目录二级目录
网站证书密钥web.key\
网站证书文件web.crt\
代理证书密钥proxy.key\
代理证书文件proxy.crt\
Trojan-go 配置文件config.json\
项目源码二进制文件提取geoip.dat\
项目源码二进制文件提取geosite.dat\
建立cointop容器及pull映像docker-compose.yml\
websocket通信协议指定目录,用户认证proxy/\
前端工具,定义劫持及流量转发nginx/nginx.conf
  • 再梳理工作逻辑
客户机访问流量发送到服务
正常网站访问(前端劫持+分流规则)
Trojan 协议访问(后端线路)非正确 Trojan 协议访问(重定向到前端劫持的网站)
非常规 (扫描) 等被动攻击访问(重定向到前端劫持的网站)

搭建执行工作的逻辑文件目录#

证书要搞2套4份,具体怎么搞就不说了,本站有文章#

使用git工具拉取 trojan-go项目源码 或者 直接下载项目releases文件对应的系统版本 并解压提取geoip.dat和geosite.dat复制到工作目录下#

建立docker-compose.yml文件(使用docker run同理),如下内容#

Terminal window
services:
trojan-go:
container_name: trojan-go
image: teddysun/trojan-go
volumes:
- ./:/etc/trojan-go/
restart: always
network_mode: "host"
# 使用宿主机网络,以保证与nginx容器处于同一网段
depends_on:
- nginx
# 在nginx容器已启动的状态下启动
nginx:
image: nginx
restart: always
container_name: nginx
network_mode: "host"
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
- "443:443"
- "445"
- "1443"
volumes:
- ./:/etc/trojan-go/
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs/:/etc/nginx/logs/

建立nginx/nginx.conf文件(定义前端劫持及分流规则)#

需要修改的部分注意看代码注释,千万不要遗漏,任何遗漏都会导致运行失败

user nginx;
worker_processes auto;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 2048; # 最大连接数可根据服务器性能调低
}
stream {
map $ssl_preread_server_name $backend_name {
web.net web; # 修改为你的网站域名(非劫持域名)
proxy.net trojan; # 修改为你的Trojan协议网站域名
}
upstream web {
server 127.0.0.1:1443;
}
upstream trojan {
server 127.0.0.1:445;
}
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
ssl_preread on;
}
}
http {
server {
listen 1443 ssl http2;
server_name web.net; # 修改为你的网站域名(非劫持域名)
ssl_certificate /etc/trojan-go/web.crt;
ssl_certificate_key /etc/trojan-go/web.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 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;
ssl_prefer_server_ciphers on;
location / {
proxy_pass <https://hijack.net>; # 修改为你将要劫持的域名url
proxy_ssl_server_name on;
proxy_redirect off;
sub_filter_once off;
sub_filter "hijack.net" $server_name; # 修改为你将要劫持的域名
proxy_set_header Host "hijack.net"; # 修改为你将要劫持的域名
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "zh-CN";
}
}
server {
listen 1443 ssl http2;
server_name proxy.net; # 修改为你的Trojan协议网站域名
ssl_certificate /etc/trojan-go/proxy.crt;
ssl_certificate_key /etc/trojan-go/proxy.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 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;
ssl_prefer_server_ciphers on;
location / {
proxy_pass <https://hijack.net>; # 修改为你将要劫持的域名url
proxy_ssl_server_name on;
proxy_redirect off;
sub_filter_once off;
sub_filter "hijack.net" $server_name; # 修改为你将要劫持的域名
proxy_set_header Host "hijack.net"; # 修改为你将要劫持的域名
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "zh-CN";
}
}
server {
listen 80;
server_name web.net; # 修改为你的网站域名(非劫持域名)
rewrite ^(.*)$ <https://$>{server_name}$1 permanent;
}
}

建立config.json配置文件#

需要修改的部分我就不注释了,因为配置文件运行容易报错,我简单说一下

  • “sni” 和 “hostname” 修改为你的Trojan协议网站域名
  • “password” 修改为你需要设置的密码,客户机连接会用到
# 文件内容如下
{
"run_type": "server",
"local_addr": "127.0.0.1",
"local_port": 445,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": [
"custom-password"
],
"ssl": {
"cert": "/etc/trojan-go/proxy.crt",
"key": "/etc/trojan-go/proxy.key",
"sni": "proxy.net",
"fallback_addr": "127.0.0.1",
"fallback_port": 1443
},
"router": {
"enabled": true,
"block": [
"geoip:private"
],
"geoip": "/etc/trojan-go/geoip.dat",
"geosite": "/etc/trojan-go/geosite.dat"
},
"websocket": {
"enabled": true,
"path": "/etc/trojan-go/proxy",
"hostname": "proxy.net"
}
}

完成以上五个步骤所需的内容基本就搞定了#

接下来就是部署容器,启用服务端#

Terminal window
docker-compose up -d # 运行容器
docker-compose logs # 检查容器运行情况

客户端测试#

可以使用trojan协议的客户端有很多,需要自行尝试,我以clash为例配置为:

Terminal window
- {name: MySVR, server: web.net, port: 443, type: trojan, password: custom-password, sni: proxy.net, skip-cert-verify: false, udp: true, network: ws, ws-opts: {path: /etc/trojan-go/proxy, headers: {Host: proxy.net}}}
# 客户端除server使用网站域名以外,所有内容根据第五步配置文件进行调整

可选:物理机搭建注意事项#

有些童鞋不喜欢使用docker就要用物理机+项目源码的方式搭建,当然可以#

你需要先修改nginx.conf文件的头部为:

Terminal window
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

还有就是需要注意nginx有可能在启动时会报错

Terminal window
systemctl status nginx # 查看运行情况
/usr/sbin/nginx -t -q # 查看报错信息
# 当出现 [emerg] getpwnam("nginx") failed 的错误信息,你需要
useradd -s /bin/false nginx # 加权
# 当出现 [emerg] unknown directive "stream" 的错误信息,你需要
load_module /usr/lib/nginx/modules/ngx_stream_module.so; # debian环境下加载模组
load_module '/usr/lib64/nginx/modules/ngx_stream_module.so'; # centos环境下加载模组

将模组加入nginx.conf文件的头部即可,根据自己的系统二选一加入,不要无脑全复制 以上便是本章节全部内容

搭建TLS加密线路
https://cyber-mobile.net/posts/搭建tls加密线路/
作者
dot1q
发布于
2024-05-13
许可协议
CC BY-NC-SA 4.0