vlambda博客
学习文章列表

Tomcat 经过多层安全代理转发或加速代理转发情况下源站服务器获取发起请求的真实客户端IP


背景:

        在大多数业务场景中,网站访问请求不是简单地从客户的(访问者)的浏览器直接到达网站的源站服务器,而是在客户端和服务器之前经过了根据业务需要部署的Web应用防火墙、DDoS高防、CDN等代理服务器。这种情况下,访问请求到达源站服务器之前可能经过了多层安全代理转发或加速代理转发,源站服务器如何获取发起请求的真实客户端ip呢?

          透明的代理服务器在将客户端的访问请求转发到下一环节的服务器时,会在http的请求头添加一条 X-Forwarded-For记录,  用于记录客户端的IP,格式为X-Forwarded-For:客户端IP。如果客户端和服务器之前有多个代理服务器,则X-Forwarded-For记录使用以下格式记录客户端IP和依次经过的代理服务器IP:X-Forwarded-For:客户端IP, 代理服务器1的IP, 代理服务器2的IP, 代理服务器3的IP, ……

因此,常见的Web应用服务器可以通过解析X-Forwarded-For记录获取客户端真实IP 。

Tomcat配置

  1. 打开tomcat/conf/server.xml配置文件。

  2. 将AccessLogValve日志记录功能部分修改为以下内容:

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log." suffix=".txt"
 pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>