得到亚马逊网络IP而非实际客户端IP落后于ALB(Xforward proto)

时间:2018-06-19 07:15:49

标签: amazon-web-services amazon-ec2 tomcat7 amazon-elb x-forwarded-for

Hello社区成员,

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

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

30%的IP是AWS网络运营IP,就像下面的IP那些Ec2-network 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个示例网址 OrgName:亚马逊技术公司

OrgTechName:Amazon EC2网络运营

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

OR 为什么我在使用x-forward-for标头时没有获得客户端真实IP的30%的流量? 我的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标头是否提供空值

此致 Yugdeep

1 个答案:

答案 0 :(得分:1)

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

  1. 他们不是你的ELB。我相信如果他们是您的ELB,您应该 VPC CIDR 块中查看IP(检查IP显示的健康检查请求的示例)。您可以在 EC2>中检查ELB的当前IP。控制台中的网络接口。在这里,您将找到所有内容的网络接口,包括负载平衡器。他们的公共和私人IP都将被显示出来。验证这些IP不会显示在该列表中的任何位置,以确认它们不属于您自己的IP地址。
  2. 如果它们是您的ELB IP,那么您的代码可能正在获取您的ELB健康检查的公共IP,请仔细检查您的健康检查所针对的页面。