java web应用获取source ip问题

要点:

  • sourceip获取方式有几种,getRemoteAddr获取的是公网ip
  • apache+tomcat时,通过proxy-http模块+getRemoteAddr获取ip存在问题
  • 手机开启了移动数据且连接wifi时,本机ip取的是运营商分配的ip,而不是wifi路由器给的

应用获取客户端ip是一个常见的需求,像投票系统是比较典型的。ip是投票规则的重要组成部分。下面分两个部分来讨论这个话题。

source ip 能否伪造

http请求当中,ip理论上是无法伪造的。因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。但以下情况例外:

  • MITM攻击
  • 恶意程序控制了server的网络
  • 恶意程序伪造它所在网段的另一ip地址
  • BGP攻击
    通过以上描述,伪造源ip是一件比较困难的事情。

apache+tomcat 如何获取source ip

在java应用中,获取source ip一般通过request.getRemoteAddr()完成,这个一般没什么疑问,但有时,你会遇到问题。
以apache+tomcat部署场景为例。apache做反向代理,tomcat为backend server。经测试发现:

  • 若通过proxy-http模块连接,则取出的ip为apache的ip;
  • 若通过proxy-ajp模块连接,则取出的ip为实际的远程ip;
    当你获取source ip发现有问题时,需要考虑下web server与中间件是否通过http方式连接。

如果部署方式是基于http模块,又要获取source ip,此时应对web server做配置。参见 X-Forwarded-For

你可能感兴趣的:(java web应用获取source ip问题)