企业级安全网络中继与通用 API 代理网关(Go 实战)
在混合云协作和本地开发中,安全且稳定地访问远程私有 API 是一项常见需求。本文介绍一套基于 Go 语言实现的通用网络中继与 API 反代网关系统。该系统由中继服务(svc.go,服务端)与网关通道(main.go,客户端)两部分组成,支持 SSH 动态通道自愈、Windows 系统后台服务集成以及防超时长连接保活。
系统整体架构设计
系统通过本地客户端拦截并分流流量,进行协议转换,随后通过 SSH 动态隧道进行加密中转:
flowchart TD
App["💻 本地应用 / 客户端 (IDE / 终端 / 浏览器)"] -->|HTTP CONNECT 代理握手| GW
subgraph ClientGW["1. 客户端网关 (Clink Gateway)"]
GW["分流决策引擎"]
GW -->|API 专用路径| APIGW["API 反向代理网关 (长连接保活/请求头重写)"]
GW -->|常规互联网流量| Tunnel["HTTP CONNECT 隧道"]
end
APIGW --> S5Dial["SOCKS5 链式协议封装"]
Tunnel --> S5Dial
subgraph RelayServer["2. 本地中继服务 (svc.exe · Windows Service)"]
S5Srv["SOCKS5 监听服务 (:1080)"]
SSHTun["SSH 动态加密隧道 (双向心跳自愈)"]
S5Srv --> SSHTun
end
S5Dial --> S5Srv
subgraph RemoteHost["3. 远程中转主机 (物理/云端 VPS)"]
SSHD["OpenSSH Server (sshd :22)"]
end
SSHTun -->|SSH 加密通道| SSHD
SSHD -->|公网真实出口 IP| Internet["🌐 目标互联网服务 / 远程私有 API"]
classDef cli fill:#f8fafc,stroke:#3b82f6,stroke-width:1.5px;
classDef srv fill:#eff6ff,stroke:#2563eb,stroke-width:2px;
classDef remote fill:#fefce8,stroke:#ca8a04,stroke-width:1.5px;
class App,ClientGW,GW,APIGW,Tunnel,S5Dial cli;
class RelayServer,S5Srv,SSHTun srv;
class RemoteHost,SSHD,Internet remote;
系统角色与网络拓扑
系统包含以下三个核心组件:
- 远程中转主机(物理 Server):
部署在受信任公网或私有 VPC 中的主机。需运行标准的 OpenSSH Server 并启用端口转发,作为链路出口。 - 本地中继服务(项目“服务端”:
svc.exe):
运行在本地局域网的主机上。对于远程中转主机,它是 SSH Client(主动拨号);对于本地网络,它是 SOCKS5 Server,提供安全的局域网代理侦听端口。 - 应用智能网关(项目“客户端”:
clink.exe):
运行在本地开发机上。作为本地应用(如代码脚本、终端工具)与本地 SOCKS5 代理之间的桥梁,提供 HTTP 与 SOCKS5 之间的链式转换。
第一部分:服务端设计(基于 Go 的 SSH 隧道自愈 Windows 服务)
中继服务在本地建立 SOCKS5 端口,并将所有出口流量通过加密的 SSH 隧道重定向到远端服务器。
1. 核心设计亮点
- Windows 系统服务化:利用
golang.org/x/sys/windows/svc接入 Windows 服务控制器。支持使用sc.exe注册为系统级后台服务,静默开机自启动。 - 断线自愈与心跳保活:内建保活协程定期发送心跳探针(
keepalive@golang.org),检测到异常时进入冷却重试机制,自动重建 SSH 动态隧道。 - 自动防火墙配置:启动时自动检测并申请管理员权限,通过
netsh advfirewall一键开启/清理对应端口的入站规则。
2. 服务端核心技术实现
1 | // RunSSHTunnel 启动 SSH 拨号并建立本地 SOCKS5 服务的自愈循环 |
第二部分:客户端设计(协议链式转换与通用 API 反代网关)
客户端本地监听 HTTP 代理端口,拦截 TCP 握手并将其重构为 SOCKS5 RFC1928 数据包进行中继。同时,针对长连接慢响应 API 提供了底层网关控制。
1. 核心设计亮点
- 正向 HTTP CONNECT 协议转换:透明拦截终端发出的 HTTP
CONNECT请求,手动组装上游 SOCKS5 握手阶段数据,实现链式协议互通。 - 防慢连接断开机制:针对响应耗时极长的服务端请求(如慢查询、生成类流式 API 接口),直接重写 HTTP Transport 的
DialContext,注入 TCP 物理保活探测(KeepAlive: 30s),并将 HTTPIdleConnTimeout设为0,避免网关超时断连,保障数据完整度。
2. 客户端核心技术实现
1 | // 针对长连接慢响应 API 定制的专属反向代理网关启动器 |
第三部分:极速部署与实战使用指南
1. 前期准备(环境依赖)
远程中转主机(物理 Server)配置
- 安装 OpenSSH Server(以 Ubuntu/Debian 为例):
1
2
3sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable --now ssh - 开启 TCP 端口转发:
编辑远程主机的/etc/ssh/sshd_config文件,确保包含以下配置项:修改完成后,重启远程 SSH 服务:1
2
3AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes1
sudo systemctl restart ssh
本地运行主机(Windows)配置
- 运行服务注册命令必须具备管理员权限。
2. 服务端(Windows System Service)部署
步骤 1:配置配置文件 svc.yaml
在服务端可执行文件 svc.exe 同级目录下编辑 svc.yaml,写入远程 SSH 凭证:
1 | # Windows 服务注册名称 |
步骤 2:注册并启动系统服务
- 以 管理员身份 打开 CMD 或 PowerShell。
- 运行
sc.exe命令,将程序一键注册为后台系统服务,并设为开机自动启动:1
sc.exe create SSHAutoProxySvc binPath= "D:\network\svc.exe" start= auto
- 启动后台服务:
1
net start SSHAutoProxySvc
3. 客户端(Clink Proxy)配置与运行
步骤 1:编辑客户端配置 clink.yaml
在客户端 clink.exe 同级目录下编辑 clink.yaml 配置文件:
1 | # 本地 HTTP 正向代理端口 |
步骤 2:启动客户端并测试
双击运行 clink.exe。当输出如下信息时,说明中继工作正常:
1 | [INFO] HTTP proxy port: :8088 |
步骤 3:消费中继流量
- 设置终端全局代理(以 Windows Command Prompt 为例):
1
2set HTTP_PROXY=http://127.0.0.1:8088
set HTTPS_PROXY=http://127.0.0.1:8088 - 将本地调用指向本地网关:
直接在代码或客户端中将 API 端点更改为:http://127.0.0.1:2026
例如,在命令行运行以下测试命令:此时,所有请求将被客户端网关接收,并以 TCP 物理保活 的状态,通过本地加密的 SSH 隧道传输到远程服务器 safe 发出。1
curl http://127.0.0.1:2026/v1/users
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 七月小站!