首页 > 解决方案 > 在 ALB 后面获取亚马逊网络 IP 而不是实际客户端 IP(Xforward 原型)

问题描述

您好社区成员,

我正在为我的电子商务网站使用 ALB(应用程序负载均衡器)。在负载均衡器后面有两个 ec2-linux 实例,它们通过 ALB 获取客户端流量(两个 ec2 实例上都有 Web 服务器 tomcat7)。

我正在使用 X-Forwarded-For 标头来获取我的 ec2 实例上的实际客户端 IP,这在获取客户端 IP 方面工作正常。我 70% 的客户端 IP 是访问我网站的支付页面的实际客户端 IP(我正在我的电子商务网站上进行产品销售。)

30% 的 IP 是 AWS 网络操作 IP,就像下面的 ip 那些 Ec2 网络 IP 也在访问我网站的付款页面(但我没有从这些亚马逊网络 IP 获得任何生产销售)

https://www.whois.com/whois/54.175.230.41
https://www.whois.com/whois/34.234.97.242
https://www.whois.com/whois/52.91.159.209
https://www.whois.com/whois/34.224.173.149

请在此处查看以上 4 个示例 URL 组织名称:Amazon Technologies Inc.

组织技术名称:Amazon EC2 网络运营


所以我很困惑为什么我得到亚马逊网络IP(这些亚马逊ec2网络IP是实际客户端和亚马逊ALB之间的路由器还是这些IP是负载均衡器的IP而不是客户端IP:我的java代码在下面给出以获取客户端IP )我是否应该在亚马逊 ALB 上使用 aws waf 阻止它们。如果我阻止他们,我最终会失去实际的客户流量吗?

或者为什么我在使用 x-forward-for 标头时没有获得所有流量的 30% 的客户端真实 IP?我的Java代码是:

public static String getClientIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }
    return ip;
}

我只想保存实际访问我网站的真实客户端 IP(使用 x-forward 标头)。X-Forward 标头是否提供空值?

问候, 尤格迪普

标签: amazon-web-servicesamazon-ec2tomcat7amazon-elbx-forwarded-for

解决方案


这 4 个 IP 是亚马逊拥有的 IP。我在这里看到两种可能性:

  1. 他们不是你的ELB。我相信如果他们是您的 ELB,您应该会从您的VPC CIDR块中看到一个 IP (例如,检查 IP 显示的健康检查请求)。您可以在控制台的EC2 > Network Interfaces中检查 ELB 的当前 IP 。在这里,您将找到所有东西的网络接口,包括负载均衡器。将显示他们的公共和私有 IP。验证这些 IP 不会显示在该列表中的任何位置,以确认它们不是您自己的东西。
  2. 如果它们是您的 ELB IP,那么您的代码可能正在获取您的 ELB 健康检查的公共 IP,请仔细检查您的健康检查所访问的页面。

推荐阅读