Go-TCP-Proxy
GO · SOCKS5 · 纯 TCP 转发

不懂代理的程序,
交给这根「延长线」

Go-TCP-Proxy 是一个用 Go 编写的小巧 TCP 代理 —— 它把本地端口收到的每一条连接,乖乖地经由 Socks5 代理送往远程目标。你的程序只管连本地端口,绕路、握手、双向搬运,统统交给它。

单文件 · 零依赖 Windows · Linux · macOS amd64 & arm64 AGPLv3 · Made with ❤️ by lingyicute
你的程序 任意 TCP 客户端 Go-TCP-Proxy 监听 127.0.0.1:10808 Socks5 代理 握手 · 绕路 远程目标 example.com:22
客户端 → 远程 远程 → 客户端 · 全双工
tcp-proxy —— 交互式配置 LIVE 演示
FEATURES · 特性

把一件事,做到极致。

没有花里胡哨的规则引擎,也不需要一大篇配置 —— 一根线、三个问题、六次贴心设计,正好够用。

一根线的事

一个本地端口,对应一个远程目标,中间走一个 Socks5 代理。它只做一件事,并且把这件事做好。

交互式配置

启动后它会一句一句地问你,每个问题都带着默认值 —— 直接按回车就好,第一次用也不会迷路。

本地监听地址和端口?
127.0.0.1:10808回车采用

记住你的选择

每次确认过的配置都会自动保存到系统配置目录,下次启动一路回车沿用,也可以手动编辑 config.json

Linux~/.config/go-proxy-tunnel/
macOS~/Library/Application Support/go-proxy-tunnel/
Windows%AppData%\go-proxy-tunnel\

全双工转发

每条连接都会开两个 goroutine,分别负责「客户端 → 远程」和「远程 → 客户端」。一方发送完毕时只把「我说完了」的信号(TCP 半关闭)传给另一方,对方仍能把剩余的响应发回来;两边都结束后才真正关闭 —— 不丢数据,也不留僵尸连接。

上行
下行

优雅退出

按下 Ctrl+C:先停止接受新连接,再等待在途数据传输完,最后才安静离场。等待有上限(默认 5 秒),超时或再按一次 Ctrl+C 会立即关闭剩余连接 —— 不会被某条空闲长连接卡住。

Ctrl+C
正在等待活动连接自然结束…

单文件 · 零依赖 · 跨平台

CGO_ENABLED=0 静态编译,一个可执行文件拷到哪里都能跑。GitHub Actions 会自动构建三大系统的全部架构:

Linuxamd64 / arm64
Windowsamd64 / arm64
macOSIntel / Apple Silicon
QUICKSTART · 快速开始

三个问题,即刻开跑。

下载或构建一个二进制,回答三个问题,然后让你的程序去连本地端口 —— 就是这么简单。

1

获取二进制

前往 Nightly Release 页面,下载对应系统的 tcp-proxy-<os>-<arch>。或者,从源码自行构建(需要 Go 1.25+):

从源码构建
git clone https://github.com/lingyicute/Go-TCP-Proxy.git
cd Go-TCP-Proxy
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o tcp-proxy ./cmd/tcp-proxy
2

启动它

运行二进制,回答它的三个问题(每个问题都有默认值,直接回车即可),服务就启动了。

运行
./tcp-proxy          # Linux / macOS
tcp-proxy.exe        # Windows
3

连上本地端口

让你的程序去连 127.0.0.1:10808 —— 绕路、握手、双向搬运,剩下的统统交给它。想让局域网内其它设备也用?把监听地址改为 0.0.0.0:10808(请确认网络环境可信)。

配置项一览

配置项JSON 字段默认值
本地监听地址local_addr127.0.0.1:10808
远程目标地址remote_addrexample.com:80
Socks5 代理socks_addr127.0.0.1:1080

远程目标支持域名或 IP;Socks5 代理暂不支持用户名密码认证。

config.json 长这样

config.json
{
  "local_addr":  "127.0.0.1:10808",
  "remote_addr": "example.com:80",
  "socks_addr":  "127.0.0.1:1080"
}

保存于系统用户配置目录(go-proxy-tunnel 文件夹),随时可手动编辑。

USE CASES · 应用场景

它能拿来做什么?

只要能填 IP 和端口,就能借它绕路 —— 数据库客户端、游戏、老旧桌面软件,统统不在话下。

让老客户端走上代理

有些程序天生「不懂」代理 —— 配置里压根没有 Socks5 这一栏。对它们来说,Go-TCP-Proxy 就是一个普通的 TCP 端口,接上即走。

通过 Socks5 使用 SSH

remote_addr 设成 your-server:22,然后:

SSH over Socks5
ssh -p 10808 user@127.0.0.1

远程服务的本地「别名」

把某个常用的远程端口映射到本地固定端口,调试时再也不用来回翻地址和端口号。

小提示:多开几个实例、各自监听不同本地端口,就能同时转发多个远程目标。
FAQ · 常见问题

你可能想问

还有其它疑问?欢迎到 GitHub 仓库提 Issue。

Socks5 代理需要客户端「会说 Socks5 协议」才能使用;Go-TCP-Proxy 则是替那些不会说的客户端代劳 —— 对客户端来说,它就是一个普通的 TCP 端口。

一个实例只对应一个远程目标。想转发多个目标,就多开几个实例、各自监听不同的本地端口即可。建议用 -c 给每个实例指定单独的配置文件,或者直接用 -l/-r/-s --no-save 传参,避免互相覆盖。

目前版本使用的是无认证的 Socks5 拨号器,暂时不支持账号密码认证 —— 欢迎 Pull Request!

多半是端口被占用了,换一个端口试试;在 Linux / macOS 上监听 1024 以下的端口还需要管理员权限。

请先确认 Socks5 代理本身在运行且地址填写正确,再确认代理能够访问到远程目标。

因为程序内部的模块名就是 go-proxy-tunnel,配置目录沿用了它。改了名字会让老用户的配置「失踪」,所以就这么留着啦。