在AWS ELB上拒绝IP地址

我已经或多或less地在AWS上进行configuration了:

具有3台机器的弹性负载均衡器或3个不同的可用区域。 我的安全组允许0.0.0.0/0:80,因为它是我的rails应用程序(nginx,unicorn)。

我想知道是否有任何方法拒绝访问我的应用程序到特定的公共IP地址? 我一直在阅读AWS文档,但是由于SG的“全部拒绝”,所以无法拒绝一个特定的IP地址。

有任何想法吗? 负载均衡器后面的3台机器的iptables

谢谢!

不,没有select阻止安全组的IP。

安全组本质上是一个白名单,而不是黑名单。

一切都被默认拒绝,你可以根据你的需要有select地打开端口,但你不能阻止任何特定的人/ IP。

为此,正如你所说,最好的解决scheme是在3台不同的机器上安装IPtables。

我相信未来AWS安全组也会拥有这个function,但不是现在。

直接的解决scheme是使用VPCnetworkingACL入站规则。 这只适用于你的ELB在VPC中,但如果你在过去的几年里创build了它,它应该是默认的。

例如,要禁止1.2.3.4,请执行以下操作:

  1. login到AWS。
  2. 导航到VPC
  3. 从左侧菜单中selectNetwork ACLs
  4. select与您的ELB所在的VPC相关的ACL。
  5. selectInbound Rules选项卡。
  6. selectEdit并添加一个新的规则与以下属性:
    • 规则#:50(任何数字,只要它低于所有ALLOWs的规则)
    • types:所有stream量
    • 协议:ALL
    • 端口范围:ALL
    • 来源:1.2.3.4/32
    • 允许/拒绝:拒绝

这里有更多关于networkingACL的信息: http : //docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html

如果您只需要将几个IP列入黑名单,则可以在Web服务器上使用nginx_http_access_module 。

为此,正如你所说,最好的解决scheme是在3台不同的机器上安装IPtables。

实际上,这不是一个好的解决scheme,因为远程ip(Nginx中的$remote_addr )将来自Amazon的loadbalancer。 禁止这将导致所有stream量转发被禁止。

您将不得不检查数据包并findHTTP X-Forwarded-For标头,IPtables不是那样的协议意识。

我在Nginx中解决了2个调皮IP的问题

 set $client_ip $remote_addr; if ($http_x_forwarded_for) { set $client_ip $http_x_forwarded_for; } if ($client_ip = "123.123.123.123") { return 403; } if ($client_ip = "123.123.123.234") { return 403; } 

引入一个variables$client_ip ,以便我也可以在本地testing,没有http_x_forwarded_for可用。

稍微偏离主题,但为方便起见,我还将客户端IP添加到我的访问日志中:

 log_format main "\$client_ip - \$remote_user [\$time_local] \"\$request\" \$status \$body_bytes_sent \"\$http_referer\" \"\$http_user_agent\""; access_log /var/log/nginx.access.log main; 

这不是很好,但希望它有帮助