# go-tcp2http **Repository Path**: bzsometest/go-tcp2http ## Basic Information - **Project Name**: go-tcp2http - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-18 - **Last Updated**: 2026-02-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## go-tcp2http 使用 WebSocket 承载任意 TCP 流量(如 SSH/MySQL)的简单隧道工具,包含 **后端服务端程序** 和 **客户端程序** 两部分,均使用 Go 实现,支持长连接。 ### 工作原理(WebSocket 隧道) - **客户端(ws-client)** 在本地监听一个 TCP 端口(例如 `127.0.0.1:10022`),接收到本地应用(SSH 客户端、MySQL 客户端等)的连接后: - 主动发起一个 WebSocket 连接到防火墙后的后端服务(例如 `ws://server:18080/ws-tunnel?target=127.0.0.1:22`,脚本中使用 `http://`,程序内部自动升级为 `ws://`); - 建立 WS 连接后,将本地 TCP 收到的字节流封装为 WS 二进制帧发送到后端。 - **后端服务(ws-server)** 在防火墙允许的 HTTP 端口(如 `:18080`)监听 `/ws-tunnel` 路径: - 收到客户端的 WebSocket 连接后,解析 `target` 目标地址,拨号连接到防火墙内部真实 TCP 服务(如 `127.0.0.1:22`); - 在“WS 连接 <-> 目标 TCP 连接”之间做双向字节转发,支持长时间保持连接。 从防火墙 / Nginx 的视角,这条连接是标准的 WebSocket 长连接,更容易被现代云 IDE / 反向代理接受和透传。 ### 编译(仅在 Windows CMD 下操作) 下面所有命令都假设你在 Windows 的 CMD 里执行(例如 `cmd.exe`)。 项目提供了打包脚本,统一输出到 `release` 目录,并自动把启动脚本复制到该目录。 **1. 编译 Windows 版本(在 Windows 上运行)** ```cmd REM 在项目根目录执行 .\script\build_windows.cmd ``` **2. 编译 Linux 版本(在 Linux 上运行)** ```cmd REM 在项目根目录执行 .\script\build_linux.cmd ``` 生成结果(都在 `release` 目录): - `tcp2http-ws-server.exe` / `tcp2http-ws-client.exe`(Windows) - `tcp2http-ws-server_linux` / `tcp2http-ws-client_linux`(Linux) - `run_server_windows.cmd` / `run_client_windows.cmd` - `run_server_linux.sh` / `run_client_linux.sh` ### 启动后端(部署在防火墙后端,WebSocket 版) 示例:防火墙只开放 `18080` 端口,后端只负责提供 `/ws-tunnel` WebSocket 接口,实际转发目标端口全部由客户端通过 URL `?target=` 指定。 ```bash ./tcp2http-ws-server_linux -listen :18080 ``` 或使用脚本(推荐,在 `release` 目录): ```bash ./run_server_linux.sh ``` 参数说明: - `-listen`:HTTP(WS) 服务监听地址,例如 `:18080`。 ### 启动客户端(部署在受限网络环境中的客户机,WebSocket 版) 示例:在本机开一个 10022 端口,连接转发到后端的 `22` 端口,实现 SSH 访问。 ```bash ./tcp2http-ws-client.exe -listen 127.0.0.1:10022 -server http://your-server-ip:18080/ws-tunnel -target 127.0.0.1:22 ``` 或使用脚本(推荐,在 `release` 目录,Windows): ```cmd run_client_windows.cmd ``` 参数说明: - `-listen`:本地监听地址,供本地应用连接,例如 `127.0.0.1:10022`。 - `-server`:后端 WebSocket 服务地址(支持 `http/https/ws/wss`),例如 `http://your-server-ip:18080/ws-tunnel`。 - `-target`:后端真实 TCP 目标地址,例如 `127.0.0.1:22`(SSH)、`127.0.0.1:3306`(MySQL)等。 - `-check-ports`:启动时自动检测哪些端口的 SSH 协议是否可用,例如 `"22"` 或 `"22,2222"`。 - `-check-timeout`:SSH 协议检测读取 Banner 的超时时间,例如 `5s`。 之后可以在客户端机器上这样使用: ```bash ssh -p 10022 user@127.0.0.1 ``` 或: ```bash mysql -h 127.0.0.1 -P 10022 -u root -p ``` ### 注意事项 - 该实现基于 WebSocket,要求中间的防火墙 / 代理支持 WS 协议透传,不要过早关闭长连接,否则会中断隧道。 - 为简化演示,当前版本没有做认证和加密,建议: - 在生产环境中结合 HTTPS/WSS 使用,或在隧道内再跑 SSH 等自带加密的协议; - 如需安全控制,可在 `/ws-tunnel` 接口增加鉴权参数或 Token 校验。 - 暂未实现多路复用:每条本地 TCP 连接对应一条 WebSocket 连接,这种方式对长连接协议(SSH/MySQL)是安全可靠的。