Skip to content

Commit

Permalink
add limiter plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
ginuerzh committed Nov 18, 2023
1 parent 08c4245 commit 233242d
Show file tree
Hide file tree
Showing 7 changed files with 273 additions and 95 deletions.
2 changes: 1 addition & 1 deletion docs/concepts/auth.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,4 +318,4 @@ curl -XPOST http://127.0.0.1:8000/auth -d '{"username":"gost", "password":"gost"
: 客户端地址

`id` (string)
: 插件服务可选择性返回的用户ID标识,此信息会传递给后续的其他插件服务(分流器,主机IP映射器,域名解析器)用于用户身份标识。
: 插件服务可选择性返回的用户ID标识,此信息会传递给后续的其他插件服务(分流器,主机IP映射器,域名解析器,限制器等)用于用户身份标识。
5 changes: 4 additions & 1 deletion docs/concepts/bypass.md
Original file line number Diff line number Diff line change
Expand Up @@ -493,4 +493,7 @@ curl -XPOST http://127.0.0.1:8000/bypass -d '{"addr": "example.com:80", "client"
```

`client` (string)
: 用户身份标识,此信息由认证器插件服务生成。
: 用户身份标识,此信息由认证器插件服务生成。

!!! tip "基于用户标识的分流"
GOST内部的分流器逻辑未处理针对特定用户的分流逻辑,如果需要实现此功能需要组合使用认证器插件和分流器插件。认证器插件在认证成功后返回用户标识,GOST会将此用户标识信息再次传递给分流器插件服务,分流器插件服务就可以根据用户标识来做不同的分流策略。
89 changes: 86 additions & 3 deletions docs/concepts/limiter.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

=== "命令行"

```
```bash
gost -L ":8080?limiter.in=100MB&limiter.out=100MB&limiter.conn.in=10MB&limiter.conn.out=10MB"
```

Expand Down Expand Up @@ -55,7 +55,7 @@

=== "命令行"

```
```bash
gost -L ":8080?rlimiter=10"
```

Expand Down Expand Up @@ -95,7 +95,7 @@

=== "命令行"

```
```bash
gost -L ":8080?climiter=1000"
```

Expand Down Expand Up @@ -390,3 +390,86 @@ limiters:
url: http://127.0.0.1:8000
timeout: 10s
```
## 插件
对于流量速率限制器可以配置为使用外部[插件](/concepts/plugin/)服务,限制器会将查询请求转发给插件服务处理。当使用插件时其他参数无效。
```yaml
limiters:
- name: limiter-0
plugin:
type: grpc
# type: http
addr: 127.0.0.1:8000
tls:
secure: false
serverName: example.com
```
`addr` (string, required)
: 插件服务地址

`tls` (duration, default=null)
: 设置后将使用TLS加密传输,默认不使用TLS加密。

### HTTP插件

```yaml
ingresses:
- name: limiter-0
plugin:
type: http
addr: http://127.0.0.1:8000/limiter
```

#### 请求示例

```bash
curl -XPOST http://127.0.0.1:8000/limiter \
-d'{"network":"tcp","addr":"example.com:443","client":"gost","src":"192.168.1.1:12345"}'
```

```json
{"in":1048576, "out":524288}
```

`network` (string, default=ip4)
: 网络地址类型:`tcp`,`udp`.

`addr` (string)
: 请求目标地址

`client` (string)
: 用户身份标识,此信息由认证器插件服务生成。

`src` (string)
: 客户端地址

`in` (int64)
: 入站速率(bytes/s)

`out` (int64)
: 出站速率(bytes/s)

## 处理器(Handler)上的限制器

对于代理服务(HTTP,HTTP2,SOCKS4,SOCKS5,Relay),流量速率限制器也可以用处理器上。

```yaml hl_lines="6"
services:
- name: service-0
addr: ":8080"
handler:
type: http
limiter: limiter-0
listener:
type: tcp
limiters:
- name: limiter-0
plugin:
addr: 127.0.0.1:8000
```

!!! tip "基于用户标识的限流"
GOST内部的限制器逻辑未处理针对特定用户的流量限制,如果需要实现此功能需要组合使用认证器插件和处理器上的限制器插件。认证器插件在认证成功后返回用户标识,GOST会将此用户标识信息再次传递给限制器插件服务,限制器插件服务就可以根据用户标识来做不同的限流配置。
89 changes: 45 additions & 44 deletions docs/tutorials/tuntap.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ TUN的实现依赖于[wireguard-go](https://git.zx2c4.com/wireguard-go)。

### 使用说明

```
```bash
gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1"
```

Expand Down Expand Up @@ -42,10 +42,10 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m
`peer` (string)
: 对端IP地址,仅MacOS系统有效

`bufferSize` (int)
`buffersize` (int)
: 数据读缓存区大小,默认1500字节

`keepAlive` (bool)
`keepalive` (bool)
: 开启心跳,仅客户端有效

`ttl` (duration)
Expand All @@ -56,11 +56,11 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m

### 使用示例

#### 服务端
**服务端**

=== "命令行"

```
```bash
gost -L=tun://:8421?net=192.168.123.1/24
```

Expand All @@ -82,17 +82,17 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m
mtu: 1350
```

#### 客户端
**客户端**

=== "命令行(Linux/Windows)"

```
```bash
gost -L=tun://:0/SERVER_IP:8421?net=192.168.123.2/24/64
```

=== "命令行(MacOS)"

```
```bash
gost -L="tun://:0/SERVER_IP:8421?net=192.168.123.2/24&peer=192.168.123.1"
```

Expand Down Expand Up @@ -129,9 +129,10 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m

=== "命令行"

```
```bash
gost -L="tun://:8421?net=192.168.123.1/24&gw=192.168.123.2&route=172.10.0.0/16,10.138.0.0/16"
```

=== "配置文件"

```yaml
Expand Down Expand Up @@ -167,7 +168,7 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m
metadata:
net: 192.168.123.1/24
routes:
- 72.10.0.0/16 192.168.123.2
- 172.10.0.0/16 192.168.123.2
- 10.138.0.0/16 192.168.123.3
```

Expand All @@ -178,7 +179,7 @@ gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&m

服务端可以使用[认证器](/concepts/auth/)来对客户端进行认证。

#### 服务端
**服务端**

```yaml hl_lines="6"
services:
Expand All @@ -203,11 +204,11 @@ authers:
认证器的用户名为给客户端分配的IP。
#### 客户端
**客户端**
=== "命令行"
```
```bash
gost -L "tun://:0/SERVER_IP:8421?net=192.168.123.2/24&passphrase=userpass1"
```

Expand Down Expand Up @@ -256,11 +257,11 @@ authers:

#### 创建TUN设备并建立UDP隧道

##### 服务端
**服务端**

=== "命令行"

```
```bash
gost -L=tun://:8421?net=192.168.123.1/24
```

Expand All @@ -278,11 +279,11 @@ authers:
net: 192.168.123.1/24
```

##### 客户端
**客户端**

=== "命令行"

```
```bash
gost -L=tun://:0/SERVER_IP:8421?net=192.168.123.2/24
```

Expand Down Expand Up @@ -330,45 +331,45 @@ $ ping 192.168.123.1
#### iperf3测试
##### 服务端
**服务端**
```
$ iperf3 -s
```bash
iperf3 -s
```

##### 客户端
**客户端**

```
$ iperf3 -c 192.168.123.1
```bash
iperf3 -c 192.168.123.1
```

#### 路由规则和防火墙设置

如果想让客户端访问到服务端的网络,还需要根据需求设置相应的路由和防火墙规则。例如可以将客户端的所有外网流量转发给服务端处理

##### 服务端
**服务端**

开启IP转发并设置防火墙规则

```
$ sysctl -w net.ipv4.ip_forward=1
```bash
sysctl -w net.ipv4.ip_forward=1

$ iptables -t nat -A POSTROUTING -s 192.168.123.0/24 ! -o tun0 -j MASQUERADE
$ iptables -A FORWARD -i tun0 ! -o tun0 -j ACCEPT
$ iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.123.0/24 ! -o tun0 -j MASQUERADE
iptables -A FORWARD -i tun0 ! -o tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
```

##### 客户端
**客户端**

设置路由规则

!!! caution "谨慎操作"
以下操作会更改客户端的网络环境,除非你知道自己在做什么,请谨慎操作!

```
$ ip route add SERVER_IP/32 dev eth0 # 请根据实际情况替换SERVER_IP和eth0
$ ip route del default # 删除默认的路由
$ ip route add default via 192.168.123.2 # 使用新的默认路由
```bash
ip route add SERVER_IP/32 dev eth0 # 请根据实际情况替换SERVER_IP和eth0
ip route del default # 删除默认的路由
ip route add default via 192.168.123.2 # 使用新的默认路由
```

## TAP
Expand All @@ -383,7 +384,7 @@ TAP的实现依赖于[songgao/water](https://github.com/songgao/water)库。

### 使用说明

```
```bash
gost -L="tap://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tap0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1"
```

Expand Down Expand Up @@ -411,17 +412,17 @@ gost -L="tap://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tap0&m
`routes` (list)
: 特定网关路由列表,列表每一项为空格分割的CIDR地址和网关,例如:`10.100.0.0/16 192.168.123.2`

`bufferSize` (int)
`buffersize` (int)
: 数据读缓存区大小,默认1500字节


### 使用示例

#### 服务端
**服务端**

=== "命令行"

```
```bash
gost -L=tap://:8421?net=192.168.123.1/24
```

Expand All @@ -443,11 +444,11 @@ gost -L="tap://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tap0&m
mtu: 1350
```

#### 客户端
**客户端**

=== "命令行"

```
```bash
gost -L=tap://:0/SERVER_IP:8421?net=192.168.123.2/24
```

Expand Down Expand Up @@ -483,11 +484,11 @@ GOST中的TUN/TAP隧道默认是基于UDP协议进行数据传输。

此方式比较灵活通用,推荐使用。

#### 服务端
**服务端**

=== "命令行"

```
```bash
gost -L=tun://:8421?net=192.168.123.1/24 -L relay+wss://:8443?bind=true
```

Expand All @@ -513,11 +514,11 @@ GOST中的TUN/TAP隧道默认是基于UDP协议进行数据传输。
type: wss
```

#### 客户端
**客户端**

=== "命令行"

```
```bash
gost -L=tun://:0/:8421?net=192.168.123.2/24 -F relay+wss://SERVER_IP:8443
```

Expand Down
Loading

0 comments on commit 233242d

Please sign in to comment.