我有一个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路由搞乱了标题?
答案 0 :(得分:2)
如果是本地测试,实际上ngrok.com
服务添加了X-Real-Ip
和X-Forwarded-Proto
标题,请参阅this comment例如,来自创作者。
在您的EC2部署中,这些标头可能由负载均衡器或反向代理(例如ELB)添加,如果您有一个,但是您声明没有。
在这种情况下,您需要查看请求的源IP地址以确定其来源。
对于开发,您可以执行类似
的操作request.getHeader("x-forwarded-for") or request.getRemoteAddr()
但这会让您容易受到欺骗X-Forwarded-For
标头的客户的攻击。如果请求的真正远程地址是您信任的反向代理或负载均衡器,您应该只信任这些标头,例如您控制的那个或合作伙伴,如果您正在使用CDN或第三方DDoS保护。