文章摘要
本文介绍了如何在不使用CDN的情况下屏蔽部分机器人,包括过时的搜索引擎。作者强调需权衡屏蔽范围,并提供了简单通用的方法,但警告可能误伤正常访客,建议谨慎测试后使用。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,已保留关键细节并删减了与主题无关的内容。
如何屏蔽部分网络爬虫(机器人)
副标题: 在不使用CDN的情况下屏蔽机器人,或许还能顺带屏蔽一些过时的“情报机构”或搜索引擎。
引言:屏蔽到什么程度?
在开始屏蔽之前,需要决定目标:是屏蔽部分、大部分还是全部机器人。本文将介绍一些通用且简单的方法,可以屏蔽大多数编码和配置不佳的机器人,并会指出每种方法可能带来的风险和误报。
免责声明: 这些是作者长期使用且有效的方法,但不一定适用于所有人。使用前请充分测试,作者不对任何损失负责。
所有方法都是可选的、可调整的、可编辑的,甚至可“食用”的。 如果不理解或不喜欢某个选项,请自行研究或直接跳过。
⚠️ 不适用于任何盈利环境。
方法1:HTTP协议
- 风险: 屏蔽真实用户(低),屏蔽部分搜索引擎(中等)。
- 原理: 真正的浏览器客户端主要使用 HTTP/2.0 协议,而大多数机器人(包括GoogleBot)仍在使用老旧的 HTTP/1.1。
- 操作: 在Nginx中,可以重定向或屏蔽所有非HTTP/2.0的请求。例如,直接返回403错误或直接断开连接。
- 注意: 这会屏蔽GoogleBot,因为其搜索引擎开发似乎已停滞。Bing和Facebook使用HTTP/2.0。每个组织需要自行判断屏蔽Google是否会造成价值损失。
方法2:屏蔽数据中心IP
- 风险: 屏蔽VPN用户(中等),屏蔽家庭和LTE用户(低),屏蔽搜索引擎(高,需谨慎选择)。
- 原理: 收集过去一两年的访问日志,找出可疑的机器人IP(通过HTTP协议、User-Agent等信号判断),然后在BGP工具网站(如bgp.tools)上查询其所属的数据中心,并屏蔽整个IP段。
- 操作: 作者提供了一个脚本,用于将收集到的IP段汇总,并通过Linux的“黑洞路由”进行屏蔽。使用黑洞路由比防火墙规则更节省CPU资源。
- 注意: 可以屏蔽包含自己服务提供商的IP段,只要不依赖其地址空间进行DNS、配置等关键服务即可。
方法3:屏蔽国家、部分代理、Tor节点等
- 操作: 克隆FireHOL Blocklists项目,使用“for”循环将其中推荐的列表(如
firehol_abusers_30d.netset和firehol_level2.netset)中的IP通过黑洞路由进行屏蔽。 - 作者提供了: 服务器启动脚本、Web服务器专用脚本和sysctl配置文件。
方法4:客户端信号(以Nginx为例)
- 原理: 虽然客户端可以伪造信号,但大多数机器人因懒惰、追求速度或缺乏知识而不会这么做。
- 具体规则:
- User-Agent: 屏蔽包含
Curl、Wget、Bot、GPT、LLM、Spider等关键词的请求。作者提供了一个更长的关键词列表,并建议在使用前先用自己网站的访问日志进行测试,确认不会误伤真实用户。 - Sec-Fetch-Mode: 屏蔽非
cors、no-cors、navigate的请求。 - Referer: 屏蔽来自可疑网站(如
admin、porn、scan等)的请求。特别指出,声称来自Google首页的请求通常是假的。 - 请求方法: 只允许
GET和POST请求。 - 代理头: 屏蔽带有
X-Forwarded-For头的请求。 - User-Agent基础检查: 屏蔽User-Agent中不包含
Linux、BSD、Macintosh、Windows、Mozilla、WhatsApp等关键词的请求。 - 语言偏好: 屏蔽
Accept-Language中不包含en(英语)或es(西班牙语)的请求。也可以选择屏蔽特定国家代码(如br巴西、sy叙利亚)。 - 敏感文件: 屏蔽对
.git、.yml、.db、.sql、.conf等文件的访问请求。
- User-Agent: 屏蔽包含
方法5:使用NFTables屏蔽低质量机器人
- 原理: 通过检查TCP数据包的窗口大小和MSS(最大分段大小)来识别非真实客户端。
- 规则:
- 屏蔽TCP SYN包中窗口大小小于12288字节的请求。
- 屏蔽TCP SYN包中MSS不在1220到1460字节范围内的请求。
- 高级选项: 可以屏蔽TTL(生存时间)大于128的TCP SYN包(会屏蔽大多数LTE设备),或大于64的包(会屏蔽大多数Windows系统,因为Linux/Mac/BSD的默认TTL为64)。
- 注意: 规则中指定了服务器IP地址以减少误报。同时,将80和443端口设置为无状态,以避免占用连接跟踪表。
方法6:成人内容与机器人头部信息
- 原理: 大多数机器人会忽略头部信息,除非是搜索引擎或试图避开成人内容的机器人。
- 操作: 添加
RTA(限制成人)标签和X-Robots-Tag头部,指示搜索引擎不要索引或抓取网站内容。
方法8:使用Brotli压缩内容
- 原理: 预先用Brotli算法压缩网站内容,并配置Web服务器只提供预压缩版本。大多数机器人无法解析Brotli压缩的文本。
- 操作: 在Nginx中启用
brotli_static always;,并预先将HTML文件压缩为.br文件。
方法9:让脚本小子停止扫描你
- 操作: 参考作者的另一篇文章《帮助攻击者自我报告》。
总结: 本文提供了一套从网络层到应用层的多层机器人屏蔽方案,包括协议限制、IP段屏蔽、客户端特征分析和内容压缩等。作者强调所有方法都需要根据自身情况进行测试和调整,并警告可能存在的误报风险。
评论总结
根据评论内容,总结如下:
主要观点与论据:
反对屏蔽非标准用户代理(如curl/wget):多位评论者批评这种做法会误伤真实用户。例如,评论4(ajsnigrutin)指出“There's a special place in hell for people who block curl and wget”,评论12(userbinator)警告“You are only helping the entrenched browser monopoly and furthering the dystopia”,并建议“Block on traffic volume and request frequency if that's causing a problem”。
屏蔽措施可能误伤合法流量:评论3(iririririr)认为“most (all?) of those will 100% block valid traffic too”,评论8(genodethrowaway)补充“and all valid traffic too, judging by these HN comments (and my own attempts to connect)”。评论6(RobotToaster)指出“Blocks firefox's built in VPN”。
对Cloudflare等集中化方案的批评:评论9(FabCH)称“Cloudfare has become the most successful MITM attack in history”,并赞赏文章内容“We need content like this to keep the internet alive”。评论12(userbinator)呼应“You are only helping the entrenched browser monopoly”。
对屏蔽必要性的质疑:评论15(AussieWog93)提出“why do people care so much about bots?”,认为静态网站可轻松处理高流量,并质疑“Is it basically just OCD? Vulnerability protection? Old habits from a time where crawling really did impact service?”
替代方案建议:评论14(billfor)推荐使用fail2ban并定制规则,但指出“the problem with fail2ban... is that it become a pain if you are handling things through a load balancer / proxy”。评论2(fxtentacle)提出“adding a fake cpanel subdomain for 169.254.169.254”以诱捕脚本小子。
对屏蔽效果的怀疑:评论5(Capricorn2481)指出攻击者会“spoofed user agents and rotating TLS signatures”,认为“every post I see about not needing a CDN has tips that could be overcome in under an hour of scripting”。
平衡性说明:多数评论对屏蔽措施持批评态度,强调误伤风险;少数评论(如评论11)承认机器人流量占比高,但选择不干预以免影响真实用户。评论9和12在批评集中化方案的同时,认可文章的价值。