Skip to content

Commit be68a8b

Browse files
authored
Merge pull request #19 from Sesame2/doc
docs: 添加英文README
2 parents 3b4a84b + d3d7baf commit be68a8b

File tree

2 files changed

+592
-173
lines changed

2 files changed

+592
-173
lines changed

README-CN.md

Lines changed: 360 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,360 @@
1+
# gotun
2+
3+
[English](README.md) | 简体中文
4+
5+
[![Go Reference](https://pkg.go.dev/badge/github.com/Sesame2/gotun.svg)](https://pkg.go.dev/github.com/Sesame2/gotun)
6+
[![Go Report Card](https://goreportcard.com/badge/github.com/Sesame2/gotun)](https://goreportcard.com/report/github.com/Sesame2/gotun)
7+
[![Release](https://img.shields.io/github/v/release/Sesame2/gotun)](https://github.com/Sesame2/gotun/releases)
8+
[![Downloads](https://img.shields.io/github/downloads/Sesame2/gotun/total.svg)](https://github.com/Sesame2/gotun/releases)
9+
[![Homebrew](https://img.shields.io/homebrew/v/gotun)](https://formulae.brew.sh/formula/gotun)
10+
![Go Version](https://img.shields.io/github/go-mod/go-version/Sesame2/gotun)
11+
[![License](https://img.shields.io/github/license/Sesame2/gotun.svg)](LICENSE)
12+
13+
> 🚀 基于 SSH 的轻量级 HTTP 代理工具,使用 Go 编写,跨平台开箱即用。
14+
15+
---
16+
17+
## ✨ 项目简介
18+
19+
`gotun` 是一个 HTTP-over-SSH 的命令行代理工具。它通过 SSH 协议连接远程主机,利用该主机作为 **网络出口**,将本地发起的 HTTP 请求安全地通过远程主机访问目标地址。你可以使用它来访问:
20+
21+
- 内网中的路由器、服务器、API 等资源
22+
- 仅远程主机可访问的网络(公司内网、隔离网段等)
23+
- 任意 HTTP 网站,使用远程主机作为「中转代理」
24+
25+
## 🎨 工作原理示意图
26+
27+
### 使用前:无法直接访问内网资源
28+
```
29+
你的电脑 防火墙/NAT 内网环境
30+
┌─────────┐ ┌─────────┐ ┌─────────────┐
31+
│ │ ❌ 直接访问 │ │ │ 📱 路由器 │
32+
│ 💻 PC │ ──────────────▶│ 🔥🚫 │ │ 📺 NAS │
33+
│ │ 被阻止/拒绝 │ │ │ 🖥️ 服务器 │
34+
└─────────┘ └─────────┘ │ 📟 IoT设备 │
35+
└─────────────┘
36+
```
37+
38+
### 使用后:通过SSH跳板访问所有内网资源
39+
```
40+
你的电脑 SSH连接(22端口) 跳板机 内网环境
41+
┌─────────┐ ┌─────────────┐ ┌─────────┐ ┌─────────────┐
42+
│ │ 🔐 │ │ 🌐 │ │ ✅ │ 📱 路由器 │
43+
│ 💻 PC │◀────────▶│ gotun代理隧道│◀───────▶│ 🖥️ 跳板机 │◀───────▶│ 📺 NAS │
44+
│ │ HTTP请求 │ (加密传输) │ SSH │ │ 内网访问 │ 🖥️ 服务器 │
45+
└─────────┘ └─────────────┘ └─────────┘ │ 📟 IoT设备 │
46+
↑ └─────────────┘
47+
└── 浏览器设置代理: 127.0.0.1:8080
48+
```
49+
50+
### 🔑 核心优势
51+
52+
| 传统方案 | gotun |
53+
|---------|-----------|
54+
| ❌ 需要复杂的端口转发配置 | ✅ 仅需一个SSH连接 |
55+
| ❌ 每个服务需要单独映射端口 | ✅ 访问所有内网资源无需额外配置 |
56+
| ❌ 容易暴露内网服务到公网 | ✅ 流量全程加密,安全可靠 |
57+
| ❌ 管理多个连接复杂 | ✅ 一条隧道解决所有问题 |
58+
59+
**简单来说**: gotun 让你的电脑就像"坐在"跳板机旁边一样,可以访问跳板机能访问的任何资源!
60+
61+
---
62+
63+
## 🧱 项目特点
64+
65+
- ✅ 无需在远程主机部署任何代理服务
66+
- ✅ 全部请求自动通过 SSH 加密隧道传输
67+
- ✅ 支持访问任何远程主机可访问的地址(含内网)
68+
- ✅ 支持多级跳板机 (Jump Host),轻松穿透复杂网络
69+
- ✅ 支持跨平台运行(Windows / Linux / macOS)
70+
- ✅ 支持作为系统 HTTP 代理(可选扩展)
71+
- ✅ 自定义路由规则: 支持通过自定义的规则文件进行流量分流
72+
- ✅ 命令行自动补全: 支持 Bash, Zsh, Fish, PowerShell
73+
74+
---
75+
76+
## 🚀 快速开始
77+
78+
### 安装
79+
80+
#### 使用安装脚本
81+
82+
```bash
83+
curl -fsSL https://raw.githubusercontent.com/Sesame2/gotun/main/scripts/install.sh | sh
84+
```
85+
86+
脚本会将 `gotun` 安装到 `~/.local/bin``/usr/local/bin`。安装完成后,请确保安装目录已添加到您的 `PATH` 环境变量中。
87+
88+
#### 使用Homebrew安装 ( macOS / Linux )
89+
90+
```bash
91+
brew install gotun
92+
```
93+
94+
#### 下载预编译二进制文件
95+
96+
前往 [Releases](https://github.com/Sesame2/gotun/releases) 页面下载适合你系统的预编译版本。
97+
98+
#### 从源码编译
99+
100+
```bash
101+
git clone https://github.com/Sesame2/gotun.git
102+
cd gotun
103+
make build
104+
```
105+
106+
编译后的可执行文件位于 `build/` 目录下。
107+
108+
#### 使用 go install 安装
109+
110+
Go 1.17 及以上版本可直接通过以下命令安装:
111+
112+
```bash
113+
go install github.com/Sesame2/gotun/cmd/gotun@latest
114+
```
115+
116+
> **⚠️ 注意**: 使用 `go install` 安装的版本可能无法通过 `--version` 参数正确显示版本号,因为它直接从源码编译,缺少版本信息的注入。为了显示正确的版本信息,推荐使用安装脚本。
117+
118+
安装后,请确保你的 `$GOPATH/bin``$GOBIN` 目录已添加到系统 `PATH` 环境变量中。
119+
120+
### 基本使用
121+
122+
```bash
123+
# 基本用法:连接到SSH服务器并启动系统代理
124+
gotun user@example.com
125+
126+
# 指定SSH端口
127+
gotun -p 2222 user@example.com
128+
129+
# 使用私钥认证
130+
gotun -i ~/.ssh/id_rsa user@example.com
131+
132+
# 自定义代理监听端口
133+
gotun --listen :8888 user@example.com
134+
135+
# 自动设置系统代理(默认开启)
136+
# 若你希望启动时不修改系统代理,请显式关闭:
137+
gotun --sys-proxy=false user@example.com
138+
```
139+
140+
### 在浏览器中使用
141+
142+
启动代理后,在浏览器中配置HTTP代理:
143+
144+
- **代理地址**: `127.0.0.1`
145+
- **端口**: `8080` (默认,或你指定的端口)
146+
147+
---
148+
149+
## 📖 操作手册
150+
151+
### 命令行参数
152+
153+
| 参数 | 简写 | 说明 | 默认值 |
154+
|------|------|------|--------|
155+
| `--listen` | `-l` | 本地HTTP代理监听地址 | `:8080` |
156+
| `--port` | `-p` | SSH服务器端口 | `22` |
157+
| `--pass` | | SSH密码 (不安全, 建议使用交互式认证) | |
158+
| `--identity_file` | `-i` | 用于认证的私钥文件路径 | |
159+
| `--jump` | `-J` | 跳板机列表,用逗号分隔 (格式: user@host:port) | |
160+
| `--target` | | 可选的目标网络覆盖 | |
161+
| `--timeout` | | 连接超时时间 | `10s` |
162+
| `--verbose` | `-v` | 启用详细日志 | `false` |
163+
| `--log` | | 日志文件路径 | 输出到标准输出 |
164+
| `--sys-proxy` | | 自动设置/恢复系统代理 | `true` |
165+
| `--rules` | | 代理规则配置文件路径 | |
166+
167+
### 使用场景
168+
169+
#### 1. 访问内网服务
170+
171+
假设 `jumpserver.company.com` 可以访问内网IP `192.168.1.100`
172+
173+
```bash
174+
# 连接到跳板机,启动代理服务
175+
gotun admin@jumpserver.company.com
176+
```
177+
178+
启动后,浏览器和其他支持系统代理的应用将自动通过 `gotun` 访问网络。现在可以直接在浏览器中打开 `http://192.168.1.100:8080` 等内网地址。
179+
180+
#### 2. 开发调试
181+
182+
在本地开发时,需要连接到远程开发服务器才能访问数据库或API。
183+
184+
```bash
185+
# 启用详细日志进行调试,并指定监听端口
186+
gotun --listen :8888 -v developer@dev-server.com
187+
```
188+
189+
`gotun` 会自动设置系统代理(指向 `127.0.0.1:8888`)。开发工具如果支持系统代理,将能直接访问远程资源。如果不想影响系统其他应用的联网,可以禁用系统代理并手动配置开发工具:
190+
`gotun --sys-proxy=false --listen :8888 -v developer@dev-server.com`
191+
192+
#### 3. 作为网络出口
193+
194+
将远程服务器作为你当前网络的出口,适合需要固定IP或访问特定网络资源的场景。
195+
196+
```bash
197+
# 启动并自动配置为系统代理
198+
gotun user@proxy-server.com
199+
```
200+
201+
### 跳板机 (Jump Host)
202+
203+
当目标服务器无法直接访问,需要先登录一台或多台机器进行中转时,可以使用跳板机功能。
204+
205+
#### 工作原理示意图
206+
```
207+
你的电脑 SSH隧道 第一跳板机 SSH隧道 最终服务器
208+
┌─────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐
209+
│ │ 🔐 │ │ 🔐 │ │ 🔐 │ │ 🌐 │ │
210+
│ 💻 PC │◀───────▶│ gotun隧道 │◀───────▶│ 堡垒机/跳板机│◀───────▶│gotun隧道 │◀───────▶│ 目标主机 │
211+
│ │ HTTP请求│ (加密) │ │ │ │ (加密) │ │ │
212+
└─────────┘ └───────────┘ └──────────┘ └───────────┘ └──────────┘
213+
```
214+
215+
#### 单级跳板机
216+
217+
通过 `jump.host.com` 连接到 `target.server.com`
218+
219+
```bash
220+
gotun -J user1@jump.host.com user2@target.server.com
221+
```
222+
223+
#### 多级跳板机
224+
225+
通过 `jump1` -> `jump2` -> `target` 的顺序连接。
226+
227+
```bash
228+
gotun -J user1@jump1.com,user2@jump2.com user3@target.com
229+
```
230+
231+
`gotun` 会依次建立SSH隧道,最终连接到目标服务器。
232+
233+
### 认证方式
234+
235+
#### SSH私钥认证(推荐)
236+
237+
```bash
238+
# 使用指定私钥文件
239+
gotun -i ~/.ssh/id_rsa user@example.com
240+
241+
# 使用默认私钥(自动检测 ~/.ssh/ 目录下的密钥)
242+
gotun user@example.com
243+
```
244+
245+
#### 密码认证
246+
247+
```bash
248+
# 交互式输入密码(推荐)
249+
gotun user@example.com
250+
# 程序会提示输入密码
251+
252+
# 命令行指定密码(不安全,不推荐)
253+
gotun --pass yourpassword user@example.com
254+
```
255+
256+
### 系统代理设置
257+
258+
默认情况下 (`--sys-proxy=true`),`gotun` 会自动管理您操作系统的 HTTP 代理。如果您不希望 `gotun` 修改您的系统设置,可以在启动时使用 `--sys-proxy=false` 参数来禁用此功能。
259+
260+
当系统代理功能开启时,程序会:
261+
262+
1. **启动时**: 保存当前系统代理设置,然后设置为使用 gotun 代理
263+
2. **运行中**: 所有系统网络流量通过 gotun 代理
264+
3. **退出时**: 自动恢复原始的系统代理设置
265+
266+
支持的操作系统:
267+
268+
-**macOS**: 通过 `networksetup` 命令配置
269+
-**Windows**: 通过注册表配置
270+
-**Linux**: 通过 GNOME 设置和环境变量配置
271+
272+
### 自定义路由规则 (高级)
273+
274+
`gotun` 支持通过一个兼容 Clash 格式的 YAML 规则文件,来精细化地控制哪些网络请求通过 SSH 代理,哪些则直接连接。这对于希望同时访问内网资源(直连)和外部资源(代理)的场景非常有用。
275+
276+
#### 1. 创建规则文件
277+
278+
首先,创建一个规则文件,例如 `rules.yaml`
279+
280+
```yaml
281+
# rules.yaml
282+
# 模式: rule (规则模式), global (全局代理), direct (全局直连)
283+
mode: rule
284+
285+
# 规则列表 (从上到下匹配,第一个匹配的规则生效)
286+
rules:
287+
# 规则:让公司内网和常用国内网站直连
288+
- DOMAIN-SUFFIX,internal.company.com,DIRECT
289+
- IP-CIDR,10.0.0.0/8,DIRECT
290+
- IP-CIDR,192.168.0.0/16,DIRECT
291+
- DOMAIN-SUFFIX,cn,DIRECT
292+
- DOMAIN-SUFFIX,qq.com,DIRECT
293+
294+
# 规则:让特定服务走代理
295+
- DOMAIN-SUFFIX,google.com,PROXY
296+
- DOMAIN-SUFFIX,github.com,PROXY
297+
298+
# 规则:所有其他未匹配的流量都走代理
299+
- MATCH,PROXY
300+
```
301+
302+
#### 2. 启动 gotun
303+
304+
使用 `--rules` 参数指定规则文件的路径来启动 `gotun`。
305+
306+
```bash
307+
gotun --rules ./rules.yaml user@your_ssh_server.com
308+
```
309+
310+
现在,当您访问 `internal.company.com` 时,流量会直接发送;而访问 `google.com` 时,流量则会通过 SSH 隧道代理。
311+
312+
313+
### 故障排除
314+
315+
#### 连接问题
316+
317+
```bash
318+
# 启用详细日志进行调试
319+
gotun -v user@example.com
320+
321+
# 指定日志文件
322+
gotun -v --log ./gotun.log user@example.com
323+
```
324+
325+
#### 权限问题
326+
327+
在某些系统上设置系统代理需要管理员权限:
328+
329+
```bash
330+
# macOS/Linux
331+
sudo gotun user@example.com
332+
333+
# Windows (以管理员身份运行 PowerShell/CMD)
334+
.\gotun.exe user@example.com
335+
```
336+
337+
---
338+
339+
340+
## 🎯 功能状态
341+
342+
- [x] **HTTP 代理**: 完整的 HTTP 请求代理
343+
- [x] **HTTPS 代理**: 支持 CONNECT 方法的 HTTPS 隧道
344+
- [x] **SSH 私钥认证**: 支持多种私钥格式
345+
- [x] **自动配置系统代理**: 跨平台系统代理设置
346+
- [x] **交互式密码输入**: 安全的密码认证方式
347+
- [x] **详细日志记录**: 支持调试和故障排除
348+
- [x] **跨平台支持**: Windows/Linux/macOS
349+
- [x] **命令行界面**: 完整的 CLI 参数支持
350+
- [x] **跳板机 (Jump Host)**: 支持单级和多级SSH跳板机
351+
- [x] **自定义路由规则**: 支持自定义的规则文件进行流量分流
352+
- [x] **命令行自动补全**: 基于 Cobra 的智能提示
353+
- [ ] **RDP网关**:支持RDP远程桌面网关
354+
- [ ] **托盘 GUI 界面**: 图形化用户界面
355+
- [ ] **配置文件导出/导入**: 配置管理功能
356+
- [ ] **SOCKS5 代理支持**: 更广泛的协议支持
357+
- [ ] **连接池优化**: 提升性能和稳定性
358+
- [ ] **统计和监控**: 流量统计和连接监控
359+
360+
---

0 commit comments

Comments
 (0)