网关配置
网关
# 网关配置说明
- 在高级配置中,可以对网关集群的基础功能配置进行定义,目前能定义的配置有三个模块。admin、logging、security。
- 在应用安全网关下添加的配置,在其下新增的所有网关Server都继承该配置。
# admin 配置说明
{
"admin":{
"enabled": true,
"listen": ":2019"
}
}
1
2
3
4
5
6
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
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
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
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
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
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
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