今日、サイトのアクセスログを見てみると、User Agent が Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html) というスパイダーが非常に頻繁にサイトをクロールしていて、20MB 超のログを見るに、かなりの期間クロールし続けていることが分かりました。

サイトログ
このスパイダーがアクセスしているページを見ると、過去にクロールしたページのパラメータをランダムに組み合わせてアクセスしているようで、クロールされるリンクはすべて長い文字列であり、ほとんどが 404 を返しています。さらに数秒ごとにクロールされるため、ログ内の正常なアクセス記録が数万行のスパムスパイダー記録に埋もれてしまいます。
最初は、スパイダーなら robots.txt を守るはずだと思い、robots.txt にルールを追加することにしました:
User-agent: SemrushBot
Disallow: /
ところが調べてみると、どうやらこれは robots.txt を守らないようです 😅(公式ページではスパイダーは robots.txt を厳守すると主張していますが、ネット上の声を見ると実際はそうではないようです)。しかもこの SemrushBot に限らず、多くのマーケティングスパイダーが robots.txt を無視します。仕方ないので Nginx でブロックすることにしました。宝塔の Nginx 無料ファイアウォール の グローバル設定 で User-Agent フィルター の ルール をクリックし、以下の正規表現を追加しました(ネットで集めたものです。こんなにあったので驚きました。必要な UA が含まれていないか事前に確認してください):
数秒後、ブロックデータが表示されるようになります。

ブロックデータ
その後、ブロック数がどんどん増えていくのを見て、404 を返しても 444 を返しても、リクエストが発生すればサーバーリソースを消費するため、数秒〜十数秒ごとにリクエストが続くのは長続きしないと考え直しました。さらに調べてみると、これらのスパイダーの IP は海外ノードばかりで、私のサイトも海外向けに Cloudflare に解決していたため、Cloudflare に途中でブロックしてもらえば、サイト本体にアクセスさせずに済みます。

スパイダー IP
Cloudflare で該当ドメインのコンソールを開き、セキュリティ の WAF 項目に進み、ルール追加 をクリックします。式プレビュー に以下の式を追加します(同様に、必要な UA がブロックされていないか事前に確認してください):
次に アクション選択 で ブロック を選んで保存します。

Cloudflare カスタムルール
これで、宝塔の Nginx 無料ファイアウォールのリスクブロック数が増加しなくなり、Cloudflare のファイアウォールルールのブロック数が急増すれば、無事に Cloudflare でゴミスパイダーのアクセスをブロックできている証拠です。
目覚めてアップデート
目を覚ましたら既に 2,000 回以上ブロックされていました。本当にしつこいですね 😅。

Cloudflare カスタムルール