دسته بندی:

آموزش نصب GeoIP در سی پنل

GeoIP یک سرویس آنلاین نیست؛ یک پایگاه دادهٔ آفلاین است که هر آدرس آی‌پی را به کشور، شهر و شبکهٔ صاحب آن نگاشت می‌کند. برای راه‌اندازی آن روی سرور cPanel باید سه چیز را کنار هم بگذارید: کتابخانهٔ خواندن فرمت جدید (libmaxminddb)، پایگاه دادهٔ GeoLite2 شرکت MaxMind و یک زمان‌بند برای به‌روز نگه داشتن آن.

اگر دنبال روش قدیمی «دانلود custom_opt_mod-mod_geoip و کامپایل با EasyApache 3» هستید، آن مسیر سال‌هاست کاملاً از کار افتاده است. در ادامه دقیقاً می‌بینید چرا، و جایگزین امروزی‌اش چیست.

GeoIP روی سرور چه کاری انجام می‌دهد؟

کار GeoIP فقط یک چیز است: می‌گوید یک آی‌پی مشخص احتمالاً به کدام کشور، شهر یا شبکه تعلق دارد. کاربرد رایج آن روی سرورهای میزبانی وب، نمایش محتوای متفاوت به بازدیدکنندگان داخلی و خارجی، ثبت کشور در لاگ‌ها، محدود کردن ورود به بخش مدیریت و گزارش‌های ضدتقلب است. مسدودسازی ترافیک یک کشور هم بر پایهٔ همین داده انجام می‌شود، اما بحث جداگانه‌ای است. همهٔ این کارها به نصب بسته و تغییر پیکربندی در سطح سرور نیاز دارند؛ به همین دلیل روی هاست لینوکس اشتراکی که مدیریت سرور در اختیار شما نیست، چنین کاری ممکن نخواهد بود.

چرا روش EasyApache 3 دیگر جواب نمی‌دهد

دو تغییر بزرگ رخ داده است. اول اینکه EasyApache 3 و اسکریپت /scripts/easyapache از cPanel حذف شده‌اند و امروز همه‌چیز با EasyApache 4 و بسته‌های RPM مدیریت می‌شود؛ مسیر /var/cpanel/easy/apache/custom_opt_mods/ اصلاً وجود ندارد و لینک دانلود آن ماژول هم مرده است.

دوم و مهم‌تر: MaxMind فرمت قدیمی GeoIP.dat را بازنشسته کرد و به‌روزرسانی نسخه‌های رایگان آن را متوقف نمود. بسته‌ای که هنوز در مخازن لینوکس با نام GeoIP-GeoLite-data وجود دارد، دادهٔ سال ۲۰۱۸ را حمل می‌کند؛ یعنی اگر ماژول قدیمی را هم به‌زور کامپایل کنید، پاسخ‌تان بر پایهٔ نقشه‌ای هشت‌ساله است. فرمت جایگزین .mmdb نام دارد (GeoIP2 / GeoLite2) و از پایان سال ۲۰۱۹ دانلود آن نیازمند یک حساب رایگان MaxMind و یک کلید لایسنس است.

پیش‌نیازها

به دسترسی root نیاز دارید؛ یعنی سروری که سیستم‌عامل آن در اختیار خودتان است. علاوه بر آن باید در سایت MaxMind یک حساب رایگان بسازید و از بخش مدیریت حساب یک License Key تولید کنید؛ شناسهٔ حساب (Account ID) و همین کلید، ورودی‌های مرحلهٔ بعد هستند. سرور هم باید به سرورهای MaxMind دسترسی داشته باشد. اگر هنوز چنین سروری ندارید، یک سرور مجازی ابری یا یک سرور اختصاصی، بستر مناسبی برای این کار است.

گام ۱: نصب کتابخانه و ابزار خط فرمان

کتابخانهٔ خواندن فرمت جدید در مخازن استاندارد توزیع موجود است و ابزار mmdblookup را هم به همراه دارد:

dnf install libmaxminddb

روی توزیع‌های قدیمی‌تر همین دستور با yum هم کار می‌کند، اما حواس‌تان باشد که CentOS 7 از سال ۲۰۲۴ به پایان پشتیبانی رسیده و cPanel هم دیگر آن را پشتیبانی نمی‌کند؛ برای سرور تولیدی روی نسخه‌های امروزی مثل AlmaLinux یا CloudLinux بروید. این بسته هیچ تداخلی با cPanel ندارد.

گام ۲: نصب geoipupdate و گرفتن پایگاه داده

ابزار رسمی دانلود و به‌روزرسانی پایگاه داده geoipupdate نام دارد و در مخازن cPanel یا CloudLinux وجود ندارد؛ بستهٔ آمادهٔ آن را از صفحهٔ Releases مخزن رسمی پروژه در گیت‌هاب MaxMind متناسب با معماری و توزیع سرور خود بگیرید. سپس فایل /etc/GeoIP.conf را بسازید یا ویرایش کنید:

AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City GeoLite2-ASN
DatabaseDirectory /usr/share/GeoIP

چون این فایل کلید لایسنس دارد دسترسی آن را ببندید (chmod 600 /etc/GeoIP.conf) و سپس اجرا کنید:

geoipupdate -v

در پایان باید فایل‌های GeoLite2-Country.mmdb و GeoLite2-City.mmdb در مسیر /usr/share/GeoIP/ ساخته شده باشند.

گام ۳: به‌روزرسانی خودکار — این مرحله را رد نکنید

پایگاه دادهٔ GeoIP سریع کهنه می‌شود؛ رنج‌های آی‌پی مدام بین اپراتورها جابه‌جا و دوباره تخصیص داده می‌شوند. MaxMind نسخه‌های تازهٔ GeoLite2 را دو بار در هفته — سه‌شنبه و جمعه — منتشر می‌کند، بنابراین یک کران هفتگی نیمی از به‌روزرسانی‌ها را از دست می‌دهد. با crontab -e خطی مانند این اضافه کنید تا چهارشنبه‌ها و شنبه‌ها اجرا شود:

17 4 * * 3,6 /usr/bin/geoipupdate

خود geoipupdate پیش از دانلود، نسخهٔ فایل محلی را با نسخهٔ موجود روی سرور MaxMind مقایسه می‌کند و اگر چیزی تغییر نکرده باشد فایل را دوباره نمی‌گیرد؛ با این حال حساب‌های رایگان سقف روزانه برای تعداد دانلود دارند، پس اجرای هر چند دقیقه یک بار بی‌فایده است.

گام ۴: اگر ماژول آپاچی لازم دارید

برای بیشتر کاربردها ابزار خط فرمان و کتابخانهٔ زبان برنامه‌نویسی کافی است. اما اگر می‌خواهید خود آپاچی کشور بازدیدکننده را در متغیرهای محیطی قرار دهد، ماژول امروزی mod_maxminddb است، نه mod_geoip که دیگر توسعه داده نمی‌شود.

هشدار مهم: روی سرور cPanel دستور dnf install mod_maxminddb را از مخزن EPEL اجرا نکنید. آن بسته به آپاچی استاندارد توزیع وابسته است و نصبش بستهٔ httpd سیستمی را وارد سرور می‌کند که با آپاچی EasyApache 4 تداخل دارد و می‌تواند وب‌سرور را از کار بیندازد. راه درست، کامپایل ماژول در برابر خود EasyApache 4 است:

dnf install ea-apache24-devel libmaxminddb-devel gcc make

سپس سورس mod_maxminddb را از مخزن رسمی MaxMind بگیرید و با apxs همان EasyApache (مسیر /usr/bin/apxs) بسازید تا ماژول در /etc/apache2/modules/ قرار بگیرد. این کار روی سرور زنده ریسک دارد؛ اگر ترجیح می‌دهید خودتان دست نزنید، لایسنس cPanel آنلاین سرور با نصب و کانفیگ اولیهٔ رایگان ارائه می‌شود.

فایل /etc/apache2/conf/httpd.conf در cPanel خودکار بازتولید می‌شود و ویرایش مستقیم آن بی‌فایده است. خط LoadModule و تنظیمات را در فایل /etc/apache2/conf.d/includes/pre_main_global.conf بگذارید تا پس از هر بازسازی EasyApache باقی بماند:

MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code

بعد از هر تغییر، اول پیکربندی را تست و سپس سرویس را ری‌استارت کنید: /usr/sbin/apachectl configtest و در صورت سالم بودن /scripts/restartsrv_httpd.

چطور مطمئن شویم کار می‌کند؟

ساده‌ترین تست، همان ابزار خط فرمان است:

mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 8.8.8.8 country iso_code

خروجی باید کد دوحرفی کشور را نشان دهد. اگر با روش قدیمی و بازکامپایل آپاچی آشنا هستید، مقایسهٔ آن با نسل امروزی را در آموزش کانفیگ آپاچی با EasyApache می‌بینید. برای ماژول آپاچی هم با /usr/sbin/apachectl -M | grep maxminddb بررسی کنید ماژول بارگذاری شده باشد و سپس در یک اسکریپت آزمایشی مقدار متغیر MM_COUNTRY_CODE را چاپ کنید.

به دقت GeoIP بیش از حد تکیه نکنید

این نکته را جدی بگیرید: GeoIP یک حدس آماری است، نه واقعیت. تشخیص کشور معمولاً قابل اتکاست، اما تشخیص شهر به‌مراتب لغزنده‌تر است. کاربران VPN با کشور سرور خروجی شناخته می‌شوند، آی‌پی‌های اپراتورهای موبایل اغلب به مرکز استان یا حتی شهری دیگر نگاشت می‌شوند، و آی‌پی‌های ابری تقریباً همیشه با کشور ثبت‌کنندهٔ رنج شناخته می‌شوند نه محل فیزیکی ماشین؛ مثلاً یک سرور ابری هتزنر که در لوکیشن سنگاپور ساخته شده، ممکن است در بسیاری از سرویس‌های تشخیص موقعیت «آلمان» نمایش داده شود، چون مالک آن رنج یک شرکت آلمانی است. پس GeoIP را برای شخصی‌سازی محتوا و تحلیل آمار به کار ببرید، اما هرگز آن را تنها لایهٔ کنترل دسترسی یا احراز هویت قرار ندهید.

خطاهای رایجی که وقت‌تان را می‌گیرد

  • خطای احراز هویت هنگام اجرای geoipupdate: معمولاً یعنی Account ID و License Key جابه‌جا یا ناقص وارد شده‌اند، یا کلید از نوع دیگری ساخته شده است.
  • فایل mmdb ساخته می‌شود اما آپاچی آن را نمی‌خواند: اغلب مسئلهٔ مجوز دسترسی است؛ کاربر آپاچی باید حق خواندن مسیر و فایل را داشته باشد. اگر SELinux فعال است، برچسب فایل را هم بررسی کنید.
  • افزونهٔ قدیمی geoip در PHP: این افزونه فقط فرمت .dat را می‌خواند و عملاً منسوخ است. در پروژه‌های PHP امروزی به‌جای آن از کتابخانهٔ رسمی GeoIP2 استفاده کنید که مستقیماً فایل .mmdb را می‌خواند.
  • کاربران فایروال CSF: قابلیت‌های مبتنی بر کشور در CSF هم به همین دادهٔ MaxMind وابسته‌اند و بدون وارد کردن کلید لایسنس در فایل پیکربندی آن کار نخواهند کرد؛ اگر هنوز این فایروال را ندارید راهنمای نصب فایروال CSF را ببینید و برای استفاده از آن در مسدودسازی کشوری آموزش بلاک کردن آی‌پی یک منطقه با GeoIP را دنبال کنید.

و یک نکتهٔ معماری برای پایان: اگر هدف‌تان هدایت کاربران هر منطقه به نزدیک‌ترین سرور است، انجام آن در لایهٔ وب‌سرور کار درستی نیست، چون کاربر باید اول به سرور اشتباه برسد. این کار در لایهٔ DNS و با مسیریابی جغرافیایی دامنه تمیزتر و سریع‌تر انجام می‌شود و بار اضافه‌ای هم به آپاچی تحمیل نمی‌کند.