fail2ban ব্যবহার করে ক্ষতিকারক Googlebot-এর ছদ্মবেশধারী IP-গুলোকে রিভার্স লুকআপের মাধ্যমে ডায়নামিকভাবে ব্লক করা
হ্যালো, আমি মুনো।
গতবার
গুগল থেকে বট বলে দাবি করা রিকোয়েস্ট আইপি (IP) তদন্ত করা - অপব্যবহারসহ - SOULMINIGRIG
এখানে আমি নিশ্চিত করেছি যে গুগল হিসেবে ছদ্মবেশ ধারণ করে রিকোয়েস্ট করা আইপি গ্রুপের সংখ্যা বেশ ভালোই আছে।
কিন্তু এগুলো ব্লক করবেন কীভাবে? অর্থাৎ, fail2ban-এর মাধ্যমে এগুলো শনাক্ত করে একটি নির্দিষ্ট স্ক্রিপ্ট চালানো গেলেই হবে, আর নিচের এই ইস্যুতে তার একটি ইঙ্গিত পাওয়া গেছে।
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-এর ক্ষেত্রে, এক্সিকিউশনের সময় যদি একটি ফেইল স্ট্যাটাস কোড পাওয়া যায়, তবে সেটিকে ব্যান করার জন্য হ্যান্ডেল করা হয়।
অর্থাৎ, আর্গুমেন্ট হিসেবে আইপি অ্যাড্রেস দিয়ে এবং এক্সিকিউশন স্ট্যাটাস কোড গ্রহণ করে এটি নির্ধারণ করা সম্ভব যে সেটি ব্যান করা হবে নাকি স্কিপ করা হবে।
#!/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
# গুগল ডোমেইন কিনা যাচাই
case "$HOST" in
*.googlebot.com|*.google.com)
;;
*)
echo "[$(date)] DENY $IP: invalid domain ($HOST)" >> "$LOG"
exit 1
;;
esac
# ফরোয়ার্ড লুকআপ করে মূল আইপির সাথে মিল আছে কিনা যাচাই
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-এ অন্তর্ভুক্ত থাকে বলে মনে হয়, তবে glibc ইনস্টল করা থাকলে ব্যবহারযোগ্য getent hosts থেকে PTR রেকর্ড সংগ্রহ করা হয়েছে।
[SOLVED] Host command / Newbie Corner / Arch Linux Forums
যাচাইকরণ
পরীক্ষামূলকভাবে এটি চালিয়ে দেখুন এবং নিশ্চিত করুন যে গুগলের বটের আইপির ক্ষেত্রে এটি 0 রিটার্ন করছে।
# sh /usr/local/bin/check_googlebot.sh 66.249.74.78
# echo $?
0
তাহলে অন্য আইপি হলে কী হবে? পরীক্ষা করার জন্য আমার নিজের সার্ভারের আইপি দিয়ে দেখছি।
# sh /usr/local/bin/check_googlebot.sh 163.44.113.145
# echo $?
1
মনে হচ্ছে সঠিকভাবে কাজ করছে।
fail2ban
fail2ban-এ এই ফিল্টারটি কার্যকর করার জন্য রিস্টার্ট দিন।
service fail2ban restart
fail2ban-client status
নিচের কমান্ডের মাধ্যমে নিশ্চিত করুন যে সাম্প্রতিক আইপিগুলোর মধ্যে গুগলের আইপি ভুলবশত ব্যান হয়নি।
# 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:
ঠিক তার আগে নিজের সার্ভারের আইপি দিয়ে চালানোর লগ রয়ে গেছে, তবে লগে দেখা যাচ্ছে 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) মতো ব্যবস্থা করা ভালো হবে।