Skip to content

Commit 6f52968

Browse files
authored
Merge pull request #12 from Sesame2/dev
feat: 新增自定义流量规则的支持
2 parents b047df7 + 573bac0 commit 6f52968

File tree

6 files changed

+370
-103
lines changed

6 files changed

+370
-103
lines changed

README.md

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
- ✅ 支持多级跳板机 (Jump Host),轻松穿透复杂网络
5959
- ✅ 支持跨平台运行(Windows / Linux / macOS)
6060
- ✅ 支持作为系统 HTTP 代理(可选扩展)
61+
- ✅ 自定义路由规则: 支持通过自定义的规则文件进行流量分流
6162

6263
---
6364

@@ -134,7 +135,7 @@ go install github.com/Sesame2/gotun/cmd/gotun@latest
134135
| `-v` | | 启用详细日志 | `false` |
135136
| `-log` | | 日志文件路径 | 输出到标准输出 |
136137
| `-sys-proxy` | | 自动设置系统代理 | `true` |
137-
| `-proxy-pac` | | 代理自动配置(PAC)文件URL | |
138+
| `-rules` | | 代理规则配置文件路径 | |
138139

139140
### 使用场景
140141

@@ -241,6 +242,47 @@ go install github.com/Sesame2/gotun/cmd/gotun@latest
241242
-**Windows**: 通过注册表配置
242243
-**Linux**: 通过 GNOME 设置和环境变量配置
243244

245+
### 自定义路由规则 (高级)
246+
247+
`gotun` 支持通过一个兼容 Clash 格式的 YAML 规则文件,来精细化地控制哪些网络请求通过 SSH 代理,哪些则直接连接。这对于希望同时访问内网资源(直连)和外部资源(代理)的场景非常有用。
248+
249+
#### 1. 创建规则文件
250+
251+
首先,创建一个规则文件,例如 `rules.yaml`
252+
253+
```yaml
254+
# rules.yaml
255+
# 模式: rule (规则模式), global (全局代理), direct (全局直连)
256+
mode: rule
257+
258+
# 规则列表 (从上到下匹配,第一个匹配的规则生效)
259+
rules:
260+
# 规则:让公司内网和常用国内网站直连
261+
- DOMAIN-SUFFIX,internal.company.com,DIRECT
262+
- IP-CIDR,10.0.0.0/8,DIRECT
263+
- IP-CIDR,192.168.0.0/16,DIRECT
264+
- DOMAIN-SUFFIX,cn,DIRECT
265+
- DOMAIN-SUFFIX,qq.com,DIRECT
266+
267+
# 规则:让特定服务走代理
268+
- DOMAIN-SUFFIX,google.com,PROXY
269+
- DOMAIN-SUFFIX,github.com,PROXY
270+
271+
# 规则:所有其他未匹配的流量都走代理
272+
- MATCH,PROXY
273+
```
274+
275+
#### 2. 启动 gotun
276+
277+
使用 `-rules` 参数指定规则文件的路径来启动 `gotun`。
278+
279+
```bash
280+
./gotun -rules ./rules.yaml user@your_ssh_server.com
281+
```
282+
283+
现在,当您访问 `internal.company.com` 时,流量会直接发送;而访问 `google.com` 时,流量则会通过 SSH 隧道代理。
284+
285+
244286
### 故障排除
245287

246288
#### 连接问题
@@ -279,8 +321,8 @@ sudo ./gotun [email protected]
279321
- [x] **跨平台支持**: Windows/Linux/macOS
280322
- [x] **命令行界面**: 完整的 CLI 参数支持
281323
- [x] **跳板机 (Jump Host)**: 支持单级和多级SSH跳板机
324+
- [x] **自定义路由规则**: 支持自定义的规则文件进行流量分流
282325
- [ ] **RDP网关**:支持RDP远程桌面网关
283-
- [ ] **PAC 文件支持**: 代理自动配置文件
284326
- [ ] **托盘 GUI 界面**: 图形化用户界面
285327
- [ ] **配置文件导出/导入**: 配置管理功能
286328
- [ ] **命令行自动补全**: 基于 Cobra 的智能提示

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.24.1
55
require (
66
golang.org/x/crypto v0.42.0
77
golang.org/x/term v0.35.0
8+
gopkg.in/yaml.v3 v3.0.1
89
)
910

1011
require golang.org/x/sys v0.36.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
44
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
55
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
66
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
7+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
9+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
10+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/config/config.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ type Config struct {
2222
Verbose bool
2323
LogFile string
2424
InteractiveAuth bool
25-
SystemProxy bool // 是否启用系统代理
26-
SystemProxyPac string // PAC文件URL,如果需要
25+
SystemProxy bool // 是否启用系统代理
26+
RuleFile string
2727
}
2828

2929
// NewConfig 创建默认配置
@@ -37,7 +37,7 @@ func NewConfig() *Config {
3737
Verbose: false,
3838
InteractiveAuth: true,
3939
SystemProxy: true,
40-
SystemProxyPac: "",
40+
RuleFile: "",
4141
}
4242
}
4343

@@ -117,7 +117,7 @@ func (c *Config) ParseFlags() {
117117
flag.BoolVar(&c.Verbose, "v", c.Verbose, "启用详细日志")
118118
flag.StringVar(&c.LogFile, "log", c.LogFile, "日志文件路径 (默认输出到标准输出)")
119119
flag.BoolVar(&c.SystemProxy, "sys-proxy", c.SystemProxy, "自动设置系统代理")
120-
flag.StringVar(&c.SystemProxyPac, "proxy-pac", c.SystemProxyPac, "代理自动配置(PAC)文件URL")
120+
flag.StringVar(&c.RuleFile, "rules", c.RuleFile, "代理规则配置文件路径")
121121

122122
// 解析标准参数
123123
flag.Parse()

0 commit comments

Comments
 (0)