一根线的事
一个本地端口,对应一个远程目标,中间走一个 Socks5 代理。它只做一件事,并且把这件事做好。
Material You 的灵魂:选一颗种子色,整页色调随之重生。
当前主题:梨绿
没有花里胡哨的规则引擎,也不需要一大篇配置 —— 一根线、三个问题、六次贴心设计,正好够用。
一个本地端口,对应一个远程目标,中间走一个 Socks5 代理。它只做一件事,并且把这件事做好。
启动后它会一句一句地问你,每个问题都带着默认值 —— 直接按回车就好,第一次用也不会迷路。
每次确认过的配置都会自动保存到系统配置目录,下次启动一路回车沿用,也可以手动编辑 config.json。
~/.config/go-proxy-tunnel/~/Library/Application Support/go-proxy-tunnel/%AppData%\go-proxy-tunnel\每条连接都会开两个 goroutine,分别负责「客户端 → 远程」和「远程 → 客户端」。一方发送完毕时只把「我说完了」的信号(TCP 半关闭)传给另一方,对方仍能把剩余的响应发回来;两边都结束后才真正关闭 —— 不丢数据,也不留僵尸连接。
按下 Ctrl+C:先停止接受新连接,再等待在途数据传输完,最后才安静离场。等待有上限(默认 5 秒),超时或再按一次 Ctrl+C 会立即关闭剩余连接 —— 不会被某条空闲长连接卡住。
CGO_ENABLED=0 静态编译,一个可执行文件拷到哪里都能跑。GitHub Actions 会自动构建三大系统的全部架构:
下载或构建一个二进制,回答三个问题,然后让你的程序去连本地端口 —— 就是这么简单。
前往 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
运行二进制,回答它的三个问题(每个问题都有默认值,直接回车即可),服务就启动了。
./tcp-proxy # Linux / macOS
tcp-proxy.exe # Windows
让你的程序去连 127.0.0.1:10808 —— 绕路、握手、双向搬运,剩下的统统交给它。想让局域网内其它设备也用?把监听地址改为 0.0.0.0:10808(请确认网络环境可信)。
| 配置项 | JSON 字段 | 默认值 |
|---|---|---|
| 本地监听地址 | local_addr | 127.0.0.1:10808 |
| 远程目标地址 | remote_addr | example.com:80 |
| Socks5 代理 | socks_addr | 127.0.0.1:1080 |
远程目标支持域名或 IP;Socks5 代理暂不支持用户名密码认证。
{
"local_addr": "127.0.0.1:10808",
"remote_addr": "example.com:80",
"socks_addr": "127.0.0.1:1080"
}
保存于系统用户配置目录(go-proxy-tunnel 文件夹),随时可手动编辑。
只要能填 IP 和端口,就能借它绕路 —— 数据库客户端、游戏、老旧桌面软件,统统不在话下。
有些程序天生「不懂」代理 —— 配置里压根没有 Socks5 这一栏。对它们来说,Go-TCP-Proxy 就是一个普通的 TCP 端口,接上即走。
把 remote_addr 设成 your-server:22,然后:
ssh -p 10808 user@127.0.0.1
把某个常用的远程端口映射到本地固定端口,调试时再也不用来回翻地址和端口号。
还有其它疑问?欢迎到 GitHub 仓库提 Issue。
Socks5 代理需要客户端「会说 Socks5 协议」才能使用;Go-TCP-Proxy 则是替那些不会说的客户端代劳 —— 对客户端来说,它就是一个普通的 TCP 端口。
一个实例只对应一个远程目标。想转发多个目标,就多开几个实例、各自监听不同的本地端口即可。建议用 -c 给每个实例指定单独的配置文件,或者直接用 -l/-r/-s --no-save 传参,避免互相覆盖。
目前版本使用的是无认证的 Socks5 拨号器,暂时不支持账号密码认证 —— 欢迎 Pull Request!
多半是端口被占用了,换一个端口试试;在 Linux / macOS 上监听 1024 以下的端口还需要管理员权限。
请先确认 Socks5 代理本身在运行且地址填写正确,再确认代理能够访问到远程目标。
因为程序内部的模块名就是 go-proxy-tunnel,配置目录沿用了它。改了名字会让老用户的配置「失踪」,所以就这么留着啦。