Skip to content

分流

动态配置

分流器支持通过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,CIDR,域名或域名通配符)。

services:
- name: service-0
  addr: ":8080"
  bypass: bypass-0
  handler:
    type: http
    chain: chain-0
  listener:
    type: tcp
chains:
- name: chain-0
  hops:
  - name: hop-0
    # hop level
    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:
  - 172.10.0.0/16
  - 127.0.0.1
  - localhost
  - '*.example.com'
  - .example.org

节点中使用bypass属性通过引用分流器名称(name)来使用指定的分流器。

Hop级别的分流器

bypass可以设置在hop或node上,如果node上未设置则使用hop上指定的bypass。

命令行模式下的bypass参数配置会应用到hop级别。

黑名单与白名单

分流器默认为黑名单模式,当执行转发链的节点选择时,每当确定一个层级节点后,会应用此节点上的分流器,若请求的目标地址与分流器中的规则相匹配,则转发链终止于此节点(且不包含此节点)。

也可以将分流器设置为白名单模式,与黑名单相反,只有目标地址与分流器中的规则相匹配,才继续进行下一层级的节点选择。

gost -L http://:8080 -F http://192.168.1.1:8080?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: 192.168.1.1:8080
      # bypass: bypass-0
      connector:
        type: http
      dialer:
        type: tcp
bypasses:
- name: bypass-0
  reverse: true
  matchers:
  - 172.10.0.0/16
  - 127.0.0.1
  - localhost
  - '*.example.com'
  - .example.org

bypasses中通过设置reverse属性为true来开启白名单模式。

服务上的分流器

当服务上设置了分流器,其行为有别于转发链上的分流器。如果请求未通过分流器规则测试(未匹配白名单规则或匹配黑名单规则),则此请求会被拒绝。

数据源

分流器可以配置多个数据源,目前支持的数据源有:内联,文件,redis。

内联

内联数据源是指直接在配置文件中通过matchers参数设置数据。

bypasses:
- name: bypass-0
  matchers:
  - 127.0.0.1
  - 172.10.0.0/16
  - localhost
  - '*.example.com'
  - .example.org

文件

指定外部文件作为数据源。通过file.path参数指定文件路径。

bypasses:
- name: bypass-0
  file:
    path: /path/to/bypass/file

文件格式为按行分割的地址列表,以#开始的部分为注释信息。

# ip, cidr, domain or wildcard
127.0.0.1
172.10.0.0/16
localhost
*.example.com
.example.org

Redis

指定redis服务作为数据源,redis数据类型必须为集合(Set)类型。

bypasses:
- name: bypass-0
  redis:
    addr: 127.0.0.1:6379
    db: 1
    password: 123456
    key: gost:bypasses:bypass-0
addr (string, required)
redis服务地址
db (int, default=0)
数据库名
password (string)
密码
key (string, default=gost)
redis key

热加载

文件和redis数据源支持热加载。通过设置reload参数开启热加载,reload参数指定同步数据源数据的周期。

bypasses:
- name: bypass-0
  reload: 10s
  file:
    path: /path/to/auth/file
  redis:
    addr: 127.0.0.1:6379
    db: 1
    password: 123456
    key: gost:bypasses:bypass-0