sgcWebSockets 2026.6 — 防火墙中的机器人检测

· 组件

“我可以通过 IP 识别机器人吗?”是我们在服务器端过滤方面最常被问到的问题之一。坦诚的回答是:单凭 IP 只是一个起点,而非定论 — 但与几个精心挑选的信号结合后,它就会变得可靠。sgcWebSockets 2026.6 为 TsgcWebSocketFirewall 组件新增了一个 机器人检测 模块,正是做这件事,它使用四个独立信号对每个连接进来的 IP 进行分类。

机器人检测与你已经熟悉的防火墙功能并列 — 黑名单 / 白名单、GeoIP、暴力破解防护、速率限制、威胁评分 — 并遵循相同的组件属性设计。本文将介绍它的工作原理以及如何配置它。

四个信号,一个分类

该模块针对四个独立信号评估每个 IP,并解析出一个 TsgcBotClassification 值:

结果是六个值之一:

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 获取更新后的安装程序。

有问题、反馈或需要迁移帮助?联系我们 — 你会收到编写这些代码的人的回复。