HttpServletRequest.getRemoteAddr()获取IP与curl/ifconfig结果不一致问题
getRemoteAddr方法正确性确认
你用的HttpServletRequest.getRemoteAddr()方法本身没有问题,它的原生功能就是获取直接和Web服务器建立TCP连接的对端IP地址,你从外部设备调用接口时能拿到正确的客户端IP,已经验证了该方法的逻辑是正常的。
各IP差异的原因
1. curl获取的公网IP的含义
你在QA服务器执行curl bot.whatismyipaddress.com拿到的153.110.231.215,是你这台服务器访问公网服务时,经过出口NAT转换后的源IP,仅代表服务器访问公网的出口身份,和服务器作为服务端接收请求时的对端IP没有必然关联。
2. 本机调用公网域名拿到146.192.61.46的原因
你在QA服务器本地用公网域名调用自身接口时,请求不会真的流出到公网再绕回,会触发机房的域名回环解析或者本地路由策略,直接将请求转发到内网的业务入口(比如网关、反向代理),再转发到你的Wildfly服务:
- 此时和Wildfly建立TCP连接的对端就是内网网关/代理的IP
146.192.61.46,所以getRemoteAddr会返回这个值 - 这种场景下请求根本没有经过公网出口,自然不会拿到你curl得到的公网IP
153.110.231.215
3. Linux命令和Java结果无冲突
你看到的ifconfig的网卡IP是服务器本身绑定的内网/私网IP,而Java拿到的146.192.61.46是网关/代理的IP,curl拿到的是公网出口IP,三者属于不同网络层面的地址,不存在冲突。
可选验证方案
你可以在调用接口的同时执行抓包命令,确认连接的真实源IP:
tcpdump -i any port [你的Wildfly服务端口] -n
抓包结果里的源IP会和getRemoteAddr返回的146.192.61.46完全一致,进一步验证Java方法没有问题。
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

