获取亚马逊网络 IP 而不是 ELB 背后的实际客户端 IP(X 转发原型)

Getting amazon network IP's and not actual client IP's behind ALB (Xforward proto)

社区成员您好,

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

我正在使用 X-Forwarded-For header 获取我的 ec2 实例上的实际客户端 IP,这在获取客户端 IP 方面工作正常。 我的 70% 客户端 IP 是访问我网站支付页面的实际客户端 IP(我在我的 e-commerce 网站上进行生产销售。)

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.

OrgTechName:Amazon EC2 网络运营


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

或 为什么我在使用 x-forward-for header 时没有获得所有流量的 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 header)。 X-Forward header 是否提供空值??

此致, 余深

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

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