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...

相关推荐
豆浆Whisky20 小时前
Go泛型实战指南:从入门到工程最佳实践|Go语言进阶(12)
后端·go
豆浆Whisky1 天前
反射还是代码生成?Go反射使用的边界与取舍|Go语言进阶(11)
后端·go
lypzcgf2 天前
Coze源码分析-资源库-编辑知识库-后端源码-基础设施/存储层
系统架构·go·知识库·coze·coze源码分析·智能体平台·ai应用平台
hzulwy2 天前
微服务注册与监听
微服务·云原生·架构·go
豆浆Whisky2 天前
Go interface性能调优指南:避免常见陷阱的实用技巧|Go语言进阶(10)
后端·go
gopyer4 天前
180课时吃透Go语言游戏后端开发7:Go语言中的函数
开发语言·游戏·golang·go·函数
lypzcgf4 天前
Coze源码分析-资源库-编辑工作流-后端源码-流程/技术/总结
go·源码分析·工作流·coze·coze源码分析·ai应用平台·agent平台
Penge6666 天前
Go语言中的切片展开操作符 ...
后端·go
野木香7 天前
go语言websocket连接,重连,发心跳示例
websocket·go