分流¶
动态配置
分流器支持通过Web API进行动态配置。
关于分流器的更详细说明和使用示例可以参考这篇博文。
分流器¶
在服务,跳跃点和转发链的节点上可以分别设置分流器,在数据转发过程中根据分流器中的规则对目标地址进行匹配测试来决定是否继续转发。
gost -L http://:8080?bypass=10.0.0.0/8 -F http://192.168.1.1:8080?bypass=172.10.0.0/16,127.0.0.1,localhost,*.example.com,.example.org
通过bypass参数来指定请求的目标地址匹配规则列表,规则是以逗号分割的IP,IP范围,CIDR,域名或域名通配符。
services:
- name: service-0
addr: ":8080"
# service level bypass
bypass: bypass-0
handler:
type: http
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
# hop level bypass
bypass: bypass-1
nodes:
- name: node-0
addr: 192.168.1.1:8080
# node level
# bypass: bypass-0
connector:
type: http
dialer:
type: tcp
bypasses:
- name: bypass-0
matchers:
- 10.0.0.0/8
- name: bypass-1
matchers:
- 127.0.0.1
- 172.20.0.1-172.30.0.255
- 172.10.0.0/16
- localhost
- '*.example.com'
- .example.org
使用bypass参数通过引用分流器名称(bypasses.name)来使用指定的分流器。
Hop级别的分流器
命令行模式下的bypass参数配置会应用到hop级别。
黑名单与白名单¶
分流器默认为黑名单模式,如果目标地址匹配上黑名单则数据转发将终止。
也可以将分流器设置为白名单模式,与黑名单相反,只有目标地址与分流器中的规则相匹配才继续进行数据中转。
gost -L http://:8080 -F http://:8081?bypass=~172.10.0.0/16,127.0.0.1,localhost,*.example.com,.example.org
通过在bypass参数中增加~前缀将分流器设置为白名单模式。
services:
- name: service-0
addr: ":8080"
handler:
type: http
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
bypass: bypass-0
nodes:
- name: node-0
addr: :8081
# bypass: bypass-0
connector:
type: http
dialer:
type: tcp
bypasses:
- name: bypass-0
whitelist: true
matchers:
- 172.10.0.0/16
- 127.0.0.1
- localhost
- '*.example.com'
- .example.org
在bypasses中通过设置whitelist属性为true来开启白名单模式。
分流器组¶
通过使用bypasses参数来指定分流器列表来使用多个分流器,当任何一个分流器规则未匹配成功则代表未通过。
services:
- name: service-0
addr: ":8080"
# bypasses:
# - bypass-0
# - bypass-1
handler:
type: http
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
bypasses:
- bypass-0
- bypass-1
nodes:
- name: node-0
addr: :8081
# bypasses:
# - bypass-0
# - bypass-1
connector:
type: http
dialer:
type: tcp
bypasses:
- name: bypass-0
whitelist: true
matchers:
- 172.10.0.0/16
- name: bypass-1
matchers:
- 127.0.0.1
- 172.10.0.1
- localhost
- '*.example.com'
- .example.org
端口匹配¶
对于IP,域名和域名通配符规则也可以包含端口或端口范围,CIDR规则不支持端口匹配。
网络协议过滤¶
3.3.0
分流器可以设置network参数来限制匹配的网络协议类型(例如tcp或udp)。当网络协议不匹配时,分流器规则不生效。
bypasses:
# 黑名单模式:所有TCP连接均被分流
- name: skip-tcp
network: tcp
# 白名单模式:只有UDP连接使用代理,其余被分流
- name: proxy-udp
network: udp
whitelist: true
# 网络 + 地址组合:仅TCP且匹配地址时被分流
- name: bypass-tcp-local
network: tcp
matchers:
- 192.168.1.0/24
- 10.0.0.0/8
- '*.example.com'
- .example.org
当仅设置network参数(无matchers)时:
- 黑名单模式:匹配的网络连接被分流(不通过代理)。
- 白名单模式:匹配的网络连接使用代理,其余被分流。
当同时设置network和matchers时,网络协议首先作为前置过滤条件:
- 网络不匹配 → 分流器不生效,连接正常通过。
- 网络匹配 → 继续使用
matchers规则进行地址匹配判断。
典型用例:TCP/UDP分流¶
在网络代理中,TCP和UDP通常需要不同的处理路径。例如,将TCP流量通过加密代理,UDP流量直连或使用不同的代理:
chains:
- name: chain-0
hops:
- name: hop-0
bypasses:
- skip-udp
nodes:
- name: node-tcp
addr: :8443
bypass: skip-udp
connector:
type: http
dialer:
type: tls
- name: node-udp
addr: :8443
bypass: skip-tcp
connector:
type: relay
dialer:
type: tls
bypasses:
- name: skip-tcp
network: tcp
- name: skip-udp
network: udp
whitelist: true
向后兼容
默认情况下network为空,分流器行为与之前版本完全一致。
分流器类型¶
服务上的分流器¶
当服务上设置了分流器,如果请求的目标地址未通过分流器规则测试(未匹配白名单规则或匹配黑名单规则),则此请求会被拒绝。
8080端口的HTTP代理服务使用了黑名单分流,example.org的请求会正常处理,example.com的请求会被拒绝。
跳跃点上的分流器¶
当跳跃点(Hop)上设置了分流器,如果请求的目标地址未通过分流器规则测试(未匹配白名单规则或匹配黑名单规则),则转发链将终止于此跳跃点,且不包括此跳跃点。
services:
- name: service-0
addr: ":8080"
handler:
type: http
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
bypass: bypass-0
nodes:
- name: node-0
addr: :8081
connector:
type: http
dialer:
type: tcp
- name: hop-1
bypass: bypass-1
nodes:
- name: node-0
addr: :8082
connector:
type: http
dialer:
type: tcp
bypasses:
- name: bypass-0
whitelist: true
matchers:
- example.com
- .example.org
- name: bypass-1
matchers:
- example.com
当请求www.example.com时未通过第一个跳跃点(hop-0)的分流器(bypass-0),因此请求不会使用转发链。
当请求example.com时,通过第一个跳跃点(hop-0)的分流器(bypass-0),但未通过第二个跳跃点(hop-1)的分流器(bypass-1),因此请求将使用转发链第一层级的节点(:8081)进行数据转发。
当请求www.example.org时,通过两个跳跃点的分流器,因此请求将使用完整的转发链进行转发。
转发链节点上的分流器¶
当转发链使用多个节点时,可以通过在节点上设置分流器来对请求进行精准分流。
services:
- name: service-0
addr: ":8080"
handler:
type: http
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: :8081
bypass: bypass-0
connector:
type: http
dialer:
type: tcp
- name: node-1
addr: :8082
bypass: bypass-1
connector:
type: http
dialer:
type: tcp
bypasses:
- name: bypass-0
matchers:
- example.org
- name: bypass-1
matchers:
- example.com
当请求example.com时,通过了节点node-0上的分流器bypass-0,但未通过节点node-1上的分流器bypass-1,因此请求只会使用节点node-0进行转发。
当请求example.org时,未通过节点node-0上的分流器bypass-0,通过了节点node-1上的分流器,因此请求只会使用节点node-1进行转发。
转发器节点上的分流器¶
此类型分流器类似于转发链节点上的分流器,目前仅应用于DNS代理服务。
数据源¶
分流器可以配置多个数据源,目前支持的数据源有:内联,文件,redis,HTTP。
内联¶
内联数据源直接在配置文件中通过matchers参数设置数据。
bypasses:
- name: bypass-0
matchers:
- 127.0.0.1
- 172.10.0.0/16
- localhost
- '*.example.com'
- .example.org
文件¶
指定外部文件作为数据源。通过file.path参数指定文件路径。
文件格式为按行分割的地址列表,以#开始的部分为注释信息。
Redis¶
指定redis服务作为数据源,redis数据类型必须为集合(Set)类型。
bypasses:
- name: bypass-0
redis:
addr: 127.0.0.1:6379
db: 1
username: user
password: 123456
key: gost:bypasses:bypass-0
addr(string, required)- redis服务地址
db(int, default=0)- 数据库名
username(string)- 用户名
password(string)- 密码
key(string, default=gost)- redis key
数据的每一项与文件数据源的格式类似:
> SMEMBERS gost:bypasses:bypass-0
1) "127.0.0.1"
2) "172.10.0.0/16"
3) "localhost"
4) "*.example.com"
5) ".example.org"
HTTP¶
指定HTTP服务作为数据源。对于所请求的URL,HTTP返回200状态码则认为有效,返回的数据格式与文件数据源相同。
url(string, required)- 请求的URL
timeout(duration, default=0)- 请求超时时长
热加载¶
文件,redis,HTTP数据源支持热加载。通过设置reload参数开启热加载,reload参数指定同步数据源数据的周期。
bypasses:
- name: bypass-0
reload: 10s
file:
path: /path/to/file
redis:
addr: 127.0.0.1:6379
db: 1
password: 123456
key: gost:bypasses:bypass-0
http:
url: http://127.0.0.1:8000
timeout: 10s
插件¶
分流器可以配置为使用外部插件服务,分流器会将请求转发给插件服务处理。当使用插件时其他参数无效。
bypasses:
- name: bypass-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/bypass -d '{"network":"tcp","addr":"example.com:80","path":"/index.html","client": "gost"}'
network(string)- 网络类型。
addr(string)- 目标地址。
host(string)- 目标主机名。
path(string)- HTTP请求路径。
client(string)- 用户身份标识,此信息由认证器生成。
基于用户标识的分流
GOST内部的分流器逻辑未处理针对特定用户的分流逻辑,如果需要实现此功能需要组合使用认证器和分流器插件。
认证器在认证成功后返回用户标识,GOST会将此用户标识信息再次传递给分流器插件服务,分流器插件服务就可以根据用户标识来做不同的分流策略。
Geo IP 分流¶
3.3.0
GOST内置的分流器同时支持IP CIDR和域名规则匹配,但两者是相互独立的 — 域名规则仅匹配域名本身,不会先解析域名的IP再与CIDR进行匹配。也就是说,当配置了203.0.113.0/24的CIDR规则时,即使example.com解析到了203.0.113.1,GOST也不会对example.com进行分流。
gost-geo-plugin 是一个基于gRPC的分流器插件,专门用于解决此问题。它内置了高性能IP Trie,可以对DNS解析后的IP地址进行CIDR匹配,从而实现类似路由表的精细化Geo/ASN分流。
运行插件¶
gost-geo-plugin需要一个CIDR列表文件,每行一个CIDR:
可以通过本地文件或URL两种方式加载CIDR列表:
# 从本地文件加载
gost-geo-plugin --list-file /path/to/geoip.txt --listen-addr 127.0.0.1:8000
# 从URL加载(支持HTTP/HTTPS)
gost-geo-plugin --list-url https://example.com/geoip.txt --listen-addr 127.0.0.1:8000
可选参数:
--prefer-ipv6— 优先使用IPv6地址进行匹配。--port— 插件服务端口,默认8000。--refresh— CIDR列表刷新间隔,例如24h,默认不自动刷新。
配置分流器¶
插件启动后,在GOST的配置中使用插件类型的分流器即可:
services:
- name: service-0
addr: ":8080"
bypass: bypass-geo
handler:
type: http
listener:
type: tcp
这样,所有经过GOST代理的请求都会先通过gost-geo-plugin进行IP查询和CIDR匹配,匹配白名单规则的IP地址对应的流量将被分流处理。
与本地分流规则组合
gost-geo-plugin只是将域名解析为IP后再进行CIDR匹配,实际的分流决策仍由GOST的分流器完成。你可以通过分流器组将基于域名的规则和基于Geo IP的规则组合使用,实现更灵活的流量控制策略。