在日常开发和运维中,我们常会遇到这样的场景:需要访问公司内网的某个服务,调试容器里刚部署的应用,或者只是想从异地访问家中的 NAS。这些需求往往受限于网络边界、防火墙或复杂的网络配置,让人头疼不已。
今天,我将向大家介绍一个我开发的开源工具------gotun。它是一个基于 SSH 协议的轻量级 HTTP 代理,旨在帮助你高效、安全地穿越这些网络障碍,实现对目标资源的无缝访问。
GitHub 仓库地址:github.com/Sesame2/got...
✨ gotun 是什么?核心功能概览
gotun 的核心定位是提供一个 HTTP-over-SSH 的代理能力。简而言之,它在你的本地设备上启动一个 HTTP 代理服务。所有通过这个代理发起的 HTTP/HTTPS 请求,都会通过一条安全的 SSH 隧道,在远程主机上执行和转发。这意味着你的本地请求将"获得"远程主机的网络可达性,无论是访问其可触及的内网服务、隔离网段资源,还是公网目标。
你可以将其理解为:gotun 让你的本地网络请求,通过远程主机这个"跳板",去访问原本不可达的资源。
一句话解释是:只要你能通过 SSH 连接上一台机器,gotun 就能让你访问这台机器所能访问的所有地址与服务。
💡 为什么选择 gotun?解决你的网络连接痛点
面对复杂的网络环境,gotun 提供了一系列有力的解决方案:
- 零服务端改造: 你无需在远程主机上部署额外的代理服务。只要远程主机支持 SSH 访问,gotun 即可工作。
- 安全与通用: 整个通信链路通过 SSH 进行加密,确保数据传输的安全性。它支持私钥和交互式密码认证,并且是跨平台工具(兼容 Windows, Linux, macOS)。
- 易用与可集成: gotun 通过一条命令行即可启动,提供自动设置系统代理的选项,并且支持详细日志输出,方便问题排查。
🎨 gotun 的工作机制示意图
为了更直观地理解 gotun 的运作方式,请看下面的示意图:
未使用 gotun 前:内网资源无法直接触及
markdown
你的电脑 防火墙/NAT 内网环境
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ │ ❌ 直接访问 │ │ │ 📱 路由器 │
│ 💻 PC │ ──────────────▶│ 🔥🚫 │ │ 📺 NAS │
│ │ 被阻止/拒绝 │ │ │ 🖥️ 服务器 │
└─────────┘ └─────────┘ │ 📟 IoT设备 │
└─────────────┘
使用 gotun 后:通过 SSH 隧道建立连接
scss
你的电脑 SSH连接(22端口) 跳板机 内网环境
┌─────────┐ ┌─────────────┐ ┌─────────┐ ┌─────────────┐
│ │ 🔐 │ │ 🌐 │ │ ✅ │ 📱 路由器 │
│ 💻 PC │◀────────▶│ gotun代理隧道│◀───────▶│ 🖥️ 跳板机 │◀───────▶│ 📺 NAS │
│ │ HTTP请求 │ (加密传输) │ SSH │ │ 内网访问 │ 🖥️ 服务器 │
└─────────┘ └─────────────┘ └─────────┘ │ 📟 IoT设备 │
↑ └─────────────┘
└── 浏览器设置代理: 127.0.0.1:8080
本地 HTTP 代理接收到你的请求后,gotun 会将其封装并加密,通过 SSH 隧道发送到远程 SSH 服务器。远程服务器作为请求的实际发起方,访问目标资源并将响应数据沿隧道原路返回。整个过程对终端用户而言是透明的,实现了高效且安全的网络穿透。
🎭 典型场景:gotun 如何解决你的实际网络挑战?
场景一:校园网内网穿透------访问受限资源
问题: 你的设备位于校外或公共网络,无法直接访问学校内网的特定资源(如图书馆数据库、实验平台)。你有一台能访问校园网的设备(例如实验室服务器、一台在校园网内的个人电脑,或者一台通过 ZeroTier 等内网穿透方案连接的公网服务器)。
gotun 解决方案:
你可以在本地运行 gotun,并建立到那台能访问校园网的设备的 SSH 连接。
bash
# 假设你的实验室服务器(或 ZeroTier 分配的 IP)是 192.168.193.10
./gotun your_user@192.168.193.10

然后,将你本地的浏览器或应用配置 HTTP 代理指向 127.0.0.1:8080
(gotun 默认监听端口)。此时,你的所有代理请求都将通过 SSH 隧道,从校园网内的设备发出,从而实现对校园内网资源的无障碍访问。
场景二:容器内网穿透------调试隔离环境中的服务
问题: 在 Docker 等容器环境中进行开发时,容器内的服务可能没有独立的 IP,或者受限于权限无法将端口映射到宿主机,导致难以从宿主机或外部直接访问和调试。
gotun 解决方案:
你可以部署一个支持 SSH 访问的容器(例如,在容器启动时集成 SSH 服务),并将其 SSH 端口映射到宿主机。然后,在宿主机上运行 gotun,连接到这个容器的 SSH 服务。
bash
# 假设容器的 SSH 端口映射到宿主机的 2222 端口
./gotun -p 2222 container_user@127.0.0.1

gotun 启动代理后,你可以在宿主机上的浏览器中,通过 http://127.0.0.1:8888
(或结合 nip.io
如 http://127.0.0.1.nip.io:8888
,以解决某些代理对 localhost
和 127.0.0.1
的特殊处理)访问容器内部的服务,实现对容器化应用的无缝调试。
场景三:受限网络访问------统一出口 IP 或访问地域受限资源
问题: 你需要一个固定的出口 IP 地址,或者要访问某个仅限特定地域 IP 才能访问的网站。你拥有一台位于目标地区或具有特定 IP 的公网服务器。
gotun 解决方案:
直接将你的公网服务器作为 gotun 的 SSH 目标,并启用系统代理自动设置:
bash
./gotun -sys-proxy your_user@your_public_server.com

通过 -sys-proxy
参数,gotun 将自动配置你当前操作系统的 HTTP/HTTPS 代理。此后,你本地设备的所有网络请求都将通过这条 SSH 隧道,经由你的公网服务器发出。
场景四:复杂网络拓扑环境穿透------远程访问家庭内网服务
问题: 你出差在外,但希望能够访问家中的路由器管理界面、NAS 管理面板或其他内网设备。你家里有一台 Linux 机器,可以通过端口转发或 ZeroTier 等方式从外网 SSH 访问到。
gotun 解决方案:
假设你的家庭 Linux 网关机器和你的公网服务器可以通过 ZeroTier 网络以 192.168.193.33
访问,且它能够访问你家庭内网 192.168.0.0/24
段的所有设备。
你可以在笔记本上运行 gotun,通过公网服务器作为跳板机连接到这台家庭网关机器:
bash
# 假设你的公网跳板机为 jump.yourserver.com
# 家庭服务器的 ZeroTier 虚拟 IP 为 192.168.193.33
./gotun -J your_user@jump.yourserver.com your_user@192.168.193.33

gotun 启动代理服务后,将你的浏览器设置为代理 127.0.0.1:8080
。现在,你可以直接在浏览器中访问家中的内网地址,例如 http://192.168.0.1
访问路由器管理界面,或 http://192.168.0.27
访问你的 NAS 管理界面。gotun 帮助你轻松穿越网络边界,实现对家庭内网设备的远程管理。
🚀 快速开始
安装
下载预编译二进制文件: 前往 GitHub Releases 页面下载适合你操作系统的预编译版本。
从源码编译:
bash
git clone https://github.com/Sesame2/gotun.git
cd gotun
make build
编译后的可执行文件位于 build/
目录下。
基本使用
bash
# 连接到SSH服务器并启动本地HTTP代理
./gotun user@your_ssh_server.com
# 之后,在你的浏览器或应用程序中配置 HTTP 代理为 127.0.0.1:8080
🎯 更多命令行参数与高级功能
- 指定 SSH 端口:
-p
- SSH 私钥认证:
-i
- 多级跳板 (Jump Host):
-J user1@jump1.com,user2@jump2.com user3@target.com
- 自定义本地监听端口:
-listen :8888
- 自动设置系统代理:
-sys-proxy
- 详细日志输出:
-v
和-log /path/to/log.txt
🛣️ 未来功能展望
gotun未来计划引入的功能包括:
- PAC 文件支持 、托盘 GUI 界面:提升用户体验。
- SOCKS5 代理支持:扩展协议兼容性。
- RDP 网关能力:考虑支持远程桌面协议的穿透。
- 连接池优化 、统计与监控:增强性能和可观测性。
🌟 欢迎贡献!
gotun 的发展离不开社区的贡献和反馈。如果你对 gotun 感兴趣,欢迎访问 GitHub 仓库获取更多信息、提交 Bug 报告、提出功能建议或贡献代码。
GitHub 仓库地址:github.com/Sesame2/got...