Nginx 可以通过多种方式实现 IP 地址的黑名单或白名单控制,以下是几种常见的方法:
deny
和 allow
指令这是最简单直接的方法,在 Nginx 配置文件中使用 deny
和 allow
指令:
http {
# 黑名单配置示例
server {
deny 192.168.1.100; # 拒绝单个IP
deny 10.0.0.0/8; # 拒绝整个网段
allow all; # 允许其他所有IP
}
# 白名单配置示例
server {
allow 192.168.1.50; # 允许单个IP
allow 10.1.0.0/16; # 允许整个网段
deny all; # 拒绝其他所有IP
}
}
为了便于管理,可以创建单独的配置文件:
/etc/nginx/blacklist.conf
:deny 192.168.1.100;
deny 10.0.0.0/8;
/etc/nginx/whitelist.conf
:allow 192.168.1.50;
allow 10.1.0.0/16;
deny all;
http {
include /etc/nginx/blacklist.conf;
# 或
include /etc/nginx/whitelist.conf;
}
对于更复杂的场景,可以使用 Nginx 的 Geo 模块:
http {
geo $blocked {
default 0;
192.168.1.100 1; # 标记为1表示要阻止
10.0.0.0/8 1;
}
server {
if ($blocked) {
return 403;
}
}
}
对于需要动态更新的黑名单,可以结合 fail2ban 工具:
sudo apt-get install fail2ban # Debian/Ubuntu
sudo yum install fail2ban # CentOS/RHEL
对于企业级需求,可以考虑: - Nginx Plus 的动态黑名单功能 - ngx_http_geoip_module 模块(基于地理位置过滤) - ModSecurity 等 WAF 模块
http {
# 白名单IP列表
allow 192.168.1.50;
allow 203.0.113.25;
deny all;
server {
listen 80;
server_name example.com;
location / {
# 记录被拒绝的访问
error_page 403 = @deny;
try_files $uri $uri/ =404;
}
location @deny {
return 403 "Access Denied";
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
}
配置完成后,记得测试并重新加载 Nginx:
sudo nginx -t
sudo systemctl reload nginx