上云无忧 > 文档中心 > 百度智能云 DDoS 高防IP获取真实客户端IP
DDoS防护服务
百度智能云 DDoS 高防IP获取真实客户端IP

文档简介:
当接入高防防护服务后,网站服务器访问日志中的IP地址都将记录为高防防护的反向代理服务IP,无法取得客户端的真实IP地址。 为解决这个问题,我们在高防防护转发的HTTP头信息中增加了两个HEAD信息,包括X-Forwarded-For和X-Real-IP。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

1.网站接入

当接入高防防护服务后,网站服务器访问日志中的IP地址都将记录为高防防护的反向代理服务IP,无法取得客户端的真实IP地址。

为解决这个问题,我们在高防防护转发的HTTP头信息中增加了两个HEAD信息,包括X-Forwarded-For和X-Real-IP:X-Forwarded-For记录的是请求过程中使用的代理IP列表,包括与我们代理直连的IP;X-Real-IP记录客户端的真实IP,WEB服务器日志或服务器程序就可以根据自己的方法来获取真实的客户端IP。

这种方式不需要配置,默认支持。

1.1.服务器日志类记录方法

  • Nginx服务器

源站是Nginx搭建的服务器,则有2种方法获取,一种是配置文件中指定日志格式时使用$http_x_forwarded_for变量,另一种是加载realip模块,并做好相应的配置。

  1. 日志方式

在nginx.conf中,配置log_format,定义访问日志记录的格式中用到$http_x_forwarded_for,示例如下:

log_format   main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent
 "$http_referer" ''"$http_user_agent" ';

上述示例配置了main的日志模板,在日志记录指令中指定这个模板就可以输出。

  1. 模块方式

Nginx还支持通过内置的Realip模块自动还原客户端IP。具体使用时需要编译相应的模块,通常是加上--with-http_realip_module参数来启用它。

  • Apache服务器

源站是Apache服务器的,日志记录方案与nginx类似,配置指令不同,参考如下:

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

1.2.服务器程序类读取方法

防御过程中,我们透传客户端IP采用http的HEAD头,不同的服务器程序读取HEAD头的方式不一样,下面分别介绍常用程序的读取方法

  • ASP程序
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
  • PHP
$_SERVER["HTTP_X_FORWARDED_FOR"]
  • JSP
request.getHeader("HTTP_X_FORWARDED_FOR")

2.端口接入

对于端口接入的源站需要加载TTM模块后才能获取到客户端真实源IP,您可以使用本文介绍的方法下载并安装TTM模块。

这种方式需要在端口的防护业务配置开启TTM功能(默认为开启)。配置路径:防护业务->编辑/添加端口。

2.1.TTM模块原理

客户端的数据包经过高防IP转发后,会将数据包的源地址和端口号,改成高防IP回源的地址和端口号。为了将客户端真实源IP和端口号发送给服务端,高防IP转发报文时会将客户端真实源IP和端口号添加到TCP报文的tcp option字段。源站加载TTM模块后,TTM模块通过hook Linux内核TCP协议栈的相关函数,从TCP报文的tcp option字段中解析出客户端真实源IP和端口号,详细描述如下:

  1. Linux TCP协议栈在建连阶段收到客户端三次握手的ACK报文后,会调用tcp_v4_syn_recv_sock函数。TTM模块hook了tcp_v4_syn_recv_sock函数,hook后的tcp_v4_syn_recv_sock_ttm函数首先会调用原来的tcp_v4_syn_recv_sock函数,然后调用get_ttm_data_from_ack函数,从ACK报文的tcp option字段中,提取出客户端真实源IP和端口号,并存储在sock的sk_user_data变量中,其中每条流对应一个sock。
  2. 客户端应用程序在用户态调用getpeername或者accept接口时,最终都会调用到inet_getname函数,TTM模块hook了inet_getname函数,hook后的inet_getname_ttm函数首先会调用原有的inet_getname函数,然后判断sock中的sk_user_data变量是否为空,如果sk_user_data变量不为空则从该变量中提取出客户端真实源IP和端口号,替换原有inet_getname返回的高防IP回源地址和端口号,这样客户端应用程序调用getpeername或者accept接口获取到的就是客户端真实源IP和端口号。

2.2.TTM模块支持的操作系统

  • Linux

注意

  1. 建议先在测试环境进行测试,待确认功能正常且运行稳定后再部署上线到正式环境。
  2. TTM模块目前仅支持IPv4,且只支持64位操作系统。
  3. 非TCP协议不支持获取客户端真实源IP和端口号。
  4. 如果源站已经加载了类似的模块,hook了Linux协议栈的tcp_v4_syn_recv_sock和inet_getname函数,加载TTM模块后,会导致原有模块的功能不生效。
  5. 七层业务(HTTP/HTTPS协议)可以在http header中直接通过X_forwarded_for字段来获取客户端真实源IP。

2.3.TTM模块安装步骤

  1. 下载Linux对应版本的TTM模块,并进行加载
系统 版本号 下载地址
CentOS 3.10.0-514.26.2.el7.x86_64 https://sdk.bce.baidu.com/console-sdk/3.10.0-514.26.2.el7.zip
CentOS 3.10.0-693.el7.x86_64 https://sdk.bce.baidu.com/console-sdk/3.10.0-693.el7.zip
CentOS 3.10.0-957.1.3.el7.x86_64 https://sdk.bce.baidu.com/console-sdk/3.10.0-957.1.3.el7.zip
wget https://sdk.bce.baidu.com/console-sdk/3.10.xxx.zip   
unzip 3.10.xxx.zip  
cd 3.10.xxx  
mv bce_ttm.ko /lib/modules/$(uname -r)/kernel/net/ipv4/  
insmod /lib/modules/$(uname -r)/kernel/net/ipv4/bce_ttm.ko

注意:
如果没有/lib/modules/$(uname -r)/kernel/net/ipv4/目录,也可以将bce_ttm.ko放在其它任意目录,以下操作步骤的路径也需要替换成bce_ttm.ko所在目录

  1. 查看TTM模块加载情况
lsmod |grep bce_ttm
  1. 如果需要机器重启后能自动加载TTM模块,可执行以下命令
echo 'insmod /lib/modules/$(uname -r)/kernel/net/ipv4/bce_ttm.ko' >> /etc/rc.local
  1. 如果不再使用TTM模块,可以执行如下命令进行卸载
rmmod bce_ttm

2.4.制作TTM模块

如果TTM下载列表里没有对应Linux版本的TTM模块,也可以按照以下步骤手动制作TTM模块并进行加载。

  1. 安装编译环境
yum -y install gcc kernel-headers kernel-devel
  1. 下载bce_ttm模块源文件,并进行解压
wget -c "https://codeload.github.com/baidu/ttm/zip/master" -O bce_ttm.zip  
unzip bce_ttm.zip
  1. 编译TTM模块,编译后会在当前目录生成bce_ttm.ko文件
cd ttm-master/  
make
  1. 加载TTM模块,加载方法同TTM模块安装步骤

2.5.特殊说明

高防后端连接百度智能云BLB或者其他负载均衡器的情况,需要关闭BLB或者其他负载均衡设备的TOA模块(与高防的TTM冲突),同时要确保BLB或者其他负载均衡设备开启FULL NAT转发模式。

相似文档
  • 在添加完防护业务,正式接入高防/分布防护前。建议在本地验证转发配置的准确,避免非预期的接入。 详细验证方法如下: 1.网站接入。 1.1.通过浏览器验证。
  • 背景:DDoS高防防护通过反向代理的方式为客户提供高防防护服务,具备海量防御带宽的同时可以隐藏真实源站。用户的请求首先到达高防,由高防清洗掉攻击以及其他异常请求后将正常的用户请求转发到源站。在向源站转发时,支持配置源站健康检查策略,对健康检查判断为异常的源站不进行转发,以保障客户业务正常响应。
  • 怎样启动DDOS防护服务? DDoS防护服务,分为基础防护和高级防护。 DDoS 基础防护,每个对外网提供服务的EIP都会默认启动DDoS防护服务,根据所在区域的不同最大能够提供5Gbps的防护能力,当攻击流量超过用户设置的清洗触发值时,将自动启动清洗设备进行流量清洗。
  • DDoS收费吗? 百度智能云为EIP免费提供最大5Gbps的基础防护能力,如需更大的DDoS防护能力,请购买DDoS高防IP。
  • 协议生效时间:2019 年 01 月 15 日。 百度智能云DDoS防护服务高防IP等级协议(简称“SLA”) 规定了百度智能云向客户(简称“您”)提供的DDoS高防IP(简称“高防IP”)的服务可用性等级指标及赔偿方案。特别提示您,本服务等级协议仅限于您未使用任何非百度智能云提供的清洗服务或设备的前提下适用,如您在使用DDoS高防IP服务的同时使用了第三方提供的任何清洗服务或设备,则本服务等级协议将不适用。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部