我试图通过阻止 nginx 中的用户代理来阻止一些讨厌的机器人。当多个用户代理/匹配项包含非字母数字字符且需要用引号括起来时,将它们放在同一个 if 语句中的最佳方法是什么。
这有效:
if ($http_user_agent ~* (python|wget)) {
return 403;
}
if ($http_user_agent ~* "Opera/9.02 (Windows XP; U; ru)") {
return 403;
}
if ($http_user_agent ~* "Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") {
return 403;
}
但我更喜欢这样的东西(不是这种格式):
if ($http_user_agent ~* (python|wget|"Opera/9.02 (Windows XP; U; ru)"|"Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") ) {
return 403;
}
答案1
感谢@PothiKalimuthu 建议使用 nginx map 指令,效果非常好。
我的最终代码如下:
# user agent blacklist
map $http_user_agent $ua_bots {
default 0;
~*(python|wget) 1;
"~*Opera\/9.02 \(Windows XP; U; ru\)" 2;
"~*Opera\/9.70 \(Linux i686 ; U; en\) Presto\/2.2.1" 3;
}
# block user agents from map blacklist
if ($ua_bots) {
return 403;
}
答案2
我很高兴您已经将其设置好并运行良好。我希望添加另一种类型的防御,它更专业一些,它将允许现在可能被阻止的用户代理,即使它们不是真正的机器人。另外,我相信您已经阅读了 Nginx 中的 IFISEVIL 部分。:)
我使用 Fail2Ban 通过 ssh 和 http 保护我的网络服务器。你只需为它们创建一个新的 jail,并告诉应用程序监视日志文件,如果一行符合条件,它就可以永久或仅在一段时间内禁止该 IP 地址。
您没有解释您面临哪种类型的机器人攻击,但 Fail2Ban 有很多“现成的”方法来保护网络服务器。甚至有人写了一个名为“坏机器人”的特定部分
[nginx-badbots]
enabled = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1
https://snippets.aktagon.com/snippets/554-how-to-secure-an-nginx-server-with-fail2ban