【发布时间】:2018-11-28 01:46:47
【问题描述】:
社区成员您好,
我正在为我的电子商务网站使用 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.
OrgTechName: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 标头是否提供空值??
问候, 尤格迪普
【问题讨论】:
-
您可能应该尝试捕获 complete 请求,这里...例如,
User-Agent标头可能会让您了解流量的性质。在我合作的一个组织中,他们的大部分 Internet 访问流量通过一条私有线路到达 AWS,然后通过 EC2 代理实例的出站连接实际到达外部站点(这违反直觉,但它是出于审计、合规性和出口控制目的)...因此,如果该办公室的某人连接到您的站点,这正是您所看到的。 -
谢谢迈克尔..我阻止了那个特定的用户代理。
标签: amazon-web-services amazon-ec2 tomcat7 amazon-elb x-forwarded-for