文档首页 > > 最佳实践> 获取访问者真实IP

获取访问者真实IP

分享
更新时间: 2019/12/05 GMT+08:00

通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有CDN、WAF、高防。例如,采用这样的架构:用户 > CDN/WAF/高防 > 源站服务器 。那么,在经过多层代理之后,服务器如何获取发起请求的真实客户端IP呢?

一个透明的代理服务器在把用户的HTTP请求转到下一环节的服务器时,会在HTTP的头部中加入一条“X-Forwarded-For”记录,用来记录用户的真实IP,其形式为“X-Forwarded-For:访问者的真实IP,代理服务器1-IP, 代理服务器2-IP,代理服务器3-IP,……”

因此,访问者的真实IP可以通过获取“X-Forwarded-For”对应的第一个IP来得到。

如果您已经使用Web应用防火墙服务,可直接通过WAF服务获取访问者的真实IP,您也可以通过配置网站服务器来获取访问者的真实IP。以下分别为您介绍通过WAF直接获取真实IP的方法,以及针对Tomcat、Apache和Nginx服务器,介绍相应的X-Forwarded-For配置方案及获取真实IP的方法。

通过WAF直接获取真实IP

WAF默认提供获取客户端真实IP的功能,下面推荐两种方式获取客户的来源IP,根据您的需要,两种方式可二选一:

  • WAF服务使用X-Forwarded-For的方式获取客户端的真实IP地址。

    真实的客户端IP会被WAF服务放在HTTP头部的X-Forwarded-For字段,格式如下:

    1
    X-Forwarded-For: 用户真实IP, 代理服务器1-IP 代理服务器2-IP...
    

    当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。

    各种语言通过调用SDK接口获取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")
  • WAF服务还支持使用X-Real-IP变量,获取客户的来源IP(使用过程中考虑了后面经过的多层反向代理对该变量的修改)。
    各种语言通过调用SDK接口获取X-Real-IP字段的方式:
    • ASP:
      Request.ServerVariables("HTTP_X_REAL_IP")
    • ASP.NET(C#):
      Request.ServerVariables["HTTP_X_REAL_IP"]
    • PHP:
      $_SERVER["HTTP_X_REAL_IP"]
    • JSP:
      request.getHeader("HTTP_X_REAL_IP")

通过配置Tomcat获取真实IP

如果您的源站部署了Tomcat服务器,可通过启用Tomcat的X-Forwarded-For功能,获取访问者的真实IP地址。

  1. 打开server.xml文件(“tomcat/conf/server.xml”),AccessLogValve日志记录功能部分内容如下:

    <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t "%r" %s %b" />

  2. 在pattern中增加“%{X-Forwarded-IP}i”,修改后的server.xml为:

    <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />
    </Host>

  3. 查看localhost_access_log日志文件,可获取X-Forwarded-For对应的访问者真实IP。

通过配置Apache获取真实IP

如果您的源站部署了Apache服务器,可通过运行命令安装Apache的第三方模块mod_rpaf,并修改http.conf文件获取客户IP地址。

  1. 执行以下命令安装Apache的一个第三方模块mod_rpaf。

    wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
    tar xvfz mod_rpaf-0.6.tar.gz
    cd mod_rpaf-0.6
    /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

  2. 打开httpd.conf配置文件,并将文件内容修改为如下内容:

    LoadModule rpaf_module   modules/mod_rpaf-2.0.so ##加载mod_rpaf模块
    <IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1 <反向代理IPs>
    RPAFheader X-Forwarded-For
    </IfModule>

  3. 定义日志格式。

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

  4. 启用自定义格式日志。

    CustomLog "/[apache目录]/logs/$access.log" common

  5. 重启Apache,使配置生效。

    /[apached目录]/httpd/bin/apachectl restart

  6. 查看access.log日志文件,可获取X-Forwarded-For对应的访问者真实IP。

通过配置Nginx获取真实IP

如果您的源站部署了Nginx服务器,可通过在Nginx服务器配置Location信息,后端Web服务器即可通过类似函数获取客户的真实IP地址。

  1. 根据源站Nginx服务器的配置,在Nginx服务器的相应location位置配置如下内容,获取客户IP的信息。

    1
    2
    3
    4
    Location ^ /<uri> {
        proxy_pass  ....;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

  2. 后端Web服务器通过类似函数获取客户的真实IP。

    1
    request.getAttribute("X-Forwarded-For") 
    

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区