Skip to content

Commit 7635539

Browse files
committed
Refactored multiple things
1. Modified the deployment and use of the socks proxy 2. Modified Provider interface and parameter struct 3. Added namespace for tencent 4. Changed the location of the sdk api error handling
1 parent a765b08 commit 7635539

25 files changed

Lines changed: 392 additions & 406 deletions

File tree

README.md

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ SCFProxy 是一个基于云服务商提供的云函数及 API 网关功能实现
2323
## HTTP 代理
2424
### 部署
2525
```console
26-
scfproxy deploy http -p provider_list -r region_list
26+
scfproxy deploy http -p provider_list -r region_list [-c providerConfigPath]
2727
```
28+
29+
`providerConfigPath` 为保存有各个云厂商 ak/sk 的配置文件,默认位置在 `~/.config/scfproxy`
30+
2831
`provider_list``region_list` 传入的参数列表以 `,` 分隔。
2932

3033
`region_list` 支持如下 4 种形式(在所有 `deploy``clear` 命令上都支持)
@@ -59,33 +62,39 @@ scfproxy clear http -p provider_list -r region_list [--completely]
5962
清理功能默认只会删除触发器,如需同时删除函数,需添加 `-e/--completely` 参数
6063

6164
## SOCKS5 代理
62-
### 部署
65+
### 部署 & 清理
66+
与 HTTP 代理相同,只需替换 `http` 参数为 `socks`
6367
```console
64-
scfproxy deploy socks -p provider_list -r region_list -a address [-k key] --auth [user:pass]
68+
scfproxy deploy socks -p provider_list -r region_list
6569
```
66-
`-a address` 用于指定云函数回连的 vps 地址
6770

68-
`-k key` 用于连接后进行验证
69-
70-
`--auth [user:pass]` 用于指定 socks 认证信息,默认无认证
7171

7272
### 运行
7373
```console
74-
scfproxy socks -l socks_port -s scf_port -k key
74+
scfproxy socks -l socks_port -s scf_port -h address [--auth user:pass] [-c providerConfigPath]
7575
```
7676
`-l socks_port` 监听 socks_port,等待用户的 socks5 连接
7777

7878
`-s scf_port` 监听 scf_port,等待来自云函数的连接,需要部署命令中 `address` 参数的端口一致
7979

80-
`-k key` 用于验证,需与部署命令中的 `key` 对应
80+
`-h address` 用于指定云函数回连的 vps 地址
8181

82+
`--auth [user:pass]` 用于指定 socks 认证信息,默认无认证
8283

83-
### 清理
84-
```console
85-
scfproxy clear socks -p provider_list -r region_list [--completely]
86-
```
84+
socks 命令需要读取 ak/sk 用于触发函数,且通过读取 deploy 后生成的 `~/.config/scfproxy/socks.json` 文件确定需要调用函数的厂商及地区,因此需要将上述两个文件复制到 vps 对应位置运行。
85+
86+
目前 socks 代理部署的函数超时时间为 15m,因此如果将 socks 代理用于一个长连接如 mysql 连接,需自行安排好时间,避免时间一到导致连接意外断开。
87+
88+
### 使用效果
89+
**长连接**
90+
91+
借助 proxifier 通过 scfproxy 的 socks5 代理进行 mysql 连接,可以看到连接中的 ip 地址来自于阿里云的机器
92+
![mysql](img/mysql.jpg)
93+
94+
**短连接**
95+
与 http 类似,每次短连接将获得一个新的 ip
96+
![short](img/short.jpg)
8797

88-
因为 `socks` 代理创建的为 1m 的定时触发器,且函数超时时间较长为避免不必要的浪费,建议在监听到来自云函数的连接后清理触发器,在使用完毕后使用 `-e` 参数彻底清理函数。
8998

9099
## 反向代理
91100
### 部署
@@ -172,7 +181,7 @@ scfproxy clear http -p provider_list -r region_list -o origin
172181
![wechat.png](img/wechat.png)
173182

174183
# TODO
184+
- [x] 优化 socks 功能
175185
- [ ] 优化代码
176186
- [ ] 美化输出
177-
- [ ] 优化 socks 功能
178187
- [ ] 增加华为云,AWS,GCP 等其他云厂商

cmd/clear.go

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var clearCmd = &cobra.Command{
2828
case "http":
2929
return clearHttp(providers, completely)
3030
case "socks":
31-
return clearSocks(providers, completely)
31+
return clearSocks(providers)
3232
case "reverse":
3333
origin, _ := cmd.Flags().GetString("origin")
3434
if origin == "" {
@@ -48,8 +48,8 @@ func init() {
4848
clearCmd.Flags().StringSliceP("region", "r", nil, "specify which regions of cloud providers clear proxy")
4949
clearCmd.Flags().StringP("config", "c", config.ProviderConfigPath, "path of provider credential file")
5050

51-
// clear http or socks needed
52-
clearCmd.Flags().BoolP("completely", "e", false, "[http|socks] whether to completely clear up deployed proxies (by default only delete triggers)`[http | socks]`")
51+
// clear http needed
52+
clearCmd.Flags().BoolP("completely", "e", false, "[http] whether to completely clear up deployed proxies (by default only delete triggers)`[http | socks]`")
5353

5454
// clear reverse needed
5555
clearCmd.Flags().StringP("origin", "o", "", "[reverset] Address of the reverse proxy back to the source")
@@ -59,7 +59,7 @@ func init() {
5959
}
6060

6161
func clearHttp(providers []sdk.Provider, completely bool) error {
62-
hconf, err := config.LoadHttpConfig()
62+
conf, err := config.LoadHttpConfig()
6363
if err != nil {
6464
return err
6565
}
@@ -73,12 +73,13 @@ func clearHttp(providers []sdk.Provider, completely bool) error {
7373
hp := p.(sdk.HttpProxyProvider)
7474
provider, region := hp.Name(), hp.Region()
7575

76-
if record, ok := hconf.Get(provider, region); ok && record.Api == "" && !completely {
76+
if record, ok := conf.Get(provider, region); ok && record.Api == "" && !completely {
7777
logrus.Infof("%s %s trigger has already been cleared", provider, region)
7878
return
7979
}
8080

81-
opts := &sdk.HttpProxyOpts{
81+
opts := &sdk.FunctionOpts{
82+
Namespace: Namespace,
8283
FunctionName: HTTPFunctionName,
8384
TriggerName: HTTPTriggerName,
8485
OnlyTrigger: !completely,
@@ -90,21 +91,21 @@ func clearHttp(providers []sdk.Provider, completely bool) error {
9091
return
9192
}
9293
if completely {
93-
hconf.Delete(provider, region)
94+
conf.Delete(provider, region)
9495
logrus.Printf("[success] cleared http function in %s.%s", provider, region)
9596
} else {
96-
hconf.Set(provider, region, &config.HttpRecord{})
97+
conf.Set(provider, region, &config.HttpRecord{})
9798
logrus.Printf("[success] cleared http trigger in %s.%s", provider, region)
9899
}
99100
}(p)
100101
}
101102
wg.Wait()
102103

103-
return hconf.Save()
104+
return conf.Save()
104105
}
105106

106-
func clearSocks(providers []sdk.Provider, completely bool) error {
107-
sconf, err := config.LoadSocksConfig()
107+
func clearSocks(providers []sdk.Provider) error {
108+
conf, err := config.LoadSocksConfig()
108109
if err != nil {
109110
return err
110111
}
@@ -118,38 +119,28 @@ func clearSocks(providers []sdk.Provider, completely bool) error {
118119
sp := p.(sdk.SocksProxyProvider)
119120

120121
provider, region := sp.Name(), sp.Region()
121-
if record, ok := sconf.Get(provider, region); ok && record.Key == "" && !completely {
122-
logrus.Infof("%s %s trigger has already been cleared", provider, region)
123-
return
124-
}
125122

126-
opts := &sdk.SocksProxyOpts{
123+
opts := &sdk.FunctionOpts{
124+
Namespace: Namespace,
127125
FunctionName: SocksFunctionName,
128-
TriggerName: SocksTriggerName,
129-
OnlyTrigger: !completely,
130126
}
131127
err := sp.ClearSocksProxy(opts)
132128
if err != nil {
133129
logrus.Error(err)
134130
return
135131
}
136132

137-
if completely {
138-
sconf.Delete(provider, region)
139-
logrus.Printf("[success] cleared socks function in %s.%s", provider, region)
140-
} else {
141-
sconf.Set(provider, region, &config.SocksRecord{})
142-
logrus.Printf("[success] cleared socks trigger in %s.%s", provider, region)
143-
}
133+
conf.Delete(provider, region)
134+
logrus.Printf("[success] cleared socks function in %s.%s", provider, region)
144135
}(p)
145136
}
146137

147138
wg.Wait()
148-
return sconf.Save()
139+
return conf.Save()
149140
}
150141

151142
func clearReverse(providers []sdk.Provider, origin string) error {
152-
rconf, err := config.LoadReverseConfig()
143+
conf, err := config.LoadReverseConfig()
153144
if err != nil {
154145
return err
155146
}
@@ -158,9 +149,9 @@ func clearReverse(providers []sdk.Provider, origin string) error {
158149

159150
for _, p := range providers {
160151
i := 0
161-
for _, record := range rconf.Records {
152+
for _, record := range conf.Records {
162153
if record.Provider != p.Name() || record.Region != p.Region() || record.Origin != origin {
163-
rconf.Records[i] = record
154+
conf.Records[i] = record
164155
i++
165156
continue
166157
}
@@ -182,13 +173,11 @@ func clearReverse(providers []sdk.Provider, origin string) error {
182173
}
183174

184175
logrus.Printf("[success] cleard reverse proxy for %s in %s.%s", origin, p.Name(), p.Region())
185-
186176
}(p, record)
187-
188177
}
189-
rconf.Records = rconf.Records[:i]
178+
conf.Records = conf.Records[:i]
190179
}
191180

192181
wg.Wait()
193-
return rconf.Save()
182+
return conf.Save()
194183
}

cmd/config/socks.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,17 @@ import (
44
"encoding/json"
55
"errors"
66
"os"
7-
"strconv"
87
"sync"
98
)
109

11-
type SocksRecord struct {
12-
Host string
13-
Port int
14-
Key string
15-
}
1610

1711
type SocksConfig struct {
1812
mu sync.RWMutex
19-
Records map[string]map[string]*SocksRecord
13+
Records map[string]map[string]string
2014
}
2115

2216
func LoadSocksConfig() (*SocksConfig, error) {
23-
conf := &SocksConfig{Records: make(map[string]map[string]*SocksRecord)}
17+
conf := &SocksConfig{Records: make(map[string]map[string]string)}
2418
data, err := os.ReadFile(SocksProxyPath)
2519
if err != nil {
2620
if errors.Is(err, os.ErrNotExist) {
@@ -33,39 +27,39 @@ func LoadSocksConfig() (*SocksConfig, error) {
3327
return conf, err
3428
}
3529

36-
func (c *SocksConfig) Get(provider, region string) (*SocksRecord, bool) {
30+
func (c *SocksConfig) Has(provider, region string) (bool) {
3731
c.mu.RLock()
3832
defer c.mu.RUnlock()
39-
record, ok := c.Records[provider][region]
40-
return record, ok
33+
_, ok := c.Records[provider][region]
34+
return ok
4135
}
4236

43-
func (c *SocksConfig) Set(provider, region string, record *SocksRecord) {
37+
func (c *SocksConfig) Set(provider, region string) {
4438
c.mu.Lock()
4539
defer c.mu.Unlock()
4640
_, ok := c.Records[provider]
4741
if !ok {
48-
c.Records[provider] = make(map[string]*SocksRecord)
42+
c.Records[provider] = make(map[string]string)
4943
}
50-
c.Records[provider][region] = record
44+
c.Records[provider][region] = ""
5145
}
5246

5347
func (c *SocksConfig) Delete(provider, region string) {
5448
c.mu.Lock()
5549
defer c.mu.Unlock()
50+
5651
delete(c.Records[provider], region)
5752
}
5853

5954
func (c *SocksConfig) Save() error {
60-
6155
return save(c.Records, SocksProxyPath)
6256
}
6357

6458
func (c *SocksConfig) ToDoubleArray() [][]string {
6559
data := [][]string{}
6660
for provider, rmap := range c.Records {
67-
for region, record := range rmap {
68-
data = append(data, []string{provider, region, record.Host, strconv.Itoa(record.Port), record.Key})
61+
for region, _ := range rmap {
62+
data = append(data, []string{provider, region})
6963
}
7064
}
7165
return data

0 commit comments

Comments
 (0)