まず第一に、他の人が私の Web サイトのコンテンツをクロールすることに私は反対しません。私は必ずしも他の人のクロールを厳密に制限するわけではありませんが、一部の人々のクロールにはまったく利益がありません。彼らは 1 つのスクリプトまたは複数のスクリプトを使用します。サーバーのコンテンツを取得することは、DDO と何ら変わりません。
私のサーバーでは現在そのような状況が発生しています。一時停止せずに悪意のあるクロールが行われ、ログ分析に深刻な影響を及ぼし、サーバーの負荷も増加しました。
この動作を防ぐにはどうすればよいですか? nginx サーバーを使用していますが、私の知る限り、特定の IP に対してのみdeny
しか実行できませんが、拒否は今後もログに表示されますが、403 になります。さらに、手動による拒否は受動的すぎるため、特定の IP へのアクセス数が急激に増加したことを賢明に判断して、その IP を禁止できるでしょうか。
1. ngx_http_limit_conn_module は、単一 IP の接続数を制限するために使用できます
http://nginx.org/en/docs/http/ngx_htt...
2. ngx_http_limit_req_module を使用して、単一 IP の 1 秒あたりのリクエスト数を制限できます
http://nginx.org/en/docs/http/ngx_htt...
3. nginx_limit_speed_module を使用して IP 速度を制限できます
https://github.com/yaoweibin/nginx_li...
主にfail2ban (http://www.fail2ban.org/)を使用した解決策も提供します。 failed2ban はログをスキャンすることで iptable の使用を禁止するかどうかを非同期に決定するため、元のシステムへの影響は比較的小さく、nginx の再設定は必要ありません。ただし、アクセス数が多すぎるかどうかはわかりません。
まず
を追加します リーリー/etc/fail2ban/jail.conf
に次に
に変更します リーリー/etc/fail2ban/filter.d/nginx-bansniffer.conf
を見つけて、404の判定を最後に
fail2ban
サービスを再起動します。上記の設定では、120 秒ごとに 120 回以上のアクセスがある IP アドレスを 1 時間禁止します。1. ユーザーエージェントに基づいてスパイダークローリングを防止します
リーリー2. オペレーティング システムのファイアウォールにルールを作成して、同じ IP への同時接続の数を制限します
3. 各 IP のアクセス頻度をカウントする bash スクリプトを作成し、設定した上限を超えた IP を自動的にブラックリストに追加しますLinux での iptables を例にとると、次の設定では、1 分間に同じ IP に対して最大 15 個の接続の確立が制限され、超過した接続は iptables によって破棄され、nginx に到達しません。 リーリー
ブラックリスト内の IP については、スクリプトを使用して iptables または nginx.conf に自動的に書き込み、数分間ブロックするか、許可されるアクセス頻度を減らします
Yahoo にいたときは、外部からの WEB サービスの悪用を防ぐためにルールをカスタマイズできた、YDoD (Yahoo! 国防総省) という Apache モジュールを使用していました。探し回ってもオープンソースが見つかりませんでした。しかし、原理は上で述べたことと似ています。ngx_lua_wafを試してみる
リーリーhttps://github.com/loveshell/ngx_lua_waf
機能: