OpenNJet 支持维护 Proxy_protocol V2
proxy_protocol_V2功能
背景
PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n
GET / HTTP/1.1\r\n
Host: 192.168.0.11\r\n
\r\n
#define PP2_TYPE_ALPN 0x01
#define PP2_TYPE_AUTHORITY 0x02
#define PP2_TYPE_CRC32C 0x03
#define PP2_TYPE_NOOP 0x04
#define PP2_TYPE_UNIQUE_ID 0x05
#define PP2_TYPE_SSL 0x20
#define PP2_SUBTYPE_SSL_VERSION 0x21
#define PP2_SUBTYPE_SSL_CN 0x22
#define PP2_SUBTYPE_SSL_CIPHER 0x23
#define PP2_SUBTYPE_SSL_SIG_ALG 0x24
#define PP2_SUBTYPE_SSL_KEY_ALG 0x25
#define PP2_TYPE_NETNS 0x30
-
传递client的real ip(尤其是非http类的应用,http类可以用x-forward-realip等header传递)。
-
代理协议版本2 支持额外的TLV 字段。他可以被前端ssl协议卸载器转发客户端证书信息转发到后端非http 协议的后端服务器。VerneMQ MQTT 代理就是示例之一,它可以利用代理协议版本2,获取客户端的证书的详细信息,进行身份授权。
-
用于在K8s环境中,ingress 对非Http 协议的ssl 终止。
-
GCP/amazon/arure 利用特定TLV 实现负载均衡。
2. 模块说明
3. 配置说明:
|
|
必填
|
配置说明
|
|---|---|---|
|
proxy_protocol
|
是
|
开启proxy_protocol
|
|
proxy_pp2
|
是
|
开启proxy_protocol v2。 on 开启, off 关闭
|
|
proxy_pp2_set_tlv
|
否
|
proxy_pp2_set_tlv key value 格式。key 是 16 进制(两位,要避免和标准的冲突,)。 value 可以是常量,变量。例如:proxy_pp2_set_tlv 0x31 test; 获取:$proxy_protocol_tlv_0x31 前缀变量。注意:包含前面的源ip,目标ip,源端口,目标端口,以及tlv 值,总长度不能超过 4096
|
4. 应用实例
stream {
server {
listen 15006 ;
njtmesh_dest on; #参考下面该指令的备注
proxy_protocol on; #开启protocol 功能
proxy_pp2 on; #开启protocol V2功能
proxy_pp2_set_tlv 0x41 $njtmesh_port; #设置tlv 字段名,以及值
proxy_pass 127.0.0.1:90;
}
}
Ingress policy的配置
http {
server {
listen 8086 proxy_protocol;
server_name server-90;
location /{
#todo: 其他的业务配置指令
proxy_pass 127.0.0.1:$proxy_protocol_tlv_0x41;
}
}
}
5. 参考及致谢
-
Open NJet同nginx一样,通过变量访问传递的信息, http://nginx.org/en/docs/http/ngx_http_core_module.html#var_proxy_protocol_tlv_
-
nginx 商业版本有模块 https://nginx.org/en/docs/http/ngx_http_proxy_protocol_vendor_module.html ,可以解析云服务商如GCP/amazon/Azure的自定义TLV,用于更好的LB控制,但未见设置模块。
-
协议rfc参考: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。