我或多或少在 AWS 上进行了以下配置:
弹性负载均衡器,配有 3 台机器和 3 个不同的可用区。我的安全组允许 0.0.0.0/0:80,因为这是我的 rails 应用程序 (nginx、unicorn)。
我想知道是否有任何方法可以拒绝特定公共 IP 地址访问我的应用程序?我一直在阅读 AWS 文档,但由于 SG 是“全部拒绝”,因此没有办法拒绝只有一个特定 IP 地址。
有什么想法吗?负载均衡器后面的 3 台机器上有 iptables 吗?
谢谢!
答案1
一个直接的解决方案是使用 VPC 网络 ACL 入站规则。这仅当您的 ELB 位于 VPC 中时才有效,但如果您在过去几年内创建了它,它应该位于默认 VPC 中。
例如,要禁止 1.2.3.4,请执行以下操作:
- 登录到 AWS。
- 导航
VPC
。 Network ACLs
从左侧菜单中选择。- 选择与您的 ELB 所在的 VPC 关联的 ACL。
- 选择
Inbound Rules
选项卡。 - 选择
Edit
并添加具有以下属性的新规则:- 规则编号:50(任何数字,只要它小于“全部允许”的规则)
- 类型:所有流量
- 协议:全部
- 端口范围:全部
- 来源:1.2.3.4/32
- 允许/拒绝:拒绝
这里还有更多关于网络 ACL 的信息:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
答案2
与应用负载均衡器,您可以通过侦听器规则停止流量。
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-update-rules.html
答案3
如果你只需要将几个 IP 列入黑名单,那么你可以使用nginx_http_access_module在您的网络服务器上。
答案4
为此,正如您所说,最好的解决方案是在 3 台不同的机器上使用 IPtables。
实际上,这不是一个好的解决方案,因为远程 IP($remote_addr
在 Nginx 中)将来自 Amazon 的负载均衡器。禁止该 IP 将导致所有转发的流量都被禁止。
您必须检查数据包并找到 HTTPX-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;
虽然不太好看,但希望有帮助