" X-真实IP" &安培; " X转发换"标题在ec2 + tomcat上始终为null

时间:2014-09-08 10:30:11

标签: spring tomcat amazon-web-services amazon-ec2 http-headers

我有一个EC2 linux实例,在端口8081上运行tomcat webapp(使用spring mvc)。没有负载均衡器。我在aws控制台上设置了实例安全组以打开端口80.在ec2 inststance上,我通过执行将请求从端口80路由到8081

sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081

我需要访问客户端的IP地址(以确定他们的国家/地区)。所以我在寻找HttpServletRequest对象中的x-forwarded-for和x-real-ip头。

以下在ec2上运行时始终返回null,但在本地计算机上运行相同的webapp时会返回有效值(并使用ngrok通过公共IP访问)。

request.getHeader("x-forwarded-for") or request.getHeader("x-real-ip")

是否需要在AWS控制台或EC2实例上进行任何其他设置才能获取webapp中的标头?或者是iptables路由搞乱了标题?

1 个答案:

答案 0 :(得分:2)

如果是本地测试,实际上ngrok.com服务添加了X-Real-IpX-Forwarded-Proto标题,请参阅this comment例如,来自创作者。

在您的EC2部署中,这些标头可能由负载均衡器或反向代理(例如ELB)添加,如果您有一个,但是您声明没有。

在这种情况下,您需要查看请求的源IP地址以确定其来源。

对于开发,您可以执行类似

的操作
request.getHeader("x-forwarded-for") or request.getRemoteAddr()

但这会让您容易受到欺骗X-Forwarded-For标头的客户的攻击。如果请求的真正远程地址是您信任的反向代理或负载均衡器,您应该只信任这些标头,例如您控制的那个或合作伙伴,如果您正在使用CDN或第三方DDoS保护。