Iptables:如何阻止(处理)X-Forwarded-For地址?

时间:2016-01-13 02:14:45

标签: reverse-proxy firewall iptables amazon-elb x-forwarded-for

(事实上,我在AWS ELB背后的CentOS上。但我不希望这个问题仅针对AWS ELB,而是针对一般情况。)

我正在使用CentOS 6.5框,该框位于Load-balancer后面,只会将X-Forwarded-For IP传递给我。作为Web服务器,我知道进入的IP不好,我需要阻止它们,来自服务器本身。 (假设前面没有任何IPS / IDS /防火墙,依赖。)

到目前为止,我不知道(我不能)通过我的iptables阻止那些不良IP,因为没有真正的IP,但只有X-Forwarded-For IP传递给我。 (所以我所做的是,我使用.htaccess来阻止它。它可以工作)

如何通过适当的防火墙级别来实现这一目标?

3 个答案:

答案 0 :(得分:0)

因为你提到.htaccess听起来好像你正在使用Apache Webserver,所以我建议在那里添加这些规则,而不是在iptables中。在Apache中基于X-Forwarded-For的基本阻塞方式是:

RewriteCond %{HTTP:X-FORWARDED-FOR} ^171.42.6.123$
RewriteRule .* - [F,L]

由于IP地址只是一个匹配的字符串,因此您可以在条件中指定所有类型的正则表达式。有关这样做的示例,请参阅this question

答案 1 :(得分:0)

我想做同样的事情。我有一个很长的IP地址列表要阻止CIDR格式,并将其转换为正则表达式以便在.htaccess文件中使用,这似乎是不对的。而且你知道,就处理器负载而言,.htaccess中的正则表达式甚至不会与iptables可以做的整数比特在同一个星系中。但我不相信可以使用iptables来实现这个目标。 Iptables在内核中运行,它在读取任何头之前阻止传入的IP地址处于低水平。

在我的情况下,我只使用负载均衡器作为处理https请求的便捷方式,我并不需要在多个Web服务器实例之间平衡负载。所以我一直在考虑使用nginx反向代理运行一个单独的实例来处理我的apache webserver的https,添加X_FORWARDED标头就像AWS负载均衡器一样。这样我可以在运行nginx的实例上使用iptables,而且我不必触摸我的apache配置或在负载均衡器后面运行的webapp。

您失去了负载均衡器本身的多个IP地址冗余,以及与AWS Cloud Front集成以平衡后端负载,但您获得了使用iptables的能力,您可以卸载来自Apache的静态内容处理,可能会改进你的回应时间。因为简单的请求处理,nginx被称为比apache轻得多,所以你不应该在那个实例上需要很多力量。我想知道AWS负载均衡器实际上只是运行nginx的实例。如果查看定价,负载均衡器的每小时成本与t2.small linux实例大致相同。

我自己还没试过这个,因为nginx配置对我来说是全新的,它需要购买和安装SSL证书,而不是使用非常简单方便的证书管理器。

我想知道AWS是否会考虑用户功能请求能够使用iptables配置负载均衡器......

更新:我刚刚在AWS EC2论坛中发布了this

更新2:我向AWS发出的功能请求要求为负载均衡器配置iptables的功能得到了解释,说明如何使用网络ACL来阻止来自列表中任何CIDR的请求到达负载均衡器。对我而言,这同样是一个很好的解决方案。 OP正在寻找一种不特定于AWS的解决方案,但这并不符合该标准。如果您在反向代理后面的某个服务器遇到此问题,则根本无法使用该服务器的iptables样式防火墙根据原始IP地址阻止传入请求 - 防火墙需要决定是否在读取标头之前阻止请求,这是唯一可以找到原始请求地址的地方。如果您在AWS上,则可以使用网络ACL。否则,您需要完全控制执行反向代理的服务器,并将防火墙规则放在该服务器上。

答案 2 :(得分:0)

除了每个ACL只能有20个规则。