使用docker重新部署trojan和hysteria2
引言
最近的服务器不知道为什么访问443端口越来越卡,时好时坏,找不到原因真的非常难受,但是我ping的时候,发现延迟非常底,而且我使用hysteria2也非常快,也是用443端口,只不过hysteria使用的是udp,所以我猜测是我之前使用nginx对sni分流导致的。而且最近1panel也出2.0了,干脆直接重装一下服务器吧!既然都重装服务器了,那干脆把服务器上用systemd管理的两个反审查协议改成docker部署吧!,自从用了docker之后再也接受不了在宿主机上跑任何服务😁。
解决方案
我原本想自己编写Dockerfile的,但是在一个容器里面管理多个服务麻烦不说,也不符合应用容器的规范,docker也不建议这么做,所以直接用docker compose来编排,这样能统一管理这两个服务。由于这两个服务都需要tls证书,这里原本先引入acme.sh统一管理的,但是acme.sh还需要手动输入命令,后期还要install安装证书,这里我直接使用hysteria2的证书管理服务,hysteria2原生就支持自动申请证书,只需写在配置文件中即可,直接用volume共享给trojan所在的容器即可。
配置过程
1. 编写docker-compose
services:
hysteria:
image: tobyxdd/hysteria
container_name: hysteria
restart: always
network_mode: "host"
volumes:
- acme:/acme # hysteria 申请的证书会保存在这里
- ./hysteria.yaml:/etc/hysteria.yaml
command: ["server", "-c", "/etc/hysteria.yaml"]
trojan-go:
image: p4gefau1t/trojan-go
container_name: trojan-go
restart: always
network_mode: "host"
volumes:
- acme:/acme # trojan会从这个volume读取证书
- ./trojan-go.json:/etc/trojan-go.json
command: ["/etc/trojan-go.json"]
volumes:
acme: # 创建一个保存证书的volume
2. 编写服务的配置文件
hysteria的配置文件
listen: 0.0.0.0:8443
acme:
domains:
- hysteria.domain # hysteria需要的域名 必填
- trojan.domain # 共享给trojan的域名 必填
email: @exapmle.com # 填写你的邮箱 必填
type: dns
dns:
name: cloudflare
config:
cloudflare_api_token: jMVW8u4qUp-a8Y13335KK1rKXwlyIofg5ANfI # 你自己的apikey,不要想了,这个被我修改了🤣
auth:
type: password
password: 12345678 # 用于hysteria的密码
userpass:
user1: 123456789 # 基于用户的验证,具体参考hysteria的文档
user2: 123456890
# 伪装,别人访问将会看到这个网站,防止gfw主动检测
masquerade:
type: proxy
proxy:
url: https://git.icoding.fun
rewriteHost: true
insecure: false
# 出站,把所有流量交给clash做分流处理,可以解锁奈飞
# outbounds:
# - name: clash
# type: socks5
# socks5:
# addr: 127.0.0.1:7890
# 流量统计
# trafficStats:
# listen: 127.0.0.1:2446
# secret: 12345678
这个配置文件申请了两个tls证书,一个给自己使用,一个共享给trojan使用,出站的部分被我注释了,因为我发现我的服务器已经原生解锁了手机端的chatgpt,所以这一部分我就不需要了,如果你的服务器没有解锁,请给服务器套warp解锁,具体可以参考我的另一批文章 Trojan的搭建和使用(解锁奈飞)。
trojan的配置文件
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 8443,
"remote_addr": "127.0.0.1",
"remote_port": 3000,
"password": [
"12345678",
"12345678"
],
"ssl": {
"cert": "/acme/certificates/acme-v02.api.letsencrypt.org-directory/free.icoding.fun/free.icoding.fun.crt",
"key": "/acme/certificates/acme-v02.api.letsencrypt.org-directory/free.icoding.fun/free.icoding.fun.key",
"fallback_port": 1234
}
}
这两个服务的配置非常简单,就不过多赘述了,trojian直接使用了acme这个volume共享的证书,这样就没必要再起一个certbot或者acme.sh的服务了。
启动服务
将上面所有配置文件都放在同一个配置文件夹然后启动服务
docker compose up -d
查看运行状态
docker ps
一切都顺利的话,服务就会稳定的在后台运行。
客户端连接
之前一直使用的是clash verge,自从使用了2.3版本之后hysteria连接总是断流,起初我还以为是我服务器的问题,后面使用hysteria原生的客户端非常稳定,在这里我也非常推荐大家选择一个自己喜欢的协议,使用一个原生的客户端,这样体验会更好,缺点就是部分协议无法原生支持分流,不过这对我来说问题不大,我自己的服务器流量够大,管饱,这就不是我考虑的问题了
hysteria客户端配置
# config.yaml
server: hy.icoding.fun:8443
auth: 123456789
bandwidth:
up: 30 mbps # 根据自己的服务器带宽自行调节
down: 30 mbps
socks5:
listen: 127.0.0.1:1080
http:
listen: 127.0.0.1:8080 # 需要使用的http代理
启动服务
trojan client -c config.yaml
2025-07-10T21:55:13+08:00 INFO connected to server {"udpEnabled": true, "tx": 3750000, "count": 1}
2025-07-10T21:55:13+08:00 INFO HTTP proxy server listening {"addr": "127.0.0.1:8080"}
2025-07-10T21:55:13+08:00 INFO SOCKS5 server listening {"addr": "127.0.0.1:1080"}
设置代理
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f && reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "http://127.0.0.1:1080" /f
你也可以手动设置,只不过每次手动打开,手动关闭非常的麻烦,干脆直接写一个批处理文件得了。
@echo off
%设置字符集为 UTF-8%
set LANG=zh_CN.UTF-8
chcp 65001
%获取当前批处理文件所在的目录%
set SCRIPT_DIR=%~dp0
%设置代理地址%
set PROXY_SERVER=http://127.0.0.1:8080
%配置系统代理%
echo 正在设置代理到 %PROXY_SERVER% ...
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d %PROXY_SERVER% /f
%设置 Hysteria 可执行文件和配置文件的相对路径%
set HYSTERIA_PATH=%SCRIPT_DIR%hysteria.exe
set CONFIG_PATH=%SCRIPT_DIR%config.yaml
%检查 Hysteria 可执行文件是否存在%
if not exist "%HYSTERIA_PATH%" (
echo Hysteria 可执行文件未找到: %HYSTERIA_PATH%
exit /b 1
)
%检查配置文件是否存在%
if not exist "%CONFIG_PATH%" (
echo 配置文件未找到: %CONFIG_PATH%
exit /b 1
)
%启动 Hysteria 客户端%
echo 正在启动 Hysteria 客户端...
start /B "" "%HYSTERIA_PATH%" client -c "%CONFIG_PATH%"
echo Hysteria 客户端已启动...
%等待 Hysteria 进程结束(按任意键也会结束)%
echo 按任意键停止 Hysteria 服务...
pause
%Hysteria 进程结束后,清除代理设置%
echo 正在停止 Hysteria 并清除代理设置...
taskkill /IM hysteria.exe /F
%禁用代理%
echo 禁用代理...
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f
reg delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /f
echo Hysteria 服务已停止,代理已关闭。
pause
将这个文件和客户端配置文件放到同一目录即可,创建快捷方式到桌面即可,每次启动会自己配置代理,按任意键关闭服务之后会关闭代理。
总结
用docker-compose部署之后,即使后面我们换服务器了也不要手动通过systemd配置服务,直接 docker compose up -d
一条命令即可搞定,减少心智负担,上面我并没有配置trojan的客户端,原因很简单,基于quic的hysteria太好用了,要使用trojan同理,你也可以直接使用clash或者v2ray.
评论区