fail2ban के साथ दुर्भावनापूर्ण Googlebot का स्वांग रचने वाले IP को रिवर्स लुकअप के माध्यम से गतिशील रूप से ब्लॉक करना

8 min

language: ja bn en es hi pt ru zh-cn zh-tw

नमस्ते, मैं मुनो (Munou) हूँ।
पिछली बार
Google बॉट होने का दावा करने वाले अनुरोध IP की जांच, जिसमें दुरुपयोग भी शामिल है - SOULMINIGRIG

यहाँ मैंने पुष्टि की है कि Google होने का ढोंग करने वाले अनुरोध करने वाले IP समूहों की संख्या काफी अधिक है।
लेकिन इन्हें ब्लॉक कैसे करें? दूसरे शब्दों में, यदि fail2ban इसे पहचान सके और एक निर्दिष्ट स्क्रिप्ट चला सके, तो यह काम करेगा, और मुझे निम्नलिखित इश्यू (issue) में एक संकेत मिला।
apache-fakegooglebot: whitelist · Issue #1318 · fail2ban/fail2ban · GitHub

सरल शब्दों में कहें तो, व्यापक रूप से Google बॉट्स को पकड़ें, और फिर निर्दिष्ट स्क्रिप्ट के साथ ignoreip का निर्णय लें।
यह काम करना चाहिए।

jail.local

निम्नलिखित जोड़ें।


[fake-googlebot]
enabled = true
filter = fake-googlebot
port = http,https
logpath = /var/log/nginx/access.log
findtime = 1w
maxretry = 1
bantime = 99999w
ignorecommand = /usr/local/bin/check_googlebot.sh <ip>
action = pf[name=fake-googlebot]

इस मामले में, आपको फ़िल्टर शर्त के रूप में fake-googlebot बनाने की आवश्यकता है।
साथ ही, ignorecommand में सेट की गई शेल स्क्रिप्ट की भी आवश्यकता है।

filter.d/fake-googlebot.conf

व्यापक रूप से इस प्रकार पकड़ें।

[Definition]
failregex = ^<HOST> - .*"(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH) .*" \d+ \d+ ".*" ".*Googlebot.*"$
ignoreregex =

/usr/local/bin/check_googlebot.sh

ignorecommand के मामले में, निष्पादन के समय विफलता स्थिति कोड (failure status code) प्राप्त करके इसे बैन लक्ष्य के रूप में नियंत्रित किया जाता है।
इसका मतलब है कि तर्क (argument) के रूप में IP पता देकर और निष्पादन के समय स्थिति कोड प्राप्त करके, आप यह निर्धारित कर सकते हैं कि यह बैन के लिए है या स्किप करने के लिए।

#!/bin/sh
IP="$1"
LOG="/var/log/check_googlebot.log"
# रिवर्स लुकअप
HOST=$(getent hosts "$IP" | awk '{print $2}' | head -n1)
if [ -z "$HOST" ]; then
  echo "[$(date)] DENY $IP: no PTR" >> "$LOG"
  exit 1
fi
# जांचें कि क्या यह Google डोमेन है
case "$HOST" in
  *.googlebot.com|*.google.com)
    ;;
  *)
    echo "[$(date)] DENY $IP: invalid domain ($HOST)" >> "$LOG"
    exit 1
    ;;
esac
# फॉरवर्ड लुकअप करें और जांचें कि क्या यह मूल IP से मेल खाता है
MATCH=1
getent hosts "$HOST" | awk '{print $1}' | while read -r RESOLVED; do
  if [ "$RESOLVED" = "$IP" ]; then
    MATCH=0
    break
  fi
done
if getent hosts "$HOST" | awk '{print $1}' | grep -Fxq "$IP"; then
  echo "[$(date)] ALLOW $IP: valid Googlebot ($HOST)" >> "$LOG"
  exit 0
else
  echo "[$(date)] DENY $IP: mismatch ($HOST)" >> "$LOG"
  exit 1
fi

host कमांड का उपयोग नहीं करने का कारण यह है कि यह एक सार्वभौमिक कमांड नहीं है। Debian-आधारित प्रणालियों में, यह bind-utils में शामिल प्रतीत होता है, लेकिन मैं getent hosts से PTR रिकॉर्ड प्राप्त करता हूँ, जिसका उपयोग glibc स्थापित होने पर किया जा सकता है।
[SOLVED] Host command / Newbie Corner / Arch Linux Forums

पुष्टि

इसे चलाकर देखें और पुष्टि करें कि यह Google बॉट IP के लिए 0 लौटाता है।

# sh /usr/local/bin/check_googlebot.sh 66.249.74.78
# echo $?
0

तो फिर एक अलग IP के साथ क्या होगा? चलिए अपने सर्वर का IP डालकर देखते हैं।

# sh /usr/local/bin/check_googlebot.sh 163.44.113.145
# echo $?
1

ऐसा लगता है कि यह सही ढंग से निर्णय ले रहा है।

fail2ban

fail2ban की ओर से इस फ़िल्टर को लागू करने के लिए पुनरारंभ (restart) करें।

service fail2ban restart
fail2ban-client status 

यह सुनिश्चित करने के लिए निम्नलिखित की जाँच करें कि हाल के IP में Google IP को गलती से बैन नहीं किया गया है।

# fail2ban-client status fake-googlebot
Status for the jail: fake-googlebot
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/nginx/access.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

मेरे अपने सर्वर IP के साथ निष्पादन का लॉग अभी भी बचा हुआ है, लेकिन लॉग में Google बॉट्स का सही ढंग से निर्णय लिया गया प्रतीत होता है।

# tail /var/log/check_googlebot.log 
[Sun Apr 19 01:58:18 JST 2026] ALLOW 66.249.74.65: valid Googlebot (crawl-66-249-74-65.googlebot.com)
[Sun Apr 19 01:58:18 JST 2026] ALLOW 66.249.74.78: valid Googlebot (crawl-66-249-74-78.googlebot.com)
[Sun Apr 19 01:58:18 JST 2026] ALLOW 66.249.74.64: valid Googlebot (crawl-66-249-74-64.googlebot.com)
[Sun Apr 19 01:58:18 JST 2026] ALLOW 66.249.74.64: valid Googlebot (crawl-66-249-74-64.googlebot.com)
[Sun Apr 19 01:58:19 JST 2026] ALLOW 66.249.74.64: valid Googlebot (crawl-66-249-74-64.googlebot.com)[Sun Apr 19 01:58:19 JST 2026] ALLOW 66.249.74.78: valid Googlebot (crawl-66-249-74-78.googlebot.com)
[Sun Apr 19 01:58:19 JST 2026] ALLOW 66.249.74.64: valid Googlebot (crawl-66-249-74-64.googlebot.com)
[Sun Apr 19 01:58:19 JST 2026] ALLOW 66.249.74.78: valid Googlebot (crawl-66-249-74-78.googlebot.com)
[Sun Apr 19 03:56:30 JST 2026] ALLOW 66.249.74.78: valid Googlebot (crawl-66-249-74-78.googlebot.com)
[Sun Apr 19 03:58:18 JST 2026] DENY 163.44.113.145: invalid domain (v163-44-113-145.v1i0.static.cnode.jp)

हालांकि, इस मामले में, चूंकि Googlebot से हर बार अनुरोध आने पर PTR रिकॉर्ड पूछताछ की जाएगी, इसलिए पूछताछ करने से पहले ALLOW वाले IP के लिए बिना पूछताछ किए उन्हें अनुमति देने जैसा छद्म-कैश (pseudo-cache) बनाना बेहतर होगा।

Related Posts