You need to enable JavaScript to run this app.
导航

四层监听器获取客户端源IP

最近更新时间2024.01.26 10:21:02

首次发布时间2023.03.07 10:29:25

本文将介绍四层监听器如何通过Proxy Protocol协议获取访问负载均衡服务的客户端源IP地址。

场景介绍

负载均衡的四层监听器(TCP/UDP协议)默认具有源地址透传功能,报文经过CLB后客户端源IP地址不会被替换,您可以直接获取到源IP地址。

  • 如果后端服务器组为IP类型,或者客户端IP地址为IPv6地址,而后端服务器为IPv4地址,客户端请求通过负载均衡时,负载均衡会对客户端IP地址进行转换,从而导致后端服务器无法直接获取客户端的源IP地址。
    此时,您可以通过启用四层监听器的Proxy Protocol协议功能来获取客户端源IP地址。

    说明

    四层监听器的Proxy Protocol协议功能正在邀测中,如需使用,请提交工单或联系客户经理申请。

  • 如果四层监听器接入了Web应用防火墙(Web Application Firewall,简称 WAF),客户端请求通过WAF时,WAF会对客户端IP地址进行转换,从而导致后端服务器无法直接获取客户端的源IP地址。
    此时,您可以参考通过负载均衡(CLB)4 层监听器接入云WAF实例配置HTTP Header字段,使WAF携带客户端源IP传递给后端服务器。

配置说明

  • 请确保您已完成负载均衡的基本配置,详细操作请参见负载均衡快速入门
  • 启用四层监听器的Proxy Protocol协议功能前,请确保后端服务器部署的后端服务支持Proxy Protocol v2协议。
    nginx 1.13.11及以上版本支持Proxy Protocol v2协议,本文以Nginx1.20.1为例进行介绍。
  • 如果同一CLB实例的多个监听器使用相同的后端服务器组,则必须为该实例下的所有四层监听器均开启Proxy Protocol协议功能。

配置步骤

步骤一:启用Proxy Protocol协议

  1. 登录负载均衡控制台
  2. 单击目标CLB实例的名称,进入实例详情页面。
  3. 选择“监听器”页签,单击目标监听器右侧的“编辑监听器”按钮,开启Proxy Protocol协议的开关。
  4. 连续三次单击“下一步”按钮,然后单击“确定”按钮“,完成操作。

步骤二:启用后端服务的Proxy Protocol

  1. 登录后端服务器,具体操作请参见登录Linux实例登录Windows实例
  2. 执行以下命令,打开Nginx配置文件nginx.conf。
    vi /etc/nginx/nginx.conf
  3. 按i进入编辑模式,根据以下内容配置Proxy Protocol v2协议获取客户端源地址的功能。
    http { 
        ...
        server { 
            listen 80 proxy_protocol;
            listen 443 ssl proxy_protocol; 
            ...
        }
    ...
          
    stream { 
        ...
        server { 
            listen 123 proxy_protocol;   // 配置TCP/UDP协议的Proxy Protocol功能
            ... 
        } 
    }
    
  4. Esc键退出编辑模式,然后输入 :wq保存退出。
  5. 执行以下命令,启动Nginx使配置生效。
    systemctl start nginx.service

步骤三:获取客户端源IP地址

通过cat /var/log/nginx/access.log命令查看访问日志,可以获取客户端的源IP地址。

  • 携带IPv4客户端源IP地址的Proxy Protocol v2协议的报文头部格式如下所示:
    /*
     * Proxy Protocol Header:
     * NAT44 Header
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                                                               |
     * |                           Signature                           |
     * |                                                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |  Ver  |  Cmd  |   Af  | Proto |           Length              |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                       IPv4 Source Address                     |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                     IPv4 Destination Address                  |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |         Source Port           |        Destination Port       |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     */
    
  • 携带IPv6客户端源IP地址的Proxy Protocol v2协议的报文头部格式如下所示:
    /*
     * Proxy Protocol Header:
     * NAT66 Header
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                                                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                                                               |
     * |                           Signature                           |
     * |                                                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |  Ver  |  Cmd  |   Af  | Proto |           Length              |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                                                               |
     * |                                                               |
     * |                      IPv6 Source Address                      |
     * |                                                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |                                                               |
     * |                                                               |
     * |                    IPv6 Destination Address                   |
     * |                                                               |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     * |         Source Port           |        Destination Port       |
     * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     */