限速限流¶
动态配置
限速器支持通过Web API进行动态配置。
限制器¶
在每个服务上可以通过设置限制器来对请求进行限制,目前的限制器支持对上下行流量速率,请求速率和并发连接数的限制。
流量速率限制¶
流量速率限制包括服务,连接和IP三个级别的限速,三个级别可以组合使用。
命令行中通过limiter.in和limiter.out来设置服务级别的限速,通过limiter.conn.in和limiter.conn.out来设置连接级别的限速。
配置文件中使用limiter参数通过引用限速器名称(limiters.name)来使用指定的限速器。
通过limits选项指定配置列表,每一个配置项包含空格分割的三个部分:
-
作用域(Scope):限速作用范围,IP地址或CIDR,例如192.168.1.1,192.168.0.0/16。其中两个特殊的值:
$代表服务级别,$$代表连接级别。 -
入站速率(Input):服务接收数据的速率(每秒流量),支持的单位有: B,KB,MB,GB,TB,例如 128KB,1MB,10GB。0或负值代表无限制。
-
出站速率(Output):服务发送数据的速率(每秒流量),单位同入站速率。出站速率可选,0或负值代表无限制。
limiter.refreshInterval(duration, default=30s)-
设置限制器插件同步配置间隔时长。
limiter.scope(string)-
3.1.0
设置限制器插件请求作用域。
service- 仅请求服务级别,conn- 仅请求连接级别。默认(不设置或为空)同时请求服务级别和连接级别。
请求速率限制¶
请求速率限制包括服务,IP两个级别的限速,两个级别可以组合使用。
命令行中通过rlimiter来设置服务级别的请求速率限制(每秒请求数)。
配置文件中使用rlimiter参数通过引用限制器名称(rlimiters.name)来使用指定的限制器。
通过limits选项指定配置列表,每一个配置项包含空格分割的两个部分:
-
作用域(Scope):作用范围,IP地址或CIDR,例如192.168.1.1,192.168.0.0/16。其中两个特殊的值:
$代表服务级别,$$代表IP级别默认限制,当给特定IP或CIDR设置了限制数,则$$会被忽略。 -
请求速率(Rate):请求速率值(每秒请求数)。
并发连接数限制¶
并发连接数限制包括服务,IP两个级别的限速,两个级别可以组合使用。
命令行中通过climiter来设置服务级别的最大并发连接数。
配置文件中使用climiter参数通过引用限制器名称(climiters.name)来使用指定的限制器。
通过limits选项指定配置列表,每一个配置项包含空格分割的两个部分:
-
作用域(Scope):作用范围,IP地址或CIDR,例如192.168.1.1,192.168.0.0/16。其中两个特殊的值:
$代表服务级别,$$代表IP级别默认限制,当给特定IP或CIDR设置了限制数,则$$会被忽略。 -
最大连接数(Limit):最大并发连接数值。
流量配额限制¶
3.3.0
流量配额限制器是一种累计流量限制器,用来对一个时间窗口(startsAt到expiresAt)内的总流量进行限制。与流量速率限制器不同,配额限制器统计的是累计字节数,一旦累计流量达到设定的阈值(limit),使用此配额的服务将被停止,直到进入下一个时间窗口。
多个服务可以引用同一个配额名称,它们将共享同一个配额计数器。
命令行中通过quotas来指定服务所使用的配额限制器。
配置文件中使用quotas参数通过引用配额名称(quotas.name)来使用指定的配额限制器。
name(string, required)- 配额名称。
limit(string)- 流量限制值,支持的单位有: B, KB, MB, GB, TB,例如 128KB, 1MB, 10GB。0或未设置代表无限制。
startsAt(string, RFC3339)- 配额起始时间,RFC3339格式,例如
"2025-01-01T00:00:00Z"。未设置代表不限制起始时间。 expiresAt(string, RFC3339)- 配额到期时间,RFC3339格式。未设置代表永不过期。
direction(string, default=total)- 流量统计方向。
total- 总流量(入站+出站),in- 仅入站流量,out- 仅出站流量。 flush(duration, default=10s)- 持久化存储间隔时长,配额使用量会定期刷新到存储中。
store(object)- 持久化存储配置。默认使用文件存储(
gost-quota.json)。
存储配置¶
文件存储¶
默认使用文件存储,配额数据保存在本地文件中。
store.type(string, default=file)- 存储类型,
file或redis。 store.file(string, default=gost-quota.json)- 文件路径。
Redis存储¶
3.3.0
使用Redis存储配额数据,支持持久化到Redis服务中。
quotas:
- name: quota-0
store:
type: redis
redis:
addr: 127.0.0.1:6379
db: 1
username: user
password: 123456
key: gost:quotas:quota-0
store.redis.addr(string, required)- Redis服务地址。
store.redis.db(int, default=0)- 数据库名。
store.redis.username(string)- 用户名。
store.redis.password(string)- 密码。
store.redis.key(string, required)- Redis key,用于存储配额数据。
Web API¶
配额限制器支持通过Web API进行动态配置,支持以下操作:查看配额列表,获取单个配额详情,创建、更新、删除配额,以及重置配额计数器。
数据源¶
限制器可以配置多个数据源,目前支持的数据源有:内联,文件,redis。
内联¶
内联数据源是指直接在配置文件中通过limits参数设置数据。
文件¶
指定外部文件作为数据源。通过file.path参数指定文件路径。
文件格式为按行分割的限速配置列表,以#开始的部分为注释信息,每项配置格式同内联配置。
Redis¶
指定redis服务作为数据源,redis数据类型必须为集合(Set)或列表(List)类型,每项配置格式同内联配置。
addr(string, required)- redis服务地址
db(int, default=0)- 数据库名
username(string)- 用户名
password(string)- 密码
key(string, default=gost)- redis key
type(string, default=set)- 数据类型,支持的类型有:集合(
set),列表(list)。
数据的每一项与文件数据源的格式类似:
HTTP¶
指定HTTP服务作为数据源。对于所请求的URL,HTTP返回200状态码则认为有效,返回的数据格式与文件数据源相同。
url(string, required)- 请求的URL
timeout(duration, default=0)- 请求超时时长
优先级¶
当同时配置多个数据源时,优先级从高到低为: HTTP,redis,文件,内联。如果在不同数据源中存在相同的作用域,则优先级高的会覆盖优先级低的配置。
热加载¶
文件,redis,HTTP数据源支持热加载。通过设置reload参数开启热加载,reload参数指定同步数据源数据的周期。
limiters:
- name: limiter-0
reload: 60s
file:
path: /path/to/file
redis:
addr: 127.0.0.1:6379
db: 1
password: 123456
key: gost:limiters:limiter-0
http:
url: http://127.0.0.1:8000
timeout: 10s
插件¶
对于流量速率限制器可以配置为使用外部插件服务,限制器会将查询请求转发给插件服务处理。当使用插件时其他参数无效。
limiters:
- name: limiter-0
plugin:
type: grpc
addr: 127.0.0.1:8000
tls:
secure: false
serverName: example.com
type(string, default=grpc)- 插件类型:
grpc,http。 addr(string, required)- 插件服务地址。
tls(object, default=null)- 设置后将使用TLS加密传输,默认不使用TLS加密。
HTTP插件¶
请求示例¶
curl -XPOST http://127.0.0.1:8000/limiter \
-d'{"scope":"client","service":"service-0","network":"tcp","addr":"example.com:443","client":"gost","src":"192.168.1.1:12345"}'
scope(string)- 作用域,
service- 服务级别,conn- 连接级别,client- 用户级别。 service(string)- 服务名。
network(string)- 网络地址类型:
tcp,udp。 addr(string)- 请求目标地址。
client(string)- 用户身份标识,此信息由认证器生成。
src(string)- 客户端地址。
in(int64)- 入站速率(bytes/s),0或负值代表无限制。
out(int64)- 出站速率(bytes/s),0或负值代表无限制。
处理器(Handler)上的限制器¶
对于支持认证的处理器(HTTP,HTTP2,SOCKS4,SOCKS5,Relay,Tunnel),流量速率限制器也可以用在这些类型的处理器上。
services:
- name: service-0
addr: ":8080"
handler:
type: http
limiter: limiter-0
metadata:
limiter.refreshInterval: 30s
listener:
type: tcp
limiters:
- name: limiter-0
plugin:
addr: 127.0.0.1:8000
基于用户标识的限流¶
GOST内部的限制器逻辑未处理针对特定用户的流量限制,如果需要实现此功能需要组合使用认证器和处理器上的限制器插件。
认证器在认证成功后返回用户标识,GOST会将此用户标识信息再次传递给限制器插件服务,并设置作用域为用户级别(scope=client),限制器插件服务就可以根据用户标识来做不同的限流配置。
Tunnel处理器
对于Tunnel处理器,限流单位为单个隧道,client值为Tunnel ID。