在日常开发和运维中,我们常会遇到这样的场景:需要访问公司内网的某个服务,调试容器里刚部署的应用,或者只是想从异地访问家中的 NAS。这些需求往往受限于网络边界、防火墙或复杂的网络配置,让人头疼不已。
今天,我将向大家介绍一个我开发的开源工具——gotun。它是一个基于 SSH 协议的轻量级 HTTP 代理,旨在帮助你高效、安全地穿越这些网络障碍,实现对目标资源的无缝访问。
GitHub 仓库地址:https://github.com/Sesame2/gotun
gotun 的核心定位是提供一个 HTTP-over-SSH 的代理能力。简而言之,它在你的本地设备上启动一个 HTTP 代理服务。所有通过这个代理发起的 HTTP/HTTPS 请求,都会通过一条安全的 SSH 隧道,在远程主机上执行和转发。这意味着你的本地请求将“获得”远程主机的网络可达性,无论是访问其可触及的内网服务、隔离网段资源,还是公网目标。
你可以将其理解为:gotun 让你的本地网络请求,通过远程主机这个“跳板”,去访问原本不可达的资源。
一句话解释是:只要你能通过 SSH 连接上一台机器,gotun 就能让你访问这台机器所能访问的所有地址与服务。
面对复杂的网络环境,gotun 提供了一系列有力的解决方案:
为了更直观地理解 gotun 的运作方式,请看下面的示意图:
你的电脑 防火墙/NAT 内网环境
┌─────────┐ ┌─────────┐ ┌─────────────┐
│ │ ❌ 直接访问 │ │ │ 📱 路由器 │
│ 💻 PC │ ──────────────▶│ 🔥🚫 │ │ 📺 NAS │
│ │ 被阻止/拒绝 │ │ │ 🖥️ 服务器 │
└─────────┘ └─────────┘ │ 📟 IoT设备 │
└─────────────┘
你的电脑 SSH连接(22端口) 跳板机 内网环境
┌─────────┐ ┌─────────────┐ ┌─────────┐ ┌─────────────┐
│ │ 🔐 │ │ 🌐 │ │ ✅ │ 📱 路由器 │
│ 💻 PC │◀────────▶│ gotun代理隧道│◀───────▶│ 🖥️ 跳板机 │◀───────▶│ 📺 NAS │
│ │ HTTP请求 │ (加密传输) │ SSH │ │ 内网访问 │ 🖥️ 服务器 │
└─────────┘ └─────────────┘ └─────────┘ │ 📟 IoT设备 │
↑ └─────────────┘
└── 浏览器设置代理: 127.0.0.1:8080
本地 HTTP 代理接收到你的请求后,gotun 会将其封装并加密,通过 SSH 隧道发送到远程 SSH 服务器。远程服务器作为请求的实际发起方,访问目标资源并将响应数据沿隧道原路返回。整个过程对终端用户而言是透明的,实现了高效且安全的网络穿透。
问题: 你的设备位于校外或公共网络,无法直接访问学校内网的特定资源(如图书馆数据库、实验平台)。你有一台能访问校园网的设备(例如实验室服务器、一台在校园网内的个人电脑,或者一台通过 ZeroTier 等内网穿透方案连接的公网服务器)。
gotun 解决方案:
你可以在本地运行 gotun,并建立到那台能访问校园网的设备的 SSH 连接。
# 假设你的实验室服务器(或 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 服务。
# 假设容器的 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 的公网服务器。
gotun 解决方案:
直接将你的公网服务器作为 gotun 的 SSH 目标,并启用系统代理自动设置:
./gotun -sys-proxy your_user@your_public_server.com
通过 -sys-proxy
参数,gotun 将自动配置你当前操作系统的 HTTP/HTTPS 代理。此后,你本地设备的所有网络请求都将通过这条 SSH 隧道,经由你的公网服务器发出,有效实现统一出口 IP 或绕过地域限制。
问题: 你出差在外,但希望能够访问家中的路由器管理界面、NAS 管理面板或其他内网设备。你家里有一台 Linux 机器,可以通过端口转发或 ZeroTier 等方式从外网 SSH 访问到。
gotun 解决方案:
假设你的家庭 Linux 网关机器和你的公网服务器可以通过 ZeroTier 网络以 192.168.193.33
访问,且它能够访问你家庭内网 192.168.0.0/24
段的所有设备。
你可以在笔记本上运行 gotun,通过公网服务器作为跳板机连接到这台家庭网关机器:
# 假设你的公网跳板机为 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 页面下载适合你操作系统的预编译版本。
从源码编译:
git clone https://github.com/Sesame2/gotun.git
cd gotun
make build
编译后的可执行文件位于 build/
目录下。
# 连接到SSH服务器并启动本地HTTP代理
./gotun user@your_ssh_server.com
# 之后,在你的浏览器或应用程序中配置 HTTP 代理为 127.0.0.1:8080
-p
-i
-J user1@jump1.com,user2@jump2.com user3@target.com
-listen :8888
-sys-proxy
-v
和 -log /path/to/log.txt
gotun未来计划引入的功能包括:
gotun 的发展离不开社区的贡献和反馈。如果你对 gotun 感兴趣,欢迎访问 GitHub 仓库获取更多信息、提交 Bug 报告、提出功能建议或贡献代码。
GitHub 仓库地址:https://github.com/Sesame2/gotun
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。