要点:
- 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
网友评论