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

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

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

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

Tomcat如何记录日志

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

Logs下没有localhost_access_log.txt见:

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

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

记录远程IP的两个方法

方案1

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

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

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

原始请求

构造X-Forwarded-For字段

服务器localhost_access_log.txt

方案2

不修改pattern,增加RemoteIpValue配置

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

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

方案比较

比较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

转载于:https://www.cnblogs.com/anic/archive/2012/12/13/2817126.html

tomcat记录X-Forwarded-For字段中的远程IP相关推荐

  1. 如何屏蔽TCP 报头中的内容-位置字段中显示的 IP 地址

    在命令提示符中执行 cscript c:\\inetpub\adminscripts\adsutil.vbs set w3svc/站点标识符/UseHostName True 即可 微软官方解释:ht ...

  2. java获取chanel的ip_Netty:在消息中获取远程IP地址 - java

    在我的类中(扩展SimpleChannelHandler),我尝试获取最初发送消息的IP. @Override public void messageReceived(ChannelHandlerCo ...

  3. mysql查询包含字符串的记录,MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法...

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  4. 记录自己首次在eclipse中配置tomcat并运行jsp踩过的坑

    记录自己首次在eclipse中运行jsp踩过的坑 我使用的版本 1.jdk下载 java环境配置 2.Tomcat 服务器的安装与配置 3.下载eclipse并配置tomcat 3.1第一次下载ecl ...

  5. sql 查询文本字段中值的长度最长的记录

    一.函数 1.SQL Server LEN() 函数返回文本字段中值的长度. SELECT LEN(column_name) FROM table_name; 2.MySQL LENGTH() 函数返 ...

  6. 批量更新日期字段中的年

    工作需要,将数据中的日期字段中的年批量更新到指定的年,想了一下,写成这样: 如:批量更新到DateAdd(year,-5,GETDATE()) =2002 SET oDateTime=DateAdd( ...

  7. mysql 查询字段中是否存在空格的_mysql查询字段中带空格的值的sql语句

    (1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 代码如下 update ` ...

  8. mysql 分组 字符串_MySQL查询以字符串字段中的数字字符对行进行分组?

    为此,您可以在+运算符的帮助下将0与字符串字段连接起来.这里的场景就像我们需要从字符串字段" 9844Bob "中获取数字" 9844 ". 让我们首先创建一个 ...

  9. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】

    一.介绍 MONGODB 的表结构 很灵活 .主要还是因为 字段中可以包含 [ 数组].[内嵌文档]. 现在简单介绍一下 字段中的[ 数组].[内嵌文档]相关的一些操作 (为了方便理解,还是以表来理解 ...

最新文章

  1. iOS和android h5字体差异,关于移动hybrid开发中H5页面的字体应与系统保持一致的问题...
  2. 吴恩达 coursera AI 专项五第一课(上)总结+作业答案
  3. 深入浅出MFC:DDX_Control本质探究
  4. 工作65:element三级文档多选
  5. 如何带领团队“攻城略地”?优秀的架构师这样做
  6. python获取系统参数_python 常用系统参数
  7. Activity中四大启动模式
  8. bzoj 1297: [SCOI2009]迷路(矩阵快速幂)
  9. 【Python】彩色图片转为灰度图(4行脚本搞定)
  10. [渝粤教育] 陕西科技大学 食品营养安全与健康 参考 资料
  11. 转【28个Unix/Linux的命令行神器-----陈皓】
  12. 下载并安装mercurial/hg
  13. 爱迪德CA系统与NDS CA系统对比分析(一)
  14. VS2015开发工具里面没有Arial字体怎么办?VS如何添加字体
  15. 数据分析实战项目练习——物流行业数据分析
  16. 关于silvaco安装不成功问题解决
  17. 教你App如何上架应用宝----腾讯开放开发平台
  18. 【React】项目中组件化使用svg格式的图片
  19. 【Linux系统】第9节 linux系统中用户分类以及用户与组属性的修改示例
  20. JQuery dad js自定义删除和拖动回调事件

热门文章

  1. ES6——扩展运算符/三点运算符(...)
  2. Linux---进程间通信
  3. VSCode打开底部状态栏
  4. HTML+CSS实现轮播图效果
  5. 同事经常蹭我的车,我该怎么拒绝?
  6. 发生心梗后,家属做些什么才能保证患者获救,降低死亡?
  7. 远洋渔船一次出海好几年,生活枯燥,那你在船上最开心的事是啥?
  8. 是什么在主宰着我们自身的行动?
  9. According to the overall view of the patent
  10. Zookeeper本地安装配置(windows)