zoukankan      html  css  js  c++  java
  • tomcat记录XForwardedFor字段中的远程IP

    F5转包时将请求IP记录到X-Forwarded-For字段

    最近在做某个系统的安全加固的时候,发现tomcat记录的日志全部来自于F5转发的IP地址,不能获取到请求的真实IP。

    经过抓包分析,F5在转发请求包的时候会将来源IP记录在HTTP包header中的X-Forwarded-For字段,如下图是用wireshark(www.wireshark.org/download.html)截取的包。

    image

    而Tomcat是在tomcat/conf/server.xml中配置日志选项的:

    Tomcat如何记录日志

    禁用<AccessLogValue>,则对应logs目录下不会生成localhost_access_log.txt

    clip_image002

    Logs下没有localhost_access_log.txt见:

    clip_image004

    当开启<AccessLogValue>,则会有localhost_access_log.txt日志记录请求来源

    clip_image002[6]

    当配置中的pattern=common时,对应的日志是如下,无论正常请求和非法请求都会记录。

    clip_image004[5]

    记录远程IP的两个方法

    方案1

    修改pattern为pattern='%{X-Forwarded-For}i %h %l %u %t "%r" %s %b',则会记录headers头中的X-Forwarded-For信息

    clip_image002[12]

    如果没有则记录为空,如下

    clip_image002[8]

    验证:用fiddle构造有X-Forwarded-For的请求包

    原始请求

    clip_image004[7]

    构造X-Forwarded-For字段

    clip_image006

    服务器localhost_access_log.txt

    clip_image008

    方案2

    不修改pattern,增加RemoteIpValue配置

    clip_image002[10]

    前两个是记录X-Forworded-For,后面是没有X-Forwarded-For,说明是有效的

    clip_image004[9]

    以上的这些都参考了相关文档,下面这些才是实验。

    方案比较

    比较1:如果有X-Forwarded-For头,但是内容为空。

    方案1显示空和转发IP

    方案2显示直接来源IP

    比较2:多个X-Forwarded-For字段

    例如一个包里面有两个X-Forwarded-For字段

    X-Forwarded-For:59.66.156.24

    X-Forwarded-For:59.66.156.111

    方案1日志为(记录第一个):59.66.156.24 192.168.1.58 - - [12/Dec/2012:22:56:54 +0800] "GET /docs/ HTTP/1.1" 304 -

    方案2日志为(记录第一个):59.66.156.24 - - [12/Dec/2012:22:50:16 +0800] "GET /docs/ HTTP/1.1" 304 –

    比较3:X-Forwarded-For有多个IP

    例如:X-Forwarded-For:59.66.156.24,59.66.156.111

    方案1日志为显示完整X-Forwarded-For字段信息:

    59.66.156.24,59.66.156.111 192.168.1.58 - - [12/Dec/2012:22:58:01 +0800] "GET /docs/ HTTP/1.1" 304 -

    方案2日志记录为(记录最后一个IP):

    59.66.156.111 - - [12/Dec/2012:22:53:51 +0800] "GET /docs/ HTTP/1.1" 304 -

    结论

    方案1真实反映X-Forwarded-For字段(无论有无IP,有多少个IP),并且以header头按顺序读取,显示读取到第一个X-Forwarded-For。

    方案2试图将IP进行来源替换,如果有X-Forwarded-For字段,则显示最后一个IP,否则显示直接IP

    因此从日志记录来看,方案1的信息量更为大。

    遗留问题

    如果有人伪造了多个X-Forwarded-For字段,而F5转包时,到底会将请求IP加到那个X-Forwarded-For字段呢?我只能寄希望于他会在第一个X-Forwarded-For中添加这个信息,否则tomcat就无法记录了。

    参考资料

    http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

    http://www.techstacks.com/howto/configure-access-logging-in-tomcat.html

  • 相关阅读:
    简单的使用rabbitmq的例子
    装饰者模式
    Zinterstore 命令
    策略模式
    简单工厂模式
    getFields()与getDeclaredFields()区别
    解决Jetty下EL版本冲突的问题
    网站ssl配置
    webservice 项目 配置wsdl
    js前端clone的要诀
  • 原文地址:https://www.cnblogs.com/anic/p/2817126.html
Copyright © 2011-2022 走看看