背景
在管理后台修改一些内容的时候,想到很久之前安装的重定向插件Redirections,随便就看一下。这不看不知道,看到了就差点大声尖叫。没有想到这么多对站点无意义的请求命中之前设置的重定向规则,一眼就可以发现请求UA不正常。例如:Apache-HttpClient、python-requests等
这种是一些非法采集的应用,觉得还是要对这类UA进行一些限制,例如:禁止指定UA访问、拒绝IP或者IP段的访问等。

现在服务已经由原来的Apache迁移到了Nginx服务上运行,所以现在的处置方案针对Nginx的。
Nginx禁止特定UA访问
在Nginx中有一个内置变量$http_user_agent,表示HTTP请求头中的User-Agent字段。使用正则表达式匹配User-Agent字段中是否包含特定的字符串,符合规则的则禁止访问。具体实现如下:
location / {
if ($http_user_agent ~* (python-requests|Apache-HttpClient)) {
return 403;
}
}
以上配置可以用于防止用户使用某些自动化工具或脚本对站点进行滥用。然而,需要注意的是,这种检测方式并不完全可靠。因为用户可以通过修改User-Agent来绕过此防护措施。所以这种方式只可以被视作拦截大多数爬虫程序的一种简单手段。
Nginx禁止特定的IP以及IP段
如果说Nginx禁止特定的UA来访问是一个泛化的处理方式的话,那么禁止IP或者IP段这是一个具备针对点的解决方法。针对某个IP或者某个IP段,这种方式比较滞后,发现大量无用请求后才可以采取的措施。当然,面对这种恶意的请求,这些也只是最快速、最简单、最低廉的解决方案。
在Nginx中,可以使用deny指令来禁止IP地址或IP地址段的访问。这个功能可以用于防止恶意访问和DDoS攻击,以及限制对特定内容的访问。
禁止单个IP地址
要禁止单个IP地址的访问,可以在 Nginx 配置文件中添加以下行:
location / {
deny 192.168.1.100;
# 其他配置
}
在此例中,使用 deny 指令来阻止IP地址为 192.168.1.100 的客户端访问该位置的内容。如果有客户端尝试访问,他们将收到403 Forbidden错误。
禁止IP地址段
如果要禁止IP地址段的访问,可以在 Nginx 配置文件中使用 CIDR 表示法。CIDR 表示法允许您指定一个 IP 地址的范围。例如,要阻止 192.168.0.0/24 子网内的所有客户端访问,可以使用以下配置:
location / {
deny 192.168.0.0/24;
# 其他配置
}
这将阻止子网内的所有IP地址从该位置访问,包括 192.168.0.1、192.168.0.2、192.168.0.3 等等。
恢复被禁止的客户端
如果想恢复先前被禁止的 IP 地址或 IP 地址段的客户端,请简单地将其从相关的配置中删除或注释掉。
location / {
# deny 192.168.1.100;
# deny 192.168.0.0/24;
# 其他配置
}
完整实例
下面是一个完整的Nginx配置,它禁止IP地址为192.168.1.100和192.168.0.0/24的客户端访问站点:
http {
server {
listen 80;
server_name example.com;
root /var/www/html;
location / {
# 禁止IP地址为192.168.1.100的客户端访问
deny 192.168.1.100;
# 禁止IP地址为192.168.0.0/24的客户端访问
deny 192.168.0.0/24;
# 允许其他客户端访问
allow all;
# 其他配置
}
}
}
转载请注明:清风亦平凡 » Nginx禁止指定UA、IP或者IP段访问
支付宝扫码打赏
微信打赏