【问题标题】:"x-real-ip" & "x-forwarded-for" headers always null on ec2+tomcat“x-real-ip”和“x-forwarded-for”标头在 ec2+tomcat 上始终为空
【发布时间】:2014-09-08 19:44:02
【问题描述】:

我有一个 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 地址(以确定他们的国家)。所以我在 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 路由弄乱了标头?

【问题讨论】:

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


    【解决方案1】:

    在本地测试的情况下,实际上是 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 保护,您可以控制或合作伙伴。

    【讨论】:

    • 就是这样。我没有意识到 x-real-ip 并不总是存在。按 x-forwarded-for > x-real-ip > getRemoteAddr() 的顺序回退对我来说非常完美。谢谢!
    • 太棒了!很高兴我能提供帮助。
    猜你喜欢
    • 2022-06-12
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多