边缘安全加速平台

传递用户IP回源

2024-04-30 07:33:44

功能介绍

使用边缘接入服务-IP应用加速后,源站获取到的客户端IP会变为应用加速回源节点的IP。如果源站需要获取真实的客户端IP地址,有两种方式:

  • proxy_protocol(简称PP),对内核无要求,需要源站进行修改,解析对应的文本字符串以获取真实的客户端IP。目前,Nginx和HAProxy已经支持,因此Nginx和HAProxy源站推荐使用该方式获取客户端IP。proxy_protocol的v1版本仅支持TCP协议,v2版本同时支持TCP和UDP协议。

  • tcp_option传递用户IP回源的方式,该方式仅适用于TCP协议。选择该方式时,Linux系统需要安装我们提供的toa内核模块来获取真实客户端地址,该方式无需源站进行修改即可获取到真实的客户端IP。

配置说明

新增域名,配置传递用户IP回源步骤:

  1. 登录边缘安全加速平台,选择【接入管理】-【IP应用加速接入】。

  2. 点击左上角【新增域名】。

  3. 找到传递用户IP回源模块,打开开关。

  4. 选择传递用户IP回源方式,选择proxy_protocol方式时,还需要选择协议版本号;选择tcp_option时,您需要下载适配源站系统版本的toa模块,并安装到源站后才可正常使用该功能。

编辑域名,配置传递用户IP回源步骤:

  1. 登录边缘安全加速平台,选择【接入管理】-【IP应用加速接入】。

  2. 在域名列表页面,点击详情,点击右下角编辑配置,编辑目标域名。

  3. 找到传递用户IP回源模块,打开或者关闭开关;打开时需选择传递用户IP回源方式,选择proxy_protocol方式时,还需要选择协议版本号;选择tcp_option时,您需要下载适配源站系统版本的toa模块,并安装到源站后才可正常使用该功能。

使用proxy_protocol方式须知

选择proxy_protocol方式时,还需要选择协议版本号,v1版本仅支持TCP协议,v2版本同时支持TCP和UDP协议。

Nginx

PP方式获取客户端IP,以Nginx为例,只需把参数proxy_protocol加到server块的listen指令中,示例如下:

http {    #...
    server {        listen 80   proxy_protocol;        listen 443  ssl proxy_protocol;        #...
    }
}

Apache

Apache服务支持proxy_protocol协议必须要求httpd版本大于等于httpd 2.4.31。

  1. 确保httpd服务正常安装且版本大于等于httpd 2.4.31,可用:/usr/local/httpd/bin/apachectl -v 名称查看版本号。

  2. 打开Apache的主配置文件httpd.conf。

/usr/local/httpd/conf/httpd.conf
  1. 在配置文件中启用mod_remoteip模块。

LoadModule remoteip_module modules/mod_remoteip.so
  1. 在httpd.conf配置文件里的VirtualHost下添加“RemoteIPProxyProtocol On”开启proxy_protocol协议支持。

<VirtualHost *:80>
 RemoteIPProxyProtocol On</VirtualHost>
  1. 重启Apache服务,完成开启Apache proxy_protocal协议配置。

HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码软件,基于TCP和HTTP提供高可用性、负载均衡,其不能像Apache服务一样配置一个http服务源站,只能作为负载均衡器作为代理转发作用,故其后端需要对应至少一个应用服务源站。此示例中使用Apache来模拟一个http源站。请求链路为:客户请求--->IP应用加速网关--->HAProxy负载均衡--->Apache http源站服务,HAProxy有如下两种配置方式以实现传递用户真实IP回源。

HAProxy组件完全作为转发器,内容透传到后端(此种场景支持TCP和HTTP两种客户请求协议)

  1. HAProxy配置

frontend部分,监听端口开启proxy_protocol,详见:bind *:8080 accept-proxy

frontend test-proxy    bind        *:8080 accept-proxy    mode            http    log             global    option          httplog    option          dontlognull    maxconn         8000
    timeout client  30s 
    # layer7: prevent private network relaying
    acl forbidden_dst url_ip 192.168.0.0/24
    acl forbidden_dst url_ip 172.16.0.0/12
    acl forbidden_dst url_ip 10.0.0.0/8
    http-request deny if forbidden_dst 
    default_backend test-proxy-srv

backend部分,发送后端开启pp协议,详见:server next-hop 172.21.51.56:80 send-proxy

backend test-proxy-srv
    mode            http
    timeout connect 5s
    timeout server  5s
    retries         2
 
    # layer7: Only GET method is valid
    acl valid_method        method GET
    http-request deny if !valid_method
 
    # take IP address from URL's authority
    # and drop scheme+authority from URI
    http-request set-dst url_ip
    http-request set-dst-port url_port
    http-request set-uri %[pathq]    server next-hop 172.21.51.56:80 send-proxy
  1. 重启HAProxy,完成开启HAProxy proxy_protocal协议配置。

HAProxy组件作为PP协议卸载作用,发送后端不添加PP协议,而是把用户真实IP放到x-forwarded-for协议头传递到后端应用服务源站(此种场景只支持HTTP客户请求协议)

  1. HAProxy配置

frontend部分:

  • 监听端口开启proxy_protocol,详见:bind *:8080 accept-proxy

  • 用户真实IP从pp里读取后放在x-forwarded-for头进行传递,详见:option forwardfor

frontend test-proxy    bind        *:8080 accept-proxy    mode            http    log             global    option          httplog    option          dontlognull    maxconn         8000
    timeout client  30s 
    # layer7: prevent private network relaying
    acl forbidden_dst url_ip 192.168.0.0/24
    acl forbidden_dst url_ip 172.16.0.0/12
    acl forbidden_dst url_ip 10.0.0.0/8
    http-request deny if forbidden_dst 
    default_backend test-proxy-srv   option forwardfor

backend部分,发送后端不开启pp协议,详见:server next-hop 172.21.51.56:80

backend test-proxy-srv
    mode            http
    timeout connect 5s
    timeout server  5s
    retries         2
 
    # layer7: Only GET method is valid
    acl valid_method        method GET
    http-request deny if !valid_method
 
    # take IP address from URL's authority
    # and drop scheme+authority from URI
    http-request set-dst url_ip
    http-request set-dst-port url_port
    http-request set-uri %[pathq]    server next-hop 172.21.51.56:80
  1. 重启HAProxy,完成开启HAProxy proxy_protocal协议配置。

使用tcp_option方式须知

选择tcp_option时,您需要下载适配源站系统版本的toa模块,并安装到源站后才可正常使用该功能。不同系统的toa模块下载地址如下:

安装

[root@test ~]# rpm -ivh tcp_toa-1.0-1.CentOS.7.8.x86_64.rpm
Preparing...                   ################################# [100%]
Updating / installing...   1:tcp_toa-1.0-1.CentOS.7.8         ################################# [100%]

运行

[root@test ~]# service tcp_toa start[starting tcp_toa]:
installing tcp_toa...           [OK]

查看toa模块状态

[root@test ~]# lsmod |grep tcp_toatcp_toa                12884  0

停止toa模块

[root@test ~]# service tcp_toa stop[stopping tcp_toa]:
uninstalling tcp_toa...         [OK]

卸载rpm包

[root@test ~]# rpm -e tcp_toa[stopping tcp_toa]:
tcp_toa is not running!         [OK]

配置界面

新增域名,配置传递用户IP回源功能界面:

编辑域名,配置传递用户IP回源功能界面:


Lru3DC5jELNn