本文将介绍四层监听器如何通过Proxy Protocol协议获取访问负载均衡服务的客户端源IP地址。
负载均衡的四层监听器(TCP/UDP协议)默认具有源地址透传功能,报文经过CLB后客户端源IP地址不会被替换,您可以直接获取到源IP地址。
如果后端服务器组为IP类型,或者客户端IP地址为IPv6地址,而后端服务器为IPv4地址,客户端请求通过负载均衡时,负载均衡会对客户端IP地址进行转换,从而导致后端服务器无法直接获取客户端的源IP地址。
此时,您可以通过启用四层监听器的Proxy Protocol协议功能来获取客户端源IP地址。
如果四层监听器接入了Web应用防火墙(Web Application Firewall,简称 WAF),客户端请求通过WAF时,WAF会对客户端IP地址进行转换,从而导致后端服务器无法直接获取客户端的源IP地址。
此时,您可以参考通过负载均衡(CLB)4 层监听器接入云WAF实例配置HTTP Header字段,使WAF携带客户端源IP传递给后端服务器。
vi /etc/nginx/nginx.conf
http { ... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; ... } ... stream { ... server { listen 123 proxy_protocol; // 配置TCP/UDP协议的Proxy Protocol功能 ... } }
systemctl start nginx.service
通过cat /var/log/nginx/access.log
命令查看访问日志,可以获取客户端的源IP地址。
/* * Proxy Protocol Header: * NAT44 Header * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | Signature | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ver | Cmd | Af | Proto | Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | IPv4 Source Address | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | IPv4 Destination Address | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Source Port | Destination Port | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
/* * Proxy Protocol Header: * NAT66 Header * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | Signature | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ver | Cmd | Af | Proto | Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | | * | IPv6 Source Address | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | | * | IPv6 Destination Address | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Source Port | Destination Port | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */