gotun: 一个基于SSH协议的零配置HTTP代理工具

在日常开发和运维中,我们常会遇到这样的场景:需要访问公司内网的某个服务,调试容器里刚部署的应用,或者只是想从异地访问家中的 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.iohttp://127.0.0.1.nip.io:8888,以解决某些代理对 localhost127.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...

相关推荐
吴佳浩19 小时前
Go史上最大“打脸”现场来了:泛型方法终于实现了
后端·go
明月_清风1 天前
深入 Go 并发编程:从 Goroutine 到 Channel 的系统性避坑指南
后端·go
用户34232323763172 天前
开源!Go+Wails+Vue3 手搓一个 PLC 实时监控桌面工具
go
止语Lab2 天前
为什么你的 Go TCP server P99 延迟这么高
go
Andy Dennis2 天前
nsq学习记录
消息队列·go·nsq
韦胖漫谈IT2 天前
选语言不是站队,是选适合问题的工具
java·python·ai·rust·go·技术落地
喵个咪3 天前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
夜悊3 天前
Go网络编程的学习代码示例:客户端/服务端(C/S)模型
go
审判长烧鸡3 天前
【AI问答】GO代码循环返值
go
捧 花3 天前
Eino框架记忆功能实现指南
go·agent·eino