"x-real-ip" & "x-forwarded-for" 标头在 EC2+Tomcat 上始终为空



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

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

我需要访问客户的ip地址(以确定他们的国家/地区)。因此,我正在HttpServlet请求对象中查找x-forwarded-for和x-real-ip标头。

当在ec2上运行时,以下内容总是返回null,但当在本地计算机上运行同一个Web应用程序(并使用ngrok通过公共ip访问)时,会返回有效值。

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

在AWS控制台或EC2实例上是否需要进行任何额外的设置来获取Web应用程序中的标头?还是iptables的路由与标头混淆了?

在本地测试的情况下,实际上是ngrok.com服务添加了X-Real-IpX-Forwarded-Proto标头,例如,请参阅创建者的注释。

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

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

对于开发,你可以做一些类似的事情

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

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

最新更新