Files
hyapi-server/docs/戎行OpenVPN接入方案.md
2026-07-23 15:13:49 +08:00

263 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 戎行数据源 OpenVPN 接入方案1Panel
> 目标:**仅** `rongxing``http://192.168.3.43:7007`)走企业 VPNPostgres / Redis / 其它外部 API 仍走原出口。
> 方案:**OpenVPN 容器 + SOCKS5 代理 + 戎行 HTTP 客户端单独走代理**。
---
## 1. 架构
```
hyapi-network现有 bridge
┌─────────────────────────────────────────────────────────────┐
│ hyapi-app / hyapi-worker │
│ ├─ DB / Redis / 其它 API ──► 默认出口(不经 VPN
│ └─ 戎行 Client ──► socks5://rongxing-vpn:1080 │
│ │ │
│ rongxing-vpnopenvpn + microsocks│ │
│ TUN ──► OpenVPN Server 111.31.14.226:32199 │
│ ──► 企业内网 192.168.3.43:7007 │
└─────────────────────────────────────────────────────────────┘
```
要点:
- 业务容器网络身份不变(端口、健康检查、服务发现保持现状)。
- VPN 只负责进企业网;对外暴露的是 Docker 内网 SOCKS5不映射到公网。
- OpenVPN 使用 `route-nopull`,只加 `192.168.3.43`,避免抢走默认路由。
---
## 2. VPN 材料要不要上传?
**要上传,但只上传「客户端配置与证书」,不要上传整个 Windows OpenVPN 安装目录。**
| 本地路径(你机器) | 是否上传 | 说明 |
|--------------------|----------|------|
| `OpenVPN\config\tiany0721.ovpn` | ✅ | 连接配置(服务器上会再加路由控制指令) |
| `OpenVPN\config\ca.crt` | ✅ | CA |
| `OpenVPN\config\tiany0721.crt` | ✅ | 客户端证书 |
| `OpenVPN\config\tiany0721.key` | ✅ | 客户端私钥(敏感) |
| `OpenVPN\config\ta.key` | ✅ | tls-auth |
| `OpenVPN\bin\``doc\``Uninstall.exe` 等 | ❌ | Windows 安装包,容器不用 |
服务器上使用 **Linux 版 OpenVPN 镜像**,复用上述 5 个文件即可。
---
## 3. 1Panel 推荐目录(最优落点)
假设 1Panel 数据盘常用根为 `/opt/1panel`(若你改过安装目录,把前缀换成实际路径)。
**推荐:密钥与业务代码分离。**
```text
/opt/1panel/apps/hyapi/ # 业务 Compose / 代码(可随发布更新)
├── docker-compose.prod.yml
├── config.yaml / configs/...
├── ...
└── (不要把 .key 放进 git 仓库目录)
/opt/1panel/apps/hyapi-secrets/openvpn/ # ★ VPN 机密目录(推荐)
├── tiany0721.ovpn # 服务器侧改过的版本(见下文)
├── ca.crt
├── tiany0721.crt
├── tiany0721.key # 权限 600
└── ta.key # 权限 600
```
备选(同样可以):
```text
/data/hyapi/secrets/openvpn/ # 若 1Panel 数据盘挂在 /data
```
**不要放:**
- 网站静态目录 `/opt/1panel/www/...`(易被误暴露)
- 仓库内 `hyapi-server/config/` 或会随 CI 同步的路径(防泄漏)
**权限建议SSH 上执行):**
```bash
sudo mkdir -p /opt/1panel/apps/hyapi-secrets/openvpn
sudo chmod 700 /opt/1panel/apps/hyapi-secrets
sudo chmod 700 /opt/1panel/apps/hyapi-secrets/openvpn
# 上传文件后:
sudo chmod 600 /opt/1panel/apps/hyapi-secrets/openvpn/*.key
sudo chmod 644 /opt/1panel/apps/hyapi-secrets/openvpn/*.{crt,ovpn}
```
---
## 4. 服务器侧 OpenVPN 配置(准备好再挂载)
把本地 `tiany0721.ovpn` 拷到服务器后,**追加**以下行(保留原有 `remote` / 证书引用):
```conf
# --- 仅路由戎行内网,不接管默认网关 ---
route-nopull
route 192.168.3.43 255.255.255.255
```
完整示例见仓库:`deployments/openvpn/tiany0721.ovpn.example`
证书相对路径保持与 `.ovpn` 同目录即可(`ca ca.crt` 等),挂载整个目录到容器 `/vpn`
---
## 5. Compose 片段(接入现有 prod
参考文件:`deployments/openvpn/docker-compose.rongxing-vpn.snippet.yml`
核心服务示意:
```yaml
rongxing-vpn:
image: ghcr.io/linuxserver/openvpn-as:latest # 不推荐 AS见下方推荐镜像
```
**推荐用轻量客户端镜像**(文档配套 snippet 已按此写):
- 镜像:`dperson/openvpn-client` **或** 自建 `alpine + openvpn + microsocks`
- 能力:`cap_add: [NET_ADMIN]``devices: [/dev/net/tun]`
- 挂载:`/opt/1panel/apps/hyapi-secrets/openvpn:/vpn:ro`
- 网络:加入现有 `hyapi-network`
- **不要**把 `1080` 映射到宿主机公网端口
业务侧:
- `hyapi-app` /(若异步也会调戎行)`hyapi-worker` 保持原 `networks: [hyapi-network]`
- 配置增加代理地址:`socks5://rongxing-vpn:1080`
---
## 6. 应用配置(仅戎行)
`rongxing` 段增加代理字段(实现代码时再接线;配置先预留):
```yaml
rongxing:
url: "http://192.168.3.43:7007"
account: "..."
password: "..."
app_id: "..."
private_key: "..."
timeout: 10s
# 仅戎行走 VPN 旁路代理;留空则直连(开发机已连 VPN 时可留空)
proxy: "socks5://rongxing-vpn:1080"
logging:
# ...
```
开发机若已用 GUI 连上 VPN`proxy` 留空即可,无需起 Docker VPN。
---
## 7. 代码改动清单(后续开发)
当前 `RongxingService` 使用裸 `http.Client`,需:
1. `RongxingConfig` / `serviceConfig` 增加 `Proxy string`
2. `NewRongxingServiceWithConfig` 传入 `cfg.Rongxing.Proxy`
3. 创建 `http.Client` 时:若 `Proxy` 非空,用 `http.ProxyURL` 或 SOCKS5 dialer`golang.org/x/net/proxy`
4. **只改戎行包**,其它外部服务不动
验证点:未配 `proxy` 时行为与现在一致。
---
## 8. 1Panel 上操作清单
### 8.1 一次性准备
1. SSH 登录服务器,创建 `/opt/1panel/apps/hyapi-secrets/openvpn/`
2. 用 SFTP / `scp` 上传 5 个文件(见第 2 节)
3. 编辑服务器上的 `tiany0721.ovpn`,加上 `route-nopull` + `route 192.168.3.43 ...`
4. 设好目录/文件权限(第 3 节)
5. 确认内核允许 TUN多数 1Panel/Linux 默认有 `/dev/net/tun`;若容器报错再装 `tun` 模块
### 8.2 接入 Compose
任选其一:
- **A. 1Panel「编排」**:打开现有 hyapi 的 Compose粘贴 `rongxing-vpn` 服务片段,挂载 secrets 目录,重新部署
- **B. 独立编排**:单独建一个 `rongxing-vpn` 栈,但必须加入与 hyapi **同一个** Docker network`hyapi-network` 的外部网络名以 `docker network ls` 为准)
查现有网络名:
```bash
docker network ls | grep hyapi
docker inspect hyapi-app-prod --format '{{json .NetworkSettings.Networks}}'
```
若网络是 compose 项目前缀(如 `hyapi-server_hyapi-network`),独立栈里要:
```yaml
networks:
hyapi-network:
external: true
name: hyapi-server_hyapi-network # 以实际名为准
```
### 8.3 发布后验证
```bash
# 1) VPN 容器是否拿到 tun / 路由
docker exec -it <rongxing-vpn容器名> ip route
# 应能看到 192.168.3.43 经 tun0
# 2) 在 VPN 容器内测内网(镜像若有 curl
docker exec -it <rongxing-vpn容器名> wget -qO- --timeout=5 http://192.168.3.43:7007/ || true
# 3) 从业务容器经 SOCKS5 测(需业务镜像有 curl或临时 alpine
docker run --rm --network <hyapi网络名> curlimages/curl:8.5.0 \
-x socks5h://rongxing-vpn:1080 -m 10 -v http://192.168.3.43:7007/
# 4) 确认「不走代理」时业务仍能访问公网/库(对照现有 health
curl -f http://127.0.0.1:25000/health
```
业务侧再打一笔戎行真实查询,看 `logs/external_services` 下戎行日志是否成功。
---
## 9. 安全与运维
- `.key` / `ta.key` / 账号密码:**不进 Git**secrets 目录不挂到可下载的 Web 根。
- SOCKS5 **仅**监听容器网络,不 `-p 1080:1080` 到宿主机。
- VPN 证书到期前找对方续期,替换 secrets 目录文件后 `docker compose restart rongxing-vpn`
- 断线策略:容器 `restart: unless-stopped`OpenVPN 侧已有 `resolv-retry infinite` / `persist-tun`
- 监控:可对 `rongxing-vpn` 做 1Panel 容器存活告警;业务侧戎行错误率告警。
---
## 10. 本地文件 → 服务器对照表
| 本地 | 服务器推荐路径 |
|------|----------------|
| `...\OpenVPN\config\tiany0721.ovpn` | `/opt/1panel/apps/hyapi-secrets/openvpn/tiany0721.ovpn`(改过路由) |
| `...\OpenVPN\config\ca.crt` | 同目录 |
| `...\OpenVPN\config\tiany0721.crt` | 同目录 |
| `...\OpenVPN\config\tiany0721.key` | 同目录600 |
| `...\OpenVPN\config\ta.key` | 同目录600 |
| Windows `bin/` 整包 | **不上传** |
---
## 11. 实施状态与顺序
**代码与 Compose 已落地**(见仓库当前变更):
- `rongxing` 支持 `proxy`SOCKS5/HTTP
- `docker-compose.prod.yml` 已加入 `rongxing-vpn` 服务
- `deployments/openvpn/` 自建镜像OpenVPN + microsocks
- 生产配置 `configs/env.production.yaml``proxy: "socks5://rongxing-vpn:1080"`
**1Panel 服务器仍需人工完成:**
1. 创建 `/opt/1panel/apps/hyapi-secrets/openvpn/`,上传 5 个证书/配置文件(可用本机已备好的 `secrets/openvpn/` 内容)
2. 设置环境变量:`RONGXING_VPN_CONFIG=/opt/1panel/apps/hyapi-secrets/openvpn`
3. 拉取/构建并重新部署 Compose确保服务器能访问 Docker Hub / 镜像源以下载 `alpine`
4. 验证:`docker exec hyapi-rongxing-vpn ip route``192.168.3.43`;业务侧打一笔戎行查询