はじめに
Webサイトを公開していると、必ず遭遇するのが「自動化された嫌がらせ」です。
ログを確認すると、1秒ごとに異なるURLへPOSTリクエストを送り続けてくるボットたちがいます。
今回は、特定のネットワークセグメントから行われた執拗な「PHPUnitのバックドア設置スキャン」に対し、アプリケーション層(ModSecurity)だけでなく、カーネル層(IPset)で物理的に遮断した際のメモです。
前提
以下の手順でipsetを導入していること。
1. ログに残る「執拗なアクセス」
ある日、アクセスログを眺めていると、以下のような文字列が並んでいることに気づきました。
# access.log の例 (ダミーデータ)
192.0.2.239 - - [06/Mar/2026:14:35:07] "POST /lib/phpunit/Util/PHP/eval-stdin.php HTTP/1.1" 404 3067 "-" "Mozilla/5.0..."
192.0.2.239 - - [06/Mar/2026:14:35:08] "POST /lib/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 404 3067 "-" "Mozilla/5.0..."
...
攻撃者は /vendor/ や /lib/ などのディレクトリを総当たりし、脆弱性のあるPHPUnitファイルを探しています。
このアクセス元を調べてみました。
2. ASN(拠点のプロバイダー)を特定する
しかし、調べてIPをブロックするだけでは終わりません。相手は同じネットワーク(ASN)内の別IPから再び攻撃してくるからです。
そこで whois コマンドを用いて、この攻撃者が所属するネットワークの広がりを確認しました。
- 攻撃者のIPから所属ASNを特定する
※ダミーIPにしています。
whois -h whois.radb.net -- '192.0.2.239'
結果、このIPは特定のホスティング事業者が管理する「広大なネットワーク帯域」の一部であることが判明しました(仮に AS_DUMMY_99 とします)。
3. 「IPset」による物理的遮断
単なるIPの拒否リストでは、数千に及ぶボットのIPを捌ききれません。数千ものIP/NWをufwでブロックすると、たちどころにその膨大なルールでufwは機能不全を起こします。
それが、上述したLinuxカーネルレベルで高速にパケットを破棄できる ipset を使用した形です。
手順:ASNを広域ブロックする
まず、そのASNが保持する全CIDRを取得し、aggregate コマンドで最適なサイズに集約します。
- ASNからルートを取得し、整理する
whois -h whois.radb.net -- '-i origin AS_DUMMY_99' | grep -E '^route:' | aggregate > ban_list.txt
(aggregateがない場合はsudo apt install aggregateでインストールします)
これにより、手作業では到底管理できない広大なネットワーク帯域を、数行のルールに圧縮できます。最後に、このルールを ipset に投入します。
筆者手順ではこの形。
sudo ipset add ufw-blocklist IPアドレス・NWアドレス
sudo ipset save ufw-blocklist -f /etc/ufw/ipsets.save
まとめ
なぜASNごと切り捨てるのかは「彼らの根城だから」につきます。(そのあたりは筆者コラムに書いています)
そもそも、これらのボットは、海外の法が緩いVPSや出所の怪しいプロバイダに巣喰っています。
こん城ん奴ばら共は糞じゃ
撫で切りぞ
根切りぞ
ぐらいのブロックは必要です。
コメントを残す