拒绝AWS ELB上的IP地址


10

我或多或少地在AWS上进行了以下配置:

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

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

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

谢谢!

Answers:


16

一个直接的解决方案是使用VPC网络ACL入站规则。仅当您的ELB在VPC中时,此方法才有效,但是如果您在最近几年中创建了它,则应将其作为默认值。

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

  1. 登录到AWS。
  2. 导航至VPC
  3. 选择Network ACLs从左侧菜单。
  4. 选择与您的ELB所在的VPC相关联的ACL。
  5. 选择Inbound Rules标签。
  6. 选择Edit并添加具有以下属性的新规则:
    • 规则#:50(任意数字,只要它小于允许所有的规则)
    • 类型:所有流量
    • 协议:全部
    • 端口范围:全部
    • 资料来源:1.2.3.4/32
    • 允许/拒绝:DENY

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


1

不可以,没有选项可以阻止带有安全组的IP。

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

默认情况下,所有内容都被拒绝,您可以根据需要有选择地打开端口,但不能阻止任何特定的人员/ ip。

为此,最好的解决方案就是您所说的3台不同机器上的IPtables。

我敢肯定,AWS安全组也将具有此功能,但目前还没有。



1

为此,最好的解决方案就是您所说的3台不同机器上的IPtables。

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

您必须检查数据包并找到HTTP 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;
}

引入变量$client_ip,以便我也可以在没有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;

不太漂亮,但希望对您有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.