2026年11月12日
2026年11月12日
Nginx GeoIP2 से देश के अनुसार एक्सेस सीमित करें (WordPress एडमिन)
यह लेख जापानी मूल लेख का स्थानीयकृत संस्करण है। जापानी मूल लेख पढ़ें
Nginx में देश के अनुसार एक्सेस सीमित करने के लिए GeoIP2 मॉड्यूल (ngx_http_geoip2_module) और MaxMind का GeoLite2 डेटाबेस इस्तेमाल करें, geoip2 ब्लॉक में देश का कोड एक वेरिएबल में रखें और map से अनुमति या इनकार तय करें। नवंबर 2026 तक यही मौजूदा तरीका है। पुराने लेखों में बताया गया “GeoLite की .dat फ़ाइल wget से लेने” वाला तरीका अब काम नहीं करता, क्योंकि उस डेटा का वितरण बंद हो चुका है।
पहले निष्कर्ष संक्षेप में।
- पुराना
ngx_http_geoip_module(GeoIP Legacy) नई सेटिंग के लिए इस्तेमाल नहीं हो सकता, क्योंकि MaxMind ने पुराने फ़ॉर्मेट का डेटा बाँटना बंद कर दिया है। GeoIP2 (.mmdbफ़ॉर्मेट) पर जाएँ। - GeoLite2 मुफ़्त है, लेकिन इसके लिए MaxMind खाता और लाइसेंस कुंजी (License Key) ज़रूरी है। डाउनलोड और अपडेट
geoipupdateसे होता है। - Nginx में
geoip2ब्लॉक से$geoip2_country_codeजैसा वेरिएबल बनाएँ,mapसेallow/denyके बराबर 0 / 1 तय करें औरlocationमेंreturn 403दें। - जो साइट Cloudflare जैसे CDN के पीछे है, उसमें पहले
real_ip_headerसे विज़िटर का असली IP बहाल करें, वरना हर अनुरोध 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 पर पंजीकरण करें और लाइसेंस कुंजी बनाएँ
- MaxMind का GeoLite2 पेज खोलकर मुफ़्त खाता बनाएँ।
- लॉगिन के बाद खाते के प्रबंधन पेज में 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 में खाता ID और लाइसेंस कुंजी लिखें।
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: Nginx में GeoIP2 मॉड्यूल जोड़ें
Debian / Ubuntu (apt वाला Nginx)
sudo apt install libnginx-mod-http-geoip2
ls /etc/nginx/modules-enabled/ # 50-mod-http-geoip2.conf रखी जाती है
nginx -t
nginx.org के पैकेज या सोर्स से बने Nginx में
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 के 2 अक्षर के कोड)
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';
विदेश से साइट कैसी दिखती है, यह जाँचने के लिए किसी विदेशी लोकेशन के VPN या विदेश के मॉनिटरिंग सर्विस से wp-login.php खोलें और देखें कि 403 आता है।
CDN (Cloudflare आदि) के पीछे होने पर
CDN के रास्ते $remote_addr CDN का IP बन जाता है और सभी को CDN के देश का माना जाता है। पहले ngx_http_realip_module से विज़िटर का असली IP बहाल करें (realip मॉड्यूल)।
# Cloudflare का उदाहरण। IP सूची Cloudflare के आधिकारिक IP Ranges से नियमित रूप से अपडेट करें
set_real_ip_from 173.245.48.0/20;
# ... Cloudflare की सभी रेंज यहाँ लिखें ...
real_ip_header CF-Connecting-IP;
geoip2 डिफ़ॉल्ट रूप से $remote_addr देखता है, इसलिए realip से बदले जाने के बाद वाले असली IP से जाँच होती है। Cloudflare में खुद भी देश के आधार पर एक्सेस रोकने की सुविधा है (WAF के कस्टम रूल), इसलिए अगर आप Cloudflare इस्तेमाल करते हैं तो Nginx की जगह Cloudflare की तरफ़ से रोक लगाना सेटअप में आसान है। WordPress में Cloudflare सेट करना भी देखें।
देश के आधार पर रोक की सीमाएँ
- GeoIP की जाँच IP पते की पंजीकरण जानकारी पर आधारित अनुमान है, और VPN, प्रॉक्सी या विदेशी क्लाउड से रिले करके इसे पार किया जा सकता है।
- मोबाइल नेटवर्क और कंपनी नेटवर्क में असली जगह से अलग देश दिख सकता है। विदेश यात्रा पर गए एडमिन के बाहर रह जाने जैसी संचालन की समस्या भी होती है।
- इसलिए देश के आधार पर रोक को लॉगिन के ब्रूट-फ़ोर्स प्रयास घटाने की सहायक व्यवस्था की तरह, 2-फ़ैक्टर ऑथेंटिकेशन, लॉगिन प्रयासों की सीमा और Basic ऑथेंटिकेशन से wp-admin की सुरक्षा के साथ मिलाकर इस्तेमाल करें।
अक्सर पूछे जाने वाले सवाल
Nginx के geoip मॉड्यूल और geoip2 मॉड्यूल में क्या अंतर है
पुराना geoip मॉड्यूल GeoIP Legacy फ़ॉर्मेट (.dat) का डेटा पढ़ता है, पर MaxMind इस फ़ॉर्मेट का वितरण बंद कर चुका है। geoip2 मॉड्यूल (ngx_http_geoip2_module) मौजूदा .mmdb फ़ॉर्मेट पढ़ता है और GeoLite2 का मुफ़्त डेटा इस्तेमाल कर सकता है। नई सेटिंग geoip2 से ही करें।
क्या GeoLite2 मुफ़्त है? क्या पंजीकरण ज़रूरी है
यह मुफ़्त है, लेकिन MaxMind खाता और लाइसेंस कुंजी ज़रूरी है। डाउनलोड और नियमित अपडेट geoipupdate से होता है। कुंजी के बिना सीधे डाउनलोड करने वाला पुराना तरीका काम नहीं करता।
क्या देश के आधार पर रोकने से WordPress में अवैध लॉगिन रुक जाते हैं
ब्रूट-फ़ोर्स प्रयास कम होते हैं, पर VPN या विदेशी सर्वर से रिले करके इसे पार किया जा सकता है, इसलिए यह नहीं कहा जा सकता कि इससे अवैध लॉगिन रुक जाते हैं। इसे लॉगिन प्रयासों की सीमा, 2-फ़ैक्टर ऑथेंटिकेशन और Basic ऑथेंटिकेशन आदि के साथ मिलाकर इस्तेमाल करें।
Cloudflare इस्तेमाल करने पर सभी एक ही देश के क्यों दिखते हैं
क्योंकि CDN के रास्ते कनेक्शन का स्रोत CDN का IP होता है। जाँच से पहले set_real_ip_from और real_ip_header CF-Connecting-IP से असली IP बहाल करें। Cloudflare के WAF से देश के आधार पर रोकने का तरीका भी है।
क्या GeoLite2-City से शहर तक की रोक लग सकती है
शहर और क्षेत्र के कोड भी वेरिएबल में रखे जा सकते हैं, पर शहर स्तर की सटीकता देश से कम है और ग़लत जाँच से वैध उपयोगकर्ता बाहर रह जाने का जोखिम बढ़ता है। एक्सेस कंट्रोल के लिए देश के स्तर तक ही रहना सुरक्षित है।
सारांश
- Nginx में देश के अनुसार रोक अब GeoIP2 (ngx_http_geoip2_module + GeoLite2
.mmdb) से की जाती है, और डेटाgeoipupdateसे अपडेट होता है। geoip2से देश का कोड वेरिएबल में रखें,mapसे अनुमति या इनकार तय करें, औरwp-login.phpतथा/wp-admin/केlocationमेंreturn 403दें।- CDN के पीछे हों तो पहले असली IP बहाल करें, और देश के आधार पर रोक को 2-फ़ैक्टर ऑथेंटिकेशन जैसे उपायों के साथ सहायक व्यवस्था की तरह इस्तेमाल करें।
संबंधित लेख
- WordPress के REST API तक पहुँच को सीमित करने का तरीका
- htpasswd से Apache के Basic ऑथेंटिकेशन का पासवर्ड बनाने का तरीका | wp-admin की सुरक्षा
- WordPress में Cloudflare सेट करने की पूरी गाइड
संदर्भ: 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 के बारे में सवाल हैं? इस साइट के प्रकाशक जापान में हैं और जापानी में जवाब देते हैं। संपर्क (जापानी)