网关配置

网关

# 网关配置说明

  • 在高级配置中,可以对网关集群的基础功能配置进行定义,目前能定义的配置有三个模块。admin、logging、security。
  • 在应用安全网关下添加的配置,在其下新增的所有网关Server都继承该配置。

# admin 配置说明

{
    "admin":{                                      
        "enabled": true,
        "listen": ":2019"                                            
    }
}
1
2
3
4
5
6
参数 类型 必填 默认值 说明
enabled bool 可选 false 是否开启admin服务,默认false
listen string 必填 admin服务访问地址,例如 :2019,表示监听2019端口

此模块定义了gateway 服务提供的端点能力。

接口 描述
/config 查看当前网关配置内容
/firewall/ip 查看端口隐藏IP白名单列表
/debug/pprof pprof 性能监控端口
/metrics prometheus 服务数据拉取端口

# logging 配置说明

{
  "logging" : {
        "logs": {
            "file_log": {                         
                "writer" : {
                    "output": "file",               
                    "filename": "log/gateway.log",  
                    "roll": true,                   
                    "roll_size_mb": 0,       
                    "roll_gzip": true,           
                    "roll_local_time": false,     
                    "roll_keep": 10,              
                    "roll_keep_days": 90          
                },
                "level": "debug",                
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

logging 下固定值 logs, logs 下可添加多个日志配置,每个日志配置名称必须唯一。这里示例值为 “file_log”

参数 类型 必填 默认值 说明
writer.output string 必填 日志输出类型,固定值 file
writer.filename string 必填 日志文件地
writer.roll bool 可选 true 是否开启滚动日志, 默认开启
writer.roll_size_mb int 可选 100 当日志文件达到大约此大小时,它将被轮换,当值小于等于0时, 默认100MB
writer.roll_gzip bool 可选 true 是否压缩滚动文件, 默认true
writer.roll_local_time bool 可选 false 是否在滚动文件名中使用本地时间戳, 默认 false
writer.roll_keep int 可选 10 要保留的最大滚动日志文件数。当值小于等于0时,默认值:10
writer.roll_keep_days int 可选 90 要保留多少天的滚动日志文件。当值小于等于0时,默认值:90
level string 可选 INFO 日志输出级别,支持 DEBUG, INFO, WARN, ERROR, PANIC, and FATAL。支持系统占位符 。默认 INFO

# security 配置说明

security 模块中包含 firewall 防火墙功能配置,当配置了防火墙功能, 对于网关Server监听的http端口和https端口以及指定隐藏配置的端口,会进行拦截,即访问这些端口会被拒绝。那么真实用户怎么访问。有两种方式,

第一种可以通过 ip_whitelist 白名单配置,对于指定ip可以允许访问

第二种IDaaS会将以登录平台用户的IP收集并同步给网关,对于这些登录并且会话生效的用户所在IP,允许访问


{
  "security": {
    "firewall": {                   
      "device": "enps0",             
      "hidden_port": [8080],       
      "ip_whitelist": ["192.168.152.101","192.168.153.0/24"] 
      "use_iptables": true,       
      "open_log": false           
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
参数 类型 必填 默认值 说明
device string 可选 仅在使用 bpf模式下 必填, bpf需要指定监控的网卡名称, 如果服务器上不存在改网卡名称,网关服务启动失败
hidden_port []int 可选 除了Server监听的http端口和https端口外,还可以新增需要隐藏的端口号
ip_whitelist []string 可选 防火墙ip白名单 , 参数支持 IPV4 或者 CIDR 格式
use_iptables bool 可选 false 使用iptables 实现防火墙功能,如果为false,在linux内核版本>5.7的情况下,可能会使用bpf技术实现防火墙功能
open_log bool 可选 true 开启日志,在使用iptables 模式下,并且网关部署服务器添加相关配置前提下,网关会读取防火墙拦截日志并记录. gateway-24.06.1.0 以上版本支持。

# 应用网关高级配置

除了使用基础配置能完成应用的代理配置,访问控制,水印配置之外,还可以针对高级功能进行额外高阶配置。

页面基础配置保存后,最终也会生成一个json格式的高级配置代码。 json配置中包含一个handle数组,每个一个handler代表着其功能名称。json配置必须保留代理配置,即 reverse_proxy 配置。配置顺序请保持不变。

高级配置代码示例:

{
  "handle": [
    {
      "handler": "authentication",
      "providers": {
        "oidc": {
          "domain": "******.bccastle.com",
          "clientId": "FRq******lqA"
        }
      }
    },
    {
      "handler": "script",
      "watermark": {
        "text1": "{user.username}",
        "text2": "{user.mobile_suffix}",
        "color": "#dedede",
        "degree": -30,
        "fontSize": 20,
        "lineSpace": 200,
        "opacity": 0.5
      }
    },
    {
      "handler": "reverse_proxy",
      "upstreams": [
        {
          "dial": "httpbin.org:80"
        }
      ]
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 网关认证:authentication

  • 此配置在开启网关认证时会自动添加,providers 配置中存在oidc配置参数,domain 和 clientId 均是默认生成,不建议手动修改,防止网关认证功能失效 。
  • ignore 可配置忽略认证的URL,默认为空,表示所有URL都需要认证。
{
      "handler": "authentication",
      "providers": {
        "oidc": {
          "domain": "******.bccastle.com",
          "clientId": "FRq******lqA"
        }
      },
      "ignore": [
        {
          "path": ["/api/*"]
        }
      ]
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 水印与页面控制:script

此配置在开启任意访问控制(除网关认证之外) 或者开启水印功能时会添加,其中包含了 watermark 和 control 模块,对应了 水印和页面控制配置参数

{
      "handler": "script",
      "watermark": {
        "text1": "{user.username}",
        "text2": "{user.name}",
        "color": "#dedede",
        "degree": -20,
        "fontSize": 20,
        "lineSpace": 200,
        "opacity": 0.2
      },
      "control": {
        "contextmenu": false,
        "selectstart": false,
        "paste": false,
        "copy": false,
        "cut": false
      }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
参数 类型 必填 默认值 说明
watermark json 可选 水印功能配置,如参数为空,则不开启水印
watermark.text1 string 必填 第一行水印文本, 当开启网关认证时支持动态参数,使用大括号包含参数。
{user.userId} 用户id
{user.username} 用户名
{user.name} 姓名
{user.email} 邮箱
{user.email_prefix} 邮箱前缀
{user.mobile} 手机号
{user.mobile_suffix} 手机号后4位
watermark.text2 string 可选 第二行水印文本
watermark.color string 可选 #dedede 字体颜色
watermark.font string 可选 Microsoft Yahei 字体
watermark.fontSize int 可选 20 字体大小,单位px
watermark.degree int 可选 -30 字体偏移角度,范围[-90, 90]
watermark.opacity int 可选 1 字体透明度 ,范围[0,1], 例如 0 是全透明,0.5 是半透明,1是不透明
watermark.lineSpace int 可选 150 每行文字的垂直间隔,单位px
control json 可选 页面控制操作配置, 如参数为空,则不开启页面控制
control.contextmenu bool 可选 false false=禁止右键操作, true=允许右键操作
control.selectstart bool 可选 false false=禁止选取操作, true=允许选取操作
control.paste bool 可选 false false=禁止粘贴操作, true=允许粘贴操作
control.copy bool 可选 false false=禁止复制操作, true=允许复制操作
control.cut bool 可选 false false=禁止剪贴操作, true=允许剪贴操作

# 反向代理:reverse_proxy

{
    "handler": "reverse_proxy",
    "upstreams": [{                             // 可配置多地址
        "dial": "127.0.0.1:8080",               // 需要代理转发的ip:port
    }],
    "load_balancing": {                         // 多个upstreams 时,负载均衡配置
        "selection_policy": {
            "policy" : "random",                // 轮询策略,默认 random 随机策略
        }.
        "retries": 3,                           // 重试次数
        "try_duration": "5s",                   // 重试总花费时间,总时间超过此时间即不会再重试
        "try_interval": "100ms"                 // 每次重试等待时间 , 当 try_duration >0 && try_interval == 0 时, try_interval默认为250ms
   },
    "transport": {
        "protocol": "http",                     // 固定值,采用 http 协议
        "tls":{                                 // 一般场景下,配置空的tls 足以使用合理的缺省值启用TLS
            "root_ca_pool": [""],               // 要信任的base64编码der编码CA证书的可选列表。 添加信任的根证书颁发机构
            "root_ca_pem_files": [""],          // 添加信任的根证书颁发机构 文件地址
            "client_certificate_file": "",      // 证书文件地址。 此参数存在时,ClientCertificateKeyFile 参数必填
            "client_certificate_key_file": "",  // 密钥文件地址。 此参数存在时,ClientCertificateFile 参数必填
            "insecure_skip_verify": true,       // 如果为true,将跳过服务器证书的TLS验证
            "handshake_timeout": 0,             // 允许与服务器进行TLS握手的持续时间。默认值:没有超时。
            "server_name": "",                  // 验证在TLS握手中接收的证书时使用的服务器名, 默认情况下,这将使用上游地址的主机部分。只有在上游地址与上游可能使用的证书不匹配时,才需要重写此设置
            "renegotiation": "",                // LS重新谈判级别。“never”:禁用重协商; “once”:每连接一次,远端服务器请求重协商一次; “free”:允许远端服务器重复请求重协商
            "except_ports": [""]                // 跳过TLS端口指定一个上游端口列表,即使配置了TLS,也不会在这些端口上尝试使用TLS
        },
        "keep_alive": {
            "enabled": true,                    // 是否启用HTTP Keep-Alive。默认启动
            "probe_interval": "30s",            // 保持连接探测之间的时间间隔, 默认 30s
            "max_idle_conns": 0,                // 最大空闲连接数。默认值:0 ,表示没有限制
            "max_idle_conns_per_host": 32,      // 每台主机的最大空闲连接数。默认值:32
            "idle_timeout": "2m"                // 空闲时连接应保持活动的时间。默认值:2m
        },
        "compression": true,                    // 是否启用压缩。默认启动
        "max_conns_per_host": 0,                // 每台主机的最大连接数。默认值:0(不限)
        "dial_timeout": "3s",                   // 连接上游时的超时时间 。默认值: 3s
        "dial_fallback_delay": "300ms",
        "response_header_timeout": "10s",       // 从服务器读取响应处理程序需要等待多长时间。默认值:没有超时。
        "expect_continue_timeout": "10s",
        "max_response_header_size": 100,        // 从响应处理程序读取的最大字节数
        "write_buffer_size": 0,                 // 写缓冲区的大小(以字节为单位)
        "read_buffer_size": 0,                  // 读取缓冲区的大小(以字节为单位)
        "read_timeout": "10s",                  // 从后端等待下一次读取的最大时间
        "write_timeout": "10s"                  // 等待下一次写入后端的最大时间
    },
    "rewrite": {
        "strip_path_prefix": "",                // 从URI路径的开头去掉给定的前缀
        "strip_path_suffix": "",                // 从URI路径的末尾去掉给定的后缀
     },      
    "headers": {
     "request": {
        "add": {
           "": [""]                             // 新增header
         },
        "set": {
           "": [""]                             // 修改header
         },
        "delete": [""],                         // 删除header
        "replace": {                            // 替换header value
            "key": [{                           // 需要替换的header key, search search_regexp 只能选一个
                "search": "",                   // 需要替换的内容
                "search_regexp": "",            // 需要替换的正则
                "replace": ""                   // 替换后的内容
            }]
        }
    },
    "response": {                              // response 参数和 request 一致
    }                             
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69