You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"
概述
代理协议(proxy protocol)是haproxy的作者设计的一个协议,通过在tcp流的开始添加一小段内容传递客户端和代理的连接信息。格式如下:
例如 198.168.0.1:34343(客户端) -> 192.16.1.1:80(4层代理)->nginx
那么4层代理就会把这个连接的信息转给后端的nginx或者Apache等服务器。具体协议是:
PROXY TCP4 198.168.0.1 192.16.1.1 34343 80\r\n 后端的nginx拿到这段协议解析了以后,就可以知道真实的客户端IP和端口了。
更新V2版本
大概在2014年,proxy protocol更新了V2版本,是非ASCII码协议,该协议报文包含报文头和报文体。
其中报文头格式:
\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A
在nginx中定义为:
static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n";
(实际上就是\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A
)4bits 协议版本号:
\x2 : v2
4bits cmd:
\x0 : LOCAL \x1 : PROXY
4bits 地址族
\x0 : AF_UNSPEC \x1 : AF_INET \x2 : AF_INET6 \x3 : AF_UNIX
4bits transport protocol
\x0 : UNSPEC \x1 : STREAM \x2 : DGRAM
2字节地址长度字段(网络字节序),指接下来剩余的报文长度
整个报文头在nginx中定义的结构体
ipv4报文体格式:
在nginx中定义的结构体:
ipv6报文体格式:
在nginx中定义的结构体
支持V2版tlvs解析
2022年10月支持了V2版tlvs的解析。
nginx/nginx@50e3ff8
源码
nginx实现在ngx_proxy_protocol.h|c文件中。提供了两个函数,ngx_proxy_protocol_read解析代理协议,ngx_proxy_protocol_write组装代理协议。
总结
后端服务器有时候需要根据客户端ip做一些限制操作,而四层的代理协议可以把真实的客户端ip传递到后端。七层http是通过在header添加 X-Forwarded-For或X-Real-IP的字段实现传递的,当然七层http协议也可以在tcp流的开始用代理协议传递客户端地址信息,这在nginx里也是支持的。
代理协议的客户端地址信息,除了提供变量可以访问,realip模块也使用该信息替换了connection上的客户端IP结构。
在nginx中,四层代理提供了解析和拼接代理协议。而七层协议仅提供了解析代理协议,没有提供拼接代理协议,如果要向上游传递真实客户端信息只能通过header头。
The text was updated successfully, but these errors were encountered: