在 Nginx 中,根据 X 标头值阻止用户

在 Nginx 中,根据 X 标头值阻止用户

我在负载均衡器后面有 6 个 Nginx 服务器。当然,如果我只是尝试根据 IP 地址“拒绝”,则它不起作用,因为应用服务器只会看到负载均衡器 IP。

但是,我了解了真实 IP 模块,并且已通过以下方式启用它:

set_real_ip_from   0.0.0.0/0;
real_ip_header     X-Real-IP;

那么,既然我已经正确设置了 X-Real_IP 标头,那么我该如何配置 Nginx 来阻止“X-Real-IP”值等于一组 IP 的某些用户?

答案1

这很简单。Nginx 的“geo”模块允许定义一个变量,其值取决于客户端的 IP 地址:

geo $ban_ip {
  default 0;
  10.1.0.0/24 1;
};

geo指令应位于http级别(例如,在 之外server)。有一种方便的方法可以通过include或 来包含大型 IP 数据库ranges,请参阅文档

因此,假设您有这样一个变量,您可以返回您想要的任何状态代码,例如 403 或 404 (在serverlevel 或 中location):

if ($ban_ip) {
  return 403;
}

如果你想悄悄断开连接,可以使用

if ($ban_ip) {
  return 444;
}

444是内部使用的非标准状态代码,用于指示 Nginx 断开连接。(因此客户端看不到它)

答案2

有一个名为 naxsi 的 nginx 应用程序防火墙第三方模块,我认为它可以解决这个问题。

相关内容