“我可以通过 IP 识别机器人吗?”是我们在服务器端过滤方面最常被问到的问题之一。坦诚的回答是:单凭 IP 只是一个起点,而非定论 — 但与几个精心挑选的信号结合后,它就会变得可靠。sgcWebSockets 2026.6 为 TsgcWebSocketFirewall 组件新增了一个 机器人检测 模块,正是做这件事,它使用四个独立信号对每个连接进来的 IP 进行分类。
机器人检测与你已经熟悉的防火墙功能并列 — 黑名单 / 白名单、GeoIP、暴力破解防护、速率限制、威胁评分 — 并遵循相同的组件属性设计。本文将介绍它的工作原理以及如何配置它。
四个信号,一个分类
该模块针对四个独立信号评估每个 IP,并解析出一个 TsgcBotClassification 值:
- 已知机器人 IP 范围 — 将 IP 与从 CIDR 文件加载的已发布爬虫范围(Googlebot、Bingbot、GPTBot、ClaudeBot…)进行匹配。匹配意味着这是一个真正的、已声明的爬虫。
- 数据中心 / 托管检测 — 标记属于云和 VPS 提供商范围(AWS、Hetzner、OVH…)的 IP。真实用户很少从数据中心 ASN 连接;而自动化流量则经常如此。
- 前向确认反向 DNS (FCrDNS) — 对 IP 执行 PTR 查询,然后将得到的主机名前向确认回同一个 IP。这是辨别 真正的 Googlebot 与任何仅在请求头中声称是 Googlebot 的内容的唯一可靠方法。
- DNSBL 信誉 — 查询 DNS 黑名单(Spamhaus 及其他),找出具有已知滥用历史的 IP。
结果是六个值之一:
TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
bcSuspectedBot, bcBlocklisted, bcHuman);
仅基于 IP 的检测存在实际局限 — 地址会在 CGNAT 后面共享、会轮换,而且高级机器人会隐藏在住宅代理池中。因此机器人检测的设计目标是给你一个良好的初步 评分,而非绝对的真相。这也是为什么按照设计,它绝不会单独阻断一个连接。
启用机器人检测
一切都位于新的 BotDetection 属性下。打开你想要的信号,并将基于文件的信号指向它们的数据:
uses
sgcWebSocket_Server_Firewall;
var
oFirewall: TsgcWebSocketFirewall;
begin
oFirewall := TsgcWebSocketFirewall.Create(nil);
oFirewall.BotDetection.Enabled := True;
// 1. Verified crawler IP ranges (file lines: CIDR,botname)
oFirewall.BotDetection.KnownBotsFile := 'C:\firewall\known-bots.csv';
// 2. Datacenter / hosting ranges (file lines: CIDR,asn-name)
oFirewall.BotDetection.Datacenter.Enabled := True;
oFirewall.BotDetection.Datacenter.ASNFile := 'C:\firewall\datacenter-ranges.csv';
// 3. Forward-confirmed reverse DNS verification
oFirewall.BotDetection.ReverseDNS.Enabled := True;
// 4. DNSBL reputation lookups
oFirewall.BotDetection.DNSBL.Enabled := True;
oFirewall.BotDetection.DNSBL.Zones.Add('zen.spamhaus.org');
// Resolution tuning
oFirewall.BotDetection.CacheDurationSec := 3600; // cache a verdict for 1h
oFirewall.BotDetection.DNSTimeoutMS := 2000;
oServer.Firewall := oFirewall;
end;
两个基于文件的信号复用了为防火墙 GeoIP 数据库提供支持的同一个快速二分查找 CIDR 引擎,因此即使是庞大的范围列表也能在微秒内完成解析。
反向 DNS 和 DNSBL 绝不阻塞 accept 线程
反向 DNS 和 DNSBL 是实时 DNS 查询 — 在连接 accept 线程上内联执行它们无异于自找拒绝服务。机器人检测改为在后台工作线程上解析它们,并从缓存中提供每一次分类。在缓存未命中时,IP 会被排入解析队列,当前调用立即返回 bcUnknown;当查询完成时缓存被更新,并触发 OnBotDetected 事件。CacheDurationSec 属性控制一个判定结果在 IP 被重新检查之前被复用多久。
仅分类:OnBotDetected
机器人检测是 仅分类 的。它绝不会自行拒绝一个连接 — 它会触发一个事件、更新防火墙统计信息(新增的 fvBot 计数器),并把策略决定留给你。这可以防止一个被误判的、经过验证的爬虫被悄无声息地丢弃。
procedure TForm1.FirewallBotDetected(Sender: TObject; const aIP: string;
aClassification: TsgcBotClassification; const aBotName: string);
begin
case aClassification of
bcVerifiedCrawler:
DoLog(aIP + ' is a verified crawler: ' + aBotName);
bcDatacenter:
DoLog(aIP + ' originates from a datacenter / hosting range');
bcBlocklisted:
DoLog(aIP + ' is listed on a DNSBL');
end;
end;
你也可以随时通过 GetBotClassification 请求一个判定结果 — 这对于定制响应而非过滤连接来说很方便:
if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
// serve a lightweight, cache-friendly variant to the crawler
ServeStaticSnapshot
else
ServeFullApp;
对判定结果采取行动:自定义规则引擎
当你 确实 想要阻断时,你通过防火墙现有的自定义规则引擎显式地选择加入。每个 TsgcFirewallRuleItem 都获得了一个新的 BotType 属性:设置它,规则就会匹配分类等于该值的连接。然后你可以拒绝、封禁或记录它们 — 复用你已经拥有的全部规则机制。
var
oRule: TsgcFirewallRuleItem;
begin
oFirewall.CustomRules.Enabled := True;
// Ban any IP listed on a DNSBL for one hour
oRule := oFirewall.CustomRules.Rules.Add as TsgcFirewallRuleItem;
oRule.Name := 'ban-blocklisted-bots';
oRule.BotType := bcBlocklisted;
oRule.ActionType := raBan;
oRule.BanDurationSec := 3600;
end;
这种分工 — 在机器人检测模块中进行被动分类,仅通过你编写的规则进行主动执行 — 意味着该功能绝不会因为阻断你想保留的流量而让你措手不及。
使用你自己的判定结果:OnResolveBot
如果你已经运行着一个威胁情报服务、一个内部信誉缓存或一个商业机器人缓解订阅源,请分配 OnResolveBot 事件。当它被设置时,你的处理程序提供判定结果,内置解析器步骤则退居一旁 — 这与防火墙在 GeoIP 的 OnResolveCountry 上已经使用的覆盖模式相同。
procedure TForm1.FirewallResolveBot(Sender: TObject; const aIP: string;
var aClassification: TsgcBotClassification; var aBotName: string);
begin
// Consult your own threat feed instead of the built-in resolver
if MyThreatFeed.IsMaliciousBot(aIP) then
begin
aClassification := bcBlocklisted;
aBotName := 'internal-threat-feed';
end;
end;
演示
Demos\04.WebSocket_Other_Samples\13.Firewall 中的防火墙演示有一个新的 机器人检测 选项卡,你可以在那里逐个打开各信号、加载已知机器人和数据中心范围文件、配置 DNSBL 区域,并使用一个实时的 “分类 IP” 测试器来查看任何地址的判定结果 — 每次分类都会流式输出到事件日志。
可用性
机器人检测随 sgcWebSockets 2026.6 发布,是一个即插即用的新增功能:BotDetection 属性默认为禁用,因此在你将其打开之前现有项目不受影响。该功能适用于 Delphi(7 至 13)、C++Builder 和 .NET 版本。
拥有有效订阅的客户可以从客户专区下载新构建版本。试用用户可以在 esegece.com/products/websockets/download 获取更新后的安装程序。
有问题、反馈或需要迁移帮助?联系我们 — 你会收到编写这些代码的人的回复。
