功能介绍
使用边缘接入服务-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回源步骤:
- 登录边缘安全加速控制台,选择【边缘接入】控制台。
- 进入【域名】-【IP应用加速接入】页面。
- 点击左上角【新增接入】。
- 找到传递用户IP回源模块,打开开关。
- 选择传递用户IP回源方式,选择proxy_protocol方式时,还需要选择协议版本号;选择tcp_option时,您需要下载适配源站系统版本的toa模块,并安装到源站后才可正常使用该功能。
编辑域名,配置传递用户IP回源步骤:
- 登录边缘安全加速控制台,选择【边缘接入】控制台。
- 进入【域名】-【IP应用加速接入】页面。
- 在首页列表页面,点击详情,点击右下角编辑配置,编辑目标域名/实例。
- 找到传递用户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。
- 确保httpd服务正常安装且版本大于等于httpd 2.4.31,可用:/usr/local/httpd/bin/apachectl -v 名称查看版本号。
- 打开Apache的主配置文件httpd.conf。
/usr/local/httpd/conf/httpd.conf
- 在配置文件中启用mod_remoteip模块。
LoadModule remoteip_module modules/mod_remoteip.so
- 在httpd.conf配置文件里的VirtualHost下添加“RemoteIPProxyProtocol On”开启proxy_protocol协议支持。
<VirtualHost *:80>
RemoteIPProxyProtocol On
</VirtualHost>
- 重启Apache服务,完成开启Apache proxy_protocal协议配置。
HAProxy
HAProxy是一个使用C语言编写的自由及开放源代码软件,基于TCP和HTTP提供高可用性、负载均衡,其不能像Apache服务一样配置一个http服务源站,只能作为负载均衡器作为代理转发作用,故其后端需要对应至少一个应用服务源站。此示例中使用Apache来模拟一个http源站。请求链路为:客户请求--->IP应用加速网关--->HAProxy负载均衡--->Apache http源站服务,HAProxy有如下两种配置方式以实现传递用户真实IP回源。
HAProxy组件完全作为转发器,内容透传到后端(此种场景支持TCP和HTTP两种客户请求协议)
- 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
- 重启HAProxy,完成开启HAProxy proxy_protocal协议配置。
HAProxy组件作为PP协议卸载作用,发送后端不添加PP协议,而是把用户真实IP放到x-forwarded-for协议头传递到后端应用服务源站(此种场景只支持HTTP客户请求协议)
- 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
- 重启HAProxy,完成开启HAProxy proxy_protocal协议配置。
使用tcp_option方式须知
选择tcp_option时,您需要下载适配源站系统版本的toa模块,并安装到源站后才可正常使用该功能。不同系统的toa模块下载地址如下:
支持的linux版本 | RPM压缩包下载 |
---|---|
CentOS 6.5 | tcp_toa-1.0-1.CentOS.6.5.x86_64.rar |
CentOS 6.9 | tcp_toa-1.0-1.CentOS.6.9.x86_64.rar |
CentOS 7.0 | tcp_toa-1.0-1.CentOS.7.0.x86_64.rar |
CentOS 7.1 | tcp_toa-1.0-1.CentOS.7.1.x86_64.rar |
CentOS 7.2 | tcp_toa-1.0-1.CentOS.7.2.x86_64.rar |
CentOS 7.3 | tcp_toa-1.0-1.CentOS.7.3.x86_64.rar |
CentOS 7.4 | tcp_toa-1.0-1.CentOS.7.4.x86_64.rar |
CentOS 7.5 | tcp_toa-1.0-1.CentOS.7.5.x86_64.rar |
CentOS 7.6 | tcp_toa-1.0-1.CentOS.7.6.x86_64.rar |
CentOS 7.7 | tcp_toa-1.0-1.CentOS.7.7.x86_64.rar |
CentOS 7.8 | tcp_toa-1.0-1.CentOS.7.8.x86_64.rar |
安装
[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_toa
tcp_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回源功能界面: