2026年11月12日
2026年11月12日
تقييد الوصول حسب الدولة في Nginx باستخدام GeoIP2 وGeoLite2
هذه المقالة نسخة مُوطَّنة من الأصل الياباني. اقرأ الأصل الياباني
لتقييد الوصول حسب الدولة في Nginx، استخدم وحدة GeoIP2 (ngx_http_geoip2_module) مع قاعدة بيانات GeoLite2 من MaxMind، ثم ضع رمز الدولة في متغيّر داخل كتلة geoip2 وقرّر السماح أو الرفض عبر map. هذه هي الطريقة المعتمدة حتى نوفمبر 2026. أما الطريقة القديمة المنتشرة في المقالات العتيقة، أي تنزيل ملف GeoLite بصيغة .dat عبر wget، فلم تعد تعمل لأن توزيع تلك البيانات توقف.
هذا ملخص النتيجة أولًا.
- وحدة
ngx_http_geoip_moduleالقديمة (GeoIP Legacy) لا تصلح للإعدادات الجديدة لأن MaxMind أوقفت توزيع البيانات بالصيغة القديمة. انتقل إلى GeoIP2 (صيغة.mmdb). - GeoLite2 مجانية، لكنها تتطلب حسابًا لدى MaxMind ومفتاح ترخيص، ويجري التنزيل والتحديث عبر
geoipupdate. - في Nginx تُنشئ بكتلة
geoip2متغيّرًا مثل$geoip2_country_code، ثم تحدد بـmapالقيمة 0 أو 1 المقابلة لـallow/deny، وتُرجعreturn 403داخلlocation. - إذا كان موقعك خلف CDN مثل Cloudflare فيجب أولًا استعادة عنوان IP الحقيقي للزائر بـ
real_ip_header، وإلا اعتُبر كل الزوار من دولة الـ CDN. - التقييد حسب الدولة إجراء مساعد يقلّل الهجمات، ويمكن الالتفاف عليه بـ VPN أو الوسطاء. من الواقعي استخدامه لصفحة تسجيل الدخول ولوحة التحكم فقط، لا للصفحات العامة كلها.
الفرق بين geoip القديمة وGeoIP2
| البند | ngx_http_geoip_module (القديمة) | ngx_http_geoip2_module (GeoIP2) |
|---|---|---|
| صيغة البيانات | GeoIP Legacy (.dat) |
GeoIP2 (.mmdb) |
| توفير البيانات المجانية | انتهى (توقف التوزيع عام 2019) | GeoLite2 (يتطلب حسابًا ومفتاح ترخيص) |
| المكتبة المطلوبة | libGeoIP | libmaxminddb |
| الحصول على الوحدة | مضمّنة في Nginx (--with-http_geoip_module) |
وحدة من طرف ثالث leev/ngx_http_geoip2_module. تتوفر كحزمة في Debian / Ubuntu |
| المتغيّرات | ثابتة مثل $geoip_country_code |
تسمّيها بنفسك في كتلة geoip2 |
إذا كانت إعداداتك الحالية تستخدم geoip_country فقاعدة البيانات لديك متوقفة عن التحديث ونتائج الفحص قديمة. انتقل إلى GeoIP2 في هذه المناسبة.
الخطوة 1: التسجيل لدى MaxMind وإنشاء مفتاح الترخيص
- أنشئ حسابًا مجانيًا من صفحة GeoLite2 لدى MaxMind.
- بعد تسجيل الدخول، أنشئ License Key من صفحة إدارة الحساب (يظهر المفتاح عند إنشائه فقط، فاحفظه).
- إذا كنت تحتاج الدولة فقط فاستخدم قاعدة
GeoLite2-Country، وإذا احتجت المدينة فاستخدمGeoLite2-City. التقييد حسب الدولة يكفيه Country.
تتضمن شروط الاستخدام (GeoLite2 End User License Agreement) قواعد بشأن إعادة توزيع البيانات وعرضها. استخدامها داخل خادمك لأغراض الفحص يقع عادةً ضمن النطاق المسموح، لكن راجع الشروط عند التسجيل.
الخطوة 2: جلب قاعدة البيانات وتحديثها بـ geoipupdate
تُحدَّث GeoLite2 بانتظام، لذا استخدم geoipupdate بدل التنزيل اليدوي (وثائق geoipupdate).
# Debian / Ubuntu
sudo apt install geoipupdate
# عائلة RHEL (AlmaLinux / Rocky Linux) من مستودع EPEL
sudo dnf install geoipupdate
اكتب معرّف الحساب ومفتاح الترخيص في ملف الإعداد /etc/GeoIP.conf.
AccountID 123456
LicenseKey المفتاح الذي أنشأته
EditionIDs GeoLite2-Country
# مسار الحفظ هو الافتراضي في التوزيعة (Debian / Ubuntu: /var/lib/GeoIP، وغيرها غالبًا /usr/share/GeoIP).
# لتغييره استخدم DatabaseDirectory /var/lib/GeoIP
sudo geoipupdate -v
ls -l /var/lib/GeoIP/ # إذا ظهر GeoLite2-Country.mmdb فقد نجحت العملية
تتضمن حزمة geoipupdate عادةً إعدادًا للتشغيل الدوري عبر مؤقّت systemd أو cron (تحقق بـ systemctl list-timers | grep geoip). وإن لم يوجد فأضف مهمة cron مرة أسبوعيًا تقريبًا.
الخطوة 3: تثبيت وحدة GeoIP2 في Nginx
Debian / Ubuntu (Nginx من apt)
sudo apt install libnginx-mod-http-geoip2
ls /etc/nginx/modules-enabled/ # سيُوضع الملف 50-mod-http-geoip2.conf
nginx -t
Nginx من حزم nginx.org أو المبني من المصدر
ثبّت libmaxminddb، ثم ابنِ الوحدة الديناميكية من مصدر Nginx بالإصدار نفسه الذي يعمل لديك.
sudo apt install libmaxminddb-dev # في عائلة RHEL استخدم libmaxminddb-devel
cd /usr/local/src
git clone https://github.com/leev/ngx_http_geoip2_module
curl -LO https://nginx.org/download/nginx-1.26.3.tar.gz # اجعل الإصدار مطابقًا لناتج nginx -v
tar xzf nginx-1.26.3.tar.gz && cd nginx-1.26.3
./configure --with-compat --add-dynamic-module=../ngx_http_geoip2_module
make modules
sudo cp objs/ngx_http_geoip2_module.so /etc/nginx/modules/
حمّلها في أعلى nginx.conf (في الحزم الجاهزة تُضاف تلقائيًا).
load_module modules/ngx_http_geoip2_module.so;
الخطوة 4: وضع رمز الدولة في متغيّر وتحديد السماح والرفض
اكتب هذا داخل كتلة http. تضع كتلة geoip2 رمز الدولة في متغيّر، ثم تعطي map القيمة 1 للدول المسموح بها و0 لغيرها.
http {
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_country_code country iso_code;
}
# الدول المسموح لها بلوحة التحكم (رمز من حرفين حسب ISO 3166-1)
map $geoip2_country_code $admin_allowed {
default 0;
JP 1;
"" 1; # ما لا يمكن تحديده (مثل عناوين IP الخاصة) مسموح. اجعله 0 إن أردت رفضه
}
}
تحدد auto_reload الفاصل الزمني الذي تُعاد فيه قراءة قاعدة البيانات التي استبدلها geoipupdate دون إعادة تشغيل الخادم.
الخطوة 5: تقييد صفحة تسجيل الدخول ولوحة تحكم WordPress فقط
هذا مثال لا يقيّد الصفحات العامة، بل يقيّد wp-login.php و/wp-admin/ حسب الدولة فقط. اكتبه داخل كتلة server.
server {
# ... الإعدادات الحالية ...
location = /wp-login.php {
if ($admin_allowed = 0) { return 403; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ^~ /wp-admin/ {
if ($admin_allowed = 0) { return 403; }
# إذا كانت إضافة خارجية تستخدم admin-ajax.php فاسمح به في location منفصل
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
}
الجمع بين if وreturn صيغة يتعامل معها Nginx بأمان. أما /wp-admin/admin-ajax.php فقد تستدعيه وظائف الصفحات العامة (مثل النماذج والتمرير اللانهائي) دون تسجيل دخول، فقرّر إن كنت ستستثنيه من التقييد بحسب وظائف موقعك.
التطبيق والتحقق:
sudo nginx -t && sudo systemctl reload nginx
# من دولتك: يُعاد 200 أو 302
curl -sI https://example.com/wp-login.php | head -1
# للتحقق من الفحص (مثال لإظهار رمز الدولة في السجل)
# log_format geo '$remote_addr $geoip2_country_code "$request" $status';
للتحقق من الشكل الذي يراه الزائر من الخارج، افتح wp-login.php عبر VPN في دولة أجنبية أو عبر خدمة مراقبة خارج البلد، وتأكد من ظهور 403.
عند استخدام CDN (مثل Cloudflare)
عبر الـ CDN يصبح $remote_addr هو عنوان IP للـ CDN، فيُفحص الجميع على أنهم من دولة الـ CDN. استعِد أولًا عنوان IP الحقيقي للزائر بـ ngx_http_realip_module (وحدة realip).
# مثال Cloudflare. حدّث قائمة عناوين IP دوريًا من IP Ranges الرسمية لدى Cloudflare
set_real_ip_from 173.245.48.0/20;
# ... اذكر جميع نطاقات Cloudflare ...
real_ip_header CF-Connecting-IP;
تنظر geoip2 افتراضيًا إلى $remote_addr، فيُفحص العنوان الحقيقي بعد أن تستبدله realip. ولدى Cloudflare نفسها تحكم بالوصول حسب الدولة (قواعد WAF المخصصة)، فإذا كنت تستخدمها فتقييد الدولة من جهة Cloudflare أسهل في الإعداد من Nginx. راجع أيضًا إعداد Cloudflare لـ WordPress.
حدود التقييد حسب الدولة
- الفحص بـ GeoIP تقدير يعتمد على بيانات تسجيل عنوان IP، ويمكن الالتفاف عليه بـ VPN أو الوكلاء أو الوسطاء عبر خوادم سحابية أجنبية.
- في شبكات الجوال وشبكات الشركات قد يُنسب العنوان إلى دولة غير موقعك الفعلي. وقد تُحجب كذلك عن مدير الموقع أثناء سفره إلى الخارج.
- لذلك استخدم التقييد حسب الدولة إجراءً مساعدًا لتقليل محاولات تسجيل الدخول بالقوة الغاشمة، مع المصادقة الثنائية وتحديد عدد محاولات الدخول وحماية wp-admin بمصادقة Basic.
الأسئلة الشائعة
ما الفرق بين وحدتي geoip وgeoip2 في Nginx؟
تقرأ وحدة geoip القديمة بيانات بصيغة GeoIP Legacy (.dat) التي أوقفت MaxMind توزيعها. أما وحدة geoip2 (ngx_http_geoip2_module) فتقرأ الصيغة الحالية .mmdb وتعمل مع بيانات GeoLite2 المجانية. استخدم geoip2 في أي إعداد جديد.
هل GeoLite2 مجانية؟ وهل التسجيل مطلوب؟
هي مجانية، لكنها تتطلب حسابًا لدى MaxMind ومفتاح ترخيص. يجري التنزيل والتحديث الدوري عبر geoipupdate. أما الطريقة القديمة بالتنزيل المباشر دون مفتاح فلا تعمل.
هل يمنع التقييد حسب الدولة تسجيلات الدخول غير المشروعة في WordPress؟
يقلّل محاولات القوة الغاشمة، لكن لا يمكن القول إنه يمنعها لأن VPN والخوادم الأجنبية تتيح الالتفاف عليه. اجمعه مع تحديد عدد محاولات الدخول والمصادقة الثنائية ومصادقة Basic.
عند استخدام Cloudflare يظهر الجميع من الدولة نفسها
لأن مصدر الاتصال عبر الـ CDN هو عنوان IP للـ CDN. استعِد العنوان الحقيقي بـ set_real_ip_from وreal_ip_header CF-Connecting-IP ثم أجرِ الفحص. ويمكن أيضًا التقييد حسب الدولة في WAF لدى Cloudflare.
هل يمكن التقييد حتى المدينة باستخدام GeoLite2-City؟
يمكن وضع رموز المدينة أو المنطقة في متغيّرات أيضًا، لكن دقة مستوى المدينة أقل من الدولة، وتزداد احتمالات الخطأ الذي يحجب مستخدمين مشروعين. الأسلم أن تقتصر في التحكم بالوصول على مستوى الدولة.
الخلاصة
- يُنفَّذ التقييد حسب الدولة في Nginx حاليًا عبر GeoIP2 (ngx_http_geoip2_module مع GeoLite2 بصيغة
.mmdb)، وتُحدَّث البيانات بـgeoipupdate. - ضع رمز الدولة في متغيّر بـ
geoip2، وحدد السماح والرفض بـmap، وأرجِعreturn 403فيlocationالخاص بـwp-login.phpو/wp-admin/. - عند استخدام CDN استعِد عنوان IP الحقيقي أولًا، واعتبر التقييد حسب الدولة إجراءً مساعدًا يُستخدم مع المصادقة الثنائية وغيرها.
مقالات ذات صلة
- كيفية تقييد الوصول إلى REST API في WordPress
- إنشاء كلمة مرور مصادقة Basic في Apache بـ htpasswd | حماية wp-admin
- الدليل الكامل لإعداد Cloudflare مع WordPress
المراجع: ngx_http_geoip2_module (GitHub)، MaxMind GeoLite2 Free Geolocation Data، MaxMind – Updating Databases (geoipupdate)، Nginx ngx_http_realip_module
سجل التحديثات: 2026-11-09 مراجعة شاملة (استُبدلت خطوات GeoLite القديمة التي توقف توزيعها بخطوات GeoIP2 وgeoipupdate، وأُضيف مثال لتقييد لوحة تحكم WordPress وتنبيه بشأن CDN). تدير هذه المقالة WordPress Hakase (Lightscend Inc.).
لديك أسئلة حول WordPress؟ ناشر هذا الموقع موجود في اليابان ويرد باللغة اليابانية. تواصل معنا (باليابانية)