业务接入DDoS高防后,到达源站的所有业务流量都由DDoS高防转发,源站服务器通常可以通过解析回源请求中的X-Forwarded-For记录或者安装TOA模块,获取客户端的真实IP。本文介绍如何获取真实的请求来源IP。
配置端口接入的业务(非网站业务)
部分场景下您可以通过安装TOA模块,获取真实来源IP。具体操作,请参见通过安装TOA模块获取真实请求来源IP。无法安装TOA模块的场景,请您联系技术支持人员。
高防IPv4实例
TCP OPTION字段使用方法:业务四层端口接入后,高防节点和源站经过三次握手,在最后一个ACK数据包的TCP Option中插入了option type 254、源端口号和源IP等信息,共占8个字节。以下为 Wireshark 抓包解析的 TCP 报文示例,其中 TCP Option – Experimental 区域包含端口号与源 IP 地址信息:
Destination Port: 443
[Stream index: 0]
[TCP Segment Len: 0]
Sequence number: 1 (relative sequence number)
Acknowledgment number: 1 (relative ack number)
1001 .... = Header Length: 36 bytes (9)
▶ Flags: 0x010 (ACK)
Window size value: 65535
[Calculated window size: 65535]
[Window size scaling factor: -2 (no window scaling used)]
Checksum: 0x90fb [unverified]
[Checksum Status: Unverified]
Urgent pointer: 0
▼ Options: (16 bytes), Experimental
▼ TCP Option – Experimental
Kind: RFC3692-style Experiment 2 (254)
Length: 8
Magic Number: 0xc406
Unknown (0xfa) (8 bytes)
0000 b4 0c 25 e2 80 46 4c e1 75 f7 e5 c1 08 00 45 00 ..%..FL. u.....E.
0010 00 38 00 00 40 00 26 06 cf e9 2f 70 49 ce 67 96 .8..@.&. ../pI.g.
0020 a4 02 1b 2e 01 bb c8 c1 cf 98 ab 2f 54 e1 90 10 ........ .../T...
0030 ff ff 90 fb 00 00 fe 08 c4 06 65 xx xx 85 fa 08 ........ ..exx...
0040 01 bb cb 6b 34 80 ...k4.
-
端口号:
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个字节。具体位置如下所示。
Destination Port: 8080
[Stream index: 1]
[Stream Packet Number: 3]
[Conversation completeness: Incomplete, ESTABLISHED (7)]
[TCP Segment Len: 0]
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 2505761997
[Next Sequence Number: 1 (relative sequence number)]
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 483970095
1111 .... = Header Length: 60 bytes (15)
Flags: 0x010 (ACK)
Window: 4096
[Calculated window size: 262144]
[Window size scaling factor: 64]
Checksum: 0xbc88 [unverified]
[Checksum Status: Unverified]
Urgent Pointer: 0
Options: (40 bytes), Unknown (0xf9)
TCP Option – Unknown
Kind: Unknown (249)
Length: 40
Payload: 9d7d2401b180xxxd960f875d960f87000000012405e000100300000000000a7304b55
[Timestamps]
-
端口号:
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个字节。具体位置如下所示。
Destination Port: 8080
[Stream index: 0]
[Stream Packet Number: 1]
[Conversation completeness: Incomplete (12)]
[TCP Segment Len: 0]
Sequence Number: 1 (relative sequence number)
Sequence Number (raw): 721958393
[Next Sequence Number: 1 (relative sequence number)]
Acknowledgment Number: 1 (relative ack number)
Acknowledgment number (raw): 2789445640
1010 .... = Header Length: 40 bytes (10)
Flags: 0x010 (ACK)
Window: 65535
[Calculated window size: 65535]
[Window size scaling factor: -1 (unknown)]
Checksum: 0x90cc [unverified]
[Checksum Status: Unverified]
Urgent Pointer: 0
Options: (20 bytes), Experimental
TCP Option - Experimental: Unknown
Kind: RFC3692-style Experiment 1 (253)
Length: 20
Experiment Identifier: Unknown (0xeb98)
Data: 2401b180100xxx0f875d960f87
-
端口号:
Experiment Identifier字段表示端口号,十六进制字符。示例中为eb98,转为十进制可以获得对应的端口号60312。 -
源IP地址:
Data字段表示源IP地址,十六进制字符,直接对应IPv6地址信息。示例中为2401*****0f87,即源IP地址为2401:b180:100*:*:*:f87:5d96:f87。
为避免DDoS高防的回源流量被误拦截,请您在源站放行DDoS高防的回源IP段。如何查询回源IP段,请参见放行DDoS高防回源IP。
配置域名接入的业务(网站业务)
方式一:使用 X-Forwarded-For 获取客户端 IP
场景说明
-
当七层代理服务器(例如DDoS高防)将用户的访问请求转发到后端服务器时,源站看到的请求来源默认是七层代理服务器(例如DDoS高防)的回源IP,而真实的请求来源IP被记录在HTTP头部的
X-Forwarded-For字段中,格式为X-Forwarded-For: 用户真实IP。 -
如果访问请求到后端服务器间经过了一台以上代理服务器(例如经过WAF、CDN等代理服务器),则HTTP头部的
X-Forwarded-For字段记录了真实的请求来源IP和所有经过的代理服务器IP,格式为X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …。代理节点在回源时会在X-Forwarded-For中追加上一个节点的地址,而不会追加自身 IP。
获取方法
针对不同的编程语言,常用的获取X-Forwarded-For内容的方式如下:
-
获取到
X-Forwarded-For字段的内容后,以英文逗号(,)作为分隔符,截取其中的第一个IP地址,即可获取真实的请求来源IP。 -
也可以通过配置Web服务器(例如Nginx、IIS 6、IIS 7、Apache、Tomcat)解析
X-Forwarded-For获取真实来源IP,具体操作,请参见获取客户端真实IP。
-
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”)
方式二:使用自定义 Header 获取客户端 IP
场景说明
在复杂的网络架构中,依赖标准的 X-Forwarded-For (XFF) 头可能存在被伪造、多层代理导致 IP 混淆或解析逻辑复杂等风险。为提升安全性和可控性,可自定义专属 HTTP Header 用于透传真实客户端 IP。
获取方式
将客户端 IP 写入自定义 HTTP Header。具体操作,请参见添加网站配置。
登录DDoS高防控制台的域名接入页面。
-
在域名接入页面,单击添加网站。
-
网站接入页面转发配置区域,配置流量标记时选择自定义Header(如:Custom-True-IP)。
-
在业务代码中截取对应字段,如
request.getHeader(“Custom-True-IP”)。