我在负载均衡器后面有 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 (在server
level 或 中location
):
if ($ban_ip) {
return 403;
}
如果你想悄悄断开连接,可以使用
if ($ban_ip) {
return 444;
}
444
是内部使用的非标准状态代码,用于指示 Nginx 断开连接。(因此客户端看不到它)
答案2
有一个名为 naxsi 的 nginx 应用程序防火墙第三方模块,我认为它可以解决这个问题。