业务接入DDoS高防后,到达源站的所有业务流量都由DDoS高防转发,源站服务器通常可以通过解析回源请求中的X-Forwarded-For记录或者安装TOA模块,获取客户端的真实IP。本文介绍如何获取真实的请求来源IP。
配置端口接入的业务(非网站业务)
部分场景下您可以通过安装TOA模块,获取真实来源IP。具体操作,请参见通过安装TOA模块获取真实请求来源IP。无法安装TOA模块的场景,请您联系技术支持人员。
高防IPv4实例
TCP OPTION字段使用方法:业务四层端口接入后,高防节点和源站经过三次握手,在最后一个ACK数据包的TCP Option中插入了option type 254、源端口号和源IP等信息,共占8个字节。具体位置如下图所示。
端口号:
Magic Number
字段表示端口号,十六进制字符。示例中为c4 06,转为十进制可以获得对应的端口号50182。源IP地址:端口号后的连续四个字节表示源IP地址,十六进制字符。示例中为65 ** ** 85,转为十进制可以获得对应的源IP地址为101.***.***.133。
高防IPv6实例
v6tov4模式
TCP OPTION字段使用方法:业务四层端口接入后,高防节点和源站经过三次握手,在最后一个ACK数据包的TCP Option中插入了option type 249、源端口号、源IP、高防IP等信息,共占40个字节。具体位置如下图所示。
端口号:
Payload
前两个字节表示端口号,十六进制字符。示例中为9d7d,转为十进制可以获得对应的端口号40317。源IP地址:端口号后的连续十六个字节表示源IP地址,十六进制字符,直接对应IPv6地址信息。示例中为2401*****0f87,即源IP地址为2401:b180:100*:*:*:f87:5d96:f87。
说明Payload
中除端口号和源IP地址外,剩余二十字节为高防IP信息。
v6tov6场景
TCP OPTION字段使用方法:业务四层端口接入后,高防节点和源站经过三次握手,在最后一个ACK数据包的TCP Option中插入了option type 253、源端口号和源IP等信息,共占20个字节。具体位置如下图所示。
端口号:
Experiment Identifier
字段表示端口号,十六进制字符。示例中为eb98,转为十进制可以获得对应的端口号60312。源IP地址:
Data
字段表示源IP地址,十六进制字符,直接对应IPv6地址信息。示例中为2401*****0f87,即源IP地址为2401:b180:100*:*:*:f87:5d96:f87。
为避免DDoS高防的回源流量被误拦截,请您在源站放行DDoS高防的回源IP段。如何查询回源IP段,请参见放行DDoS高防回源IP。
配置域名接入的业务(网站业务)
当七层代理服务器(例如DDoS高防)将用户的访问请求转发到后端服务器时,源站看到的请求来源默认是七层代理服务器(例如DDoS高防)的回源IP,而真实的请求来源IP被记录在HTTP头部的X-Forwarded-For
字段中,格式为X-Forwarded-For: 用户真实IP, 高防代理IP
。
如果访问请求到后端服务器间经过了一台以上代理服务器(例如经过WAF、CDN等代理服务器),则HTTP头部的X-Forwarded-For
字段记录了真实的请求来源IP和所有经过的代理服务器IP,格式为X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …
。
因此,常见的Web应用服务器都可以通过X-Forwarded-For
字段的内容获取真实的请求来源IP。
针对不同的编程语言,常用的获取X-Forwarded-For
内容的方式如下:
ASP
Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
ASP.NET(C#)
Request.ServerVariables[“HTTP_X_FORWARDED_FOR”]
PHP
`$_SERVER[“HTTP_X_FORWARDED_FOR”]
JSP
request.getHeader(“HTTP_X_FORWARDED_FOR”)
获取到X-Forwarded-For
字段的内容后,以英文逗号(,)作为分隔符,截取其中的第一个IP地址,即可获取真实的请求来源IP。
您也可以通过配置Web服务器(例如Nginx、IIS 6、IIS 7、Apache、Tomcat)获取真实来源IP,具体操作,请参见获取客户端真实IP。