Hysteria2 代理迁移实战方案
- 模拟场景:原服务器被封锁,迁移到新服务器
- 原服务器:
旧服务器IP(韩国)保持不动 - 新服务器:
新服务器IP(香港) - 新域名:
your-domain.com
一、学习目标
- 掌握 Docker 容器化部署代理服务
- 理解 TCP 443 与 UDP 443 共存原理
- 学会 SSL 证书复用
- 实践完整的服务器迁移流程
二、前置条件
- 新服务器已部署静态页面(
your-domain.com) - SSL 证书已申请(certbot)
- 域名 A 记录已指向
新服务器IP
三、核心概念:TCP 443 与 UDP 443 共存
┌─────────────────────────────────────┐
│ 服务器 新服务器IP │
├─────────────────────────────────────┤
TCP 443 ─────│──> Nginx(静态页面) │
│ index.html / preview.html │
├─────────────────────────────────────┤
UDP 443 ─────│──> Hysteria2(代理服务) │
│ 流量伪装成 QUIC 协议 │
└─────────────────────────────────────┘
- TCP 443:正常 HTTPS 网站访问(静态页面)
- UDP 443:Hysteria2 代理流量(伪装成 QUIC)
- 两者不冲突,可以同时运行
四、迁移步骤
第一步:创建项目目录
# 登录新服务器
ssh -p SSH端口 用户名@新服务器IP
# 创建目录
mkdir -p ~/hysteria2/{config,certs,subscribe}
第二步:编写配置文件
cat > ~/hysteria2/config/config.yaml << 'EOF'
listen: :443
tls:
cert: /etc/hysteria/certs/fullchain.pem
key: /etc/hysteria/certs/privkey.pem
quic:
initStreamReceiveWindow: 8388608
initConnReceiveWindow: 20971520
maxIdleTimeout: 30s
keepAlivePeriod: 10s
auth:
type: password
password: 你的代理密码
masquerade:
type: proxy
proxy:
url: https://your-domain.com
rewriteHost: true
EOF
第三步:复制 SSL 证书
# 复制证书(复用已有的 Let's Encrypt 证书)
sudo cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ~/hysteria2/certs/
sudo cp /etc/letsencrypt/live/your-domain.com/privkey.pem ~/hysteria2/certs/
sudo chown -R 用户名:用户名 ~/hysteria2/certs/
第四步:创建订阅文件
cat > ~/hysteria2/subscribe/clash.yaml << 'EOF'
port: 7890
socks-port: 7891
allow-lan: true
mode: rule
log-level: info
proxies:
- name: "香港自建"
type: hysteria2
server: your-domain.com
port: 443
password: 你的代理密码
sni: your-domain.com
skip-cert-verify: false
rules:
- MATCH, DIRECT
EOF
第五步:Docker 部署
# 创建 Dockerfile
cat > ~/hysteria2/Dockerfile << 'EOF'
FROM alpine:latest
RUN apk add --no-cache hysteria
COPY config/config.yaml /etc/hysteria/config.yaml
COPY certs/ /etc/hysteria/certs/
EXPOSE 443/udp
CMD ["hysteria", "server", "-c", "/etc/hysteria/config.yaml"]
EOF
# 构建镜像
cd ~/hysteria2
docker build -t hysteria2-server .
# 运行容器
docker run -d \
--name hysteria2 \
--restart=always \
-p 443:443/udp \
-v ~/hysteria2/config/config.yaml:/etc/hysteria/config.yaml \
-v ~/hysteria2/certs:/etc/hysteria/certs \
hysteria2-server
第六步:配置订阅链接服务
# 修改 nginx 配置,添加订阅链接路由
sudo nano /etc/nginx/conf.d/html.conf
添加 location 块:
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /home/用户名/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 订阅链接
location /clash.yaml {
alias /home/用户名/hysteria2/subscribe/clash.yaml;
add_header Content-Type "text/yaml";
}
}
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
重启 nginx:
sudo nginx -t
sudo systemctl reload nginx
五、测试验证
1. 测试代理连通
# 在服务器上测试
docker logs hysteria2 --tail 20
# 看是否有连接日志
2. 测试订阅链接
# 本地测试
curl https://your-domain.com/clash.yaml
3. 更新 Clash 客户端
- 打开 Clash Verge
- Profiles → Import
- 输入订阅链接:
https://your-domain.com/clash.yaml - 选择对应节点
- 测试访问
六、验证清单
- Docker 容器正常运行:
docker ps | grep hysteria2 - UDP 443 端口监听:
ss -ulpn | grep 443 - 静态页面正常访问:
https://your-domain.com/ - 订阅链接可访问:
https://your-domain.com/clash.yaml - Clash 客户端连接成功
- 可以正常上网
七、回滚方案
如果出问题,删除容器即可:
# 停止并删除容器
docker stop hysteria2
docker rm hysteria2
# nginx 配置会自动恢复(没有代理,只有静态页面)
sudo systemctl reload nginx
八、注意事项
- 防火墙:确保云服务商控制台开放 UDP 443 端口
- 密码安全:配置文件中的密码要替换成自己的强密码
- 证书权限:确保容器可以读取证书文件
- 日志排查:出问题先看
docker logs hysteria2 - 不影响原服务器:新服务器独立运行,旧服务器保持不动
