拒绝 AWS ELB 上的 IP 地址

拒绝 AWS ELB 上的 IP 地址

我或多或少在 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,请执行以下操作:

  1. 登录到 AWS。
  2. 导航VPC
  3. Network ACLs从左侧菜单中选择。
  4. 选择与您的 ELB 所在的 VPC 关联的 ACL。
  5. 选择Inbound Rules选项卡。
  6. 选择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

alb 监听规则 Web 界面

答案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;

虽然不太好看,但希望有帮助

相关内容