Nginx的geo模块允许你基于客户端IP地址创建变量,非常适合用来实现IP白名单功能。以下是详细配置方法:
http
块中)添加geo模块配置:http {
# 定义白名单IP
geo $whitelist {
default 0;
192.168.1.0/24 1; # 允许整个192.168.1.x网段
10.0.0.1 1; # 允许单个IP
203.0.113.42 1; # 另一个允许的IP
}
server {
listen 80;
server_name example.com;
# 使用白名单
if ($whitelist = 0) {
return 403; # 拒绝非白名单IP
}
# 其他配置...
}
}
为了避免使用if
指令(Nginx官方不推荐过多使用if),可以采用map模块:
http {
# 定义白名单IP
geo $whitelist {
default 0;
192.168.1.0/24 1;
10.0.0.1 1;
}
# 将白名单映射为变量
map $whitelist $access {
0 "deny";
1 "allow";
}
server {
listen 80;
server_name example.com;
location / {
# 使用allow/deny指令
allow 127.0.0.1; # 总是允许本地访问
deny all; # 默认拒绝所有
allow_unroutable_bogus; # 防止某些特殊情况
# 根据geo结果决定是否允许
eval $access;
# 其他配置...
}
}
}
对于大量IP地址,可以将它们存储在单独的文件中:
/etc/nginx/whitelist.conf
:192.168.1.0/24 1;
10.0.0.1 1;
203.0.113.42 1;
http {
geo $whitelist {
default 0;
include /etc/nginx/whitelist.conf;
}
# 其余配置...
}
sudo nginx -t && sudo nginx -s reload
geo $whitelist {
::1 1; # IPv6本地地址
2001:db8::/32 1;
}
在生产环境中,建议将频繁变动的IP白名单放在单独文件中,便于维护。
对于高安全性要求的场景,可以考虑结合其他认证方式,如HTTP基本认证。
通过以上方法,你可以灵活地控制哪些IP地址可以访问你的Nginx服务。