在 Nginx 中,您可以通过多种方式结合 IP 地址和 User-Agent 来限制访问。以下是几种实现方法:
server {
listen 80;
server_name example.com;
# 定义不允许的IP和User-Agent组合
set $deny_access off;
# 检查IP和User-Agent
if ($remote_addr = "123.45.67.89") {
set $deny_access "${deny_access}1";
}
if ($http_user_agent ~* (curl|wget|python-requests)) {
set $deny_access "${deny_access}2";
}
# 如果同时匹配IP和User-Agent则拒绝访问
if ($deny_access = "12") {
return 403;
}
# 其他配置...
}
map "$remote_addr:$http_user_agent" $deny_access {
default 0;
"123.45.67.89:curl" 1;
"123.45.67.89:wget" 1;
"98.76.54.32:python-requests" 1;
}
server {
listen 80;
server_name example.com;
if ($deny_access) {
return 403;
}
# 其他配置...
}
geo $block_ip {
default 0;
123.45.67.89/32 1;
98.76.54.32/24 1;
}
map "$block_ip:$http_user_agent" $deny_access {
default 0;
"1:curl" 1;
"1:wget" 1;
"1:python-requests" 1;
}
server {
listen 80;
server_name example.com;
if ($deny_access) {
return 403;
}
# 其他配置...
}
创建 /etc/nginx/conf.d/block_rules.conf
:
# 定义黑名单IP
geo $blacklist_ip {
default 0;
include /etc/nginx/conf.d/ip_blacklist.conf;
}
# 定义黑名单User-Agent
map $http_user_agent $bad_agent {
default 0;
include /etc/nginx/conf.d/ua_blacklist.conf;
}
# 组合规则
map "$blacklist_ip:$bad_agent" $deny_access {
default 0;
"1:1" 1;
}
然后在主配置中使用:
server {
listen 80;
server_name example.com;
include /etc/nginx/conf.d/block_rules.conf;
if ($deny_access) {
return 403;
}
# 其他配置...
}
如果您有 Nginx Plus 或编译了 geoip 模块,可以结合地理位置限制:
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
map "$geoip_country_code:$http_user_agent" $deny_access {
default 0;
"CN:curl" 1;
"RU:wget" 1;
}
server {
if ($deny_access) {
return 403;
}
}
}
server {
# 记录被拒绝的访问
error_log /var/log/nginx/access_denied.log;
if ($deny_access) {
access_log /var/log/nginx/access_denied.log main;
return 403;
}
}
通过以上方法,您可以灵活地根据 IP 地址和 User-Agent 组合来限制对 Nginx 服务器的访问。