sgcWebSockets 2026.6 — ファイアウォールでのボット検出

· コンポーネント

“IP でボットを識別できますか?” は、サーバーサイドのフィルタリングについて最もよく寄せられる質問の一つです。正直に答えると、IP 単独では出発点にすぎず、判定そのものではありません — しかし、適切に選んだいくつかのシグナルと組み合わせれば信頼できるものになります。sgcWebSockets 2026.6 は TsgcWebSocketFirewall コンポーネントに、まさにそれを行う新しい ボット検出 モジュールを追加し、接続してくるすべての IP を 4 つの独立したシグナルを使って分類します。

ボット検出は、すでにご存じのファイアウォール機能 — ブラックリスト / ホワイトリスト、GeoIP、ブルートフォース、レート制限、脅威スコアリング — と並んで配置され、同じコンポーネントプロパティ設計に従います。本投稿では、その仕組みと設定方法を説明します。

4 つのシグナル、1 つの分類

このモジュールは各 IP を 4 つの独立したシグナルに対して評価し、単一の TsgcBotClassification 値を解決します:

結果は 6 つの値のいずれかになります:

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;

2 つのファイルベースのシグナルは、ファイアウォールの GeoIP データベースを動かしているのと同じ高速なバイナリ検索 CIDR エンジンを再利用するため、大きな範囲リストでもマイクロ秒単位で解決されます。

reverse DNS と DNSBL は accept スレッドをブロックしない

reverse 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 ゾーンを設定し、ライブの “Classify IP” テスターを使って任意のアドレスの判定を確認できます — すべての分類はイベントログにストリーミングされます。

提供状況

ボット検出は sgcWebSockets 2026.6 に同梱され、ドロップイン追加です。BotDetection プロパティはデフォルトで無効になっているため、有効にするまで既存のプロジェクトは影響を受けません。この機能は Delphi(7 から 13)、C++Builder、および .NET エディションで利用できます。

アクティブなサブスクリプションをお持ちのお客様は、カスタマーエリアから新しいビルドをダウンロードできます。トライアルユーザーは、更新されたインストーラーを esegece.com/products/websockets/download で入手できます。

ご質問、フィードバック、または移行のヘルプが必要ですか? お問い合わせ — コードを書いた担当者から返信があります。