F5后端主机获取访问的真实IP
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
场景:当使用F5进行http proxy时,我们希望node服务器能正确获取来源IP地址。
试验:
使用开启了insert x-forward-for选项的http profile。
客户端地址:192.168.200.1,F5 VIP: 192.168.200.70 , F5 internel IP: 172.30.16.12,node IP: 172.30.10.100
从客户端发送一个http request。发现发送到后台node的http header的最后一行会包括一个X-Forwarded-For :192.168.200.1的头信息。
使用Java servlet API - request.getHeader("X-Forwarded-For")获得的值为:192.168.200.1
(如果在后台服务器中间架个squid,则squid默认会开启X-Forwarded-For,此时squid会在该值后面附加一个, 172.30.16.12。此时使用Java servlet API - request.getHeader("X-Forwarded-For")获得的值为:192.168.200.1, 172.30.16.12)
在客户端使用jmeter发送一个包含X-Forwarded-For:221.221.221.3的request。用tcpdump发现发送到node的header中有2个Forward头,即X-Forwarded-For:221.221.221.3和X-Forwarded-For :192.168.200.1。
使用Java servlet API - request.getHeader("X-Forwarded-For")获得的值为:221.221.221.3。
(如果在后台服务器中间架个squid,则squid默认会开启X-Forwarded-For,此时squid会把2个forward头变成1个,并且在该值后面附加一个, 172.30.16.12。此时使用Java servlet API - request.getHeader("X-Forwarded-For")获得的值为:221.221.221.3, 192.168.200.1, 172.30.16.12)
这说明forward头时可以伪造的,如果不信任客户端发送到F5的X-Forwarded-For头,则可以使用F5的irule删除客户端的XFF,如下所示:
when HTTP_REQUEST {
HTTP::header remove X-Forwarded-For
HTTP::header insert X-Forwarded-For [IP::client_addr]
}
或者
when HTTP_REQUEST {
if {[HTTP::header exists X-Forwarded-For]}{
set old_xff [HTTP::header values X-Forwarded-For]
HTTP::header remove X-Forwarded-For
HTTP::header insert X-Forwarded-For_Org "[IP::client_addr], $old_xff"
} else {
HTTP::header insert X-Forwarded-For [IP::client_addr]
}
}