我已经或多或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,请执行以下操作:
VPC 。 Network ACLs 。 Inbound Rules选项卡。 Edit并添加一个新的规则与以下属性:
这里有更多关于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;
这不是很好,但希望它有帮助