2026年11月12日
2026年11月12日
WordPress में Cloudflare सेट करें: नेमसर्वर, SSL, असली IP और WAF
यह लेख जापानी मूल लेख का स्थानीयकृत संस्करण है। जापानी मूल लेख पढ़ें
WordPress में Cloudflare जोड़ने का काम इस क्रम में होता है: (1) Cloudflare में साइट जोड़कर डोमेन के नेमसर्वर बदलना, (2) SSL/TLS एन्क्रिप्शन मोड को Full (strict) करना, (3) सर्वर की तरफ़ विज़िटर का असली IP बहाल करना, (4) WAF के कस्टम रूल से लॉगिन पेज की रक्षा करना। फ़्री प्लान में भी CDN, SSL, DDoS सुरक्षा और कस्टम रूल (5 तक) मिलते हैं।
इस लेख में हर सेटिंग और बदलाव के बाद जाँचने की बातें बताई गई हैं। Cloudflare की स्क्रीन के नाम और जगहें बदलती रहती हैं, इसलिए यहाँ नवंबर 2026 के आधिकारिक दस्तावेज़ (developers.cloudflare.com) के आधार पर लिखा गया है।
काम शुरू करने से पहले तय करने की बातें
- DNS का प्रबंधन Cloudflare को सौंपना होगा। डोमेन जहाँ रजिस्टर है (रजिस्ट्रार) वह नहीं बदलता, पर DNS रिकॉर्ड अब Cloudflare की स्क्रीन में एडिट होंगे।
- ईमेल के DNS रिकॉर्ड (MX आदि) को प्रॉक्सी न करें। Cloudflare से सिर्फ़ वेब का ट्रैफ़िक (HTTP/HTTPS) गुज़रता है।
- ओरिजिन (जिस सर्वर पर WordPress रखा है) पर वैध SSL प्रमाणपत्र होना चाहिए। अगर Let's Encrypt आदि से HTTPS पहले से चल रहा है तो वैसा ही रहने दें।
- अगर रजिस्ट्रार की तरफ़ DNSSEC चालू है, तो नेमसर्वर बदलने से पहले उसे बंद करें। पुराना DS रिकॉर्ड रह गया तो नेम रेज़ोल्यूशन विफल हो जाएगा।
चरण 1: साइट जोड़ें और नेमसर्वर बदलें
- Cloudflare का खाता बनाएँ और डैशबोर्ड में डोमेन जोड़ें। प्लान में Free चुन सकते हैं।
- Cloudflare मौजूदा DNS रिकॉर्ड पढ़कर सूची बनाता है; देखें कि कुछ छूटा तो नहीं। कुछ रिकॉर्ड पढ़े नहीं जा पाते, इसलिए मौजूदा DNS प्रबंधन स्क्रीन से मिलाकर जो कम हो उसे हाथ से जोड़ें।
- वेबसाइट के
A(याAAAA,CNAME) रिकॉर्ड में प्रॉक्सी स्टेटस चालू (नारंगी बादल) रखें।MXऔर मेल सर्वर वालेAरिकॉर्ड को बंद (सिर्फ़ DNS, स्लेटी बादल) रखें। - Cloudflare दो नेमसर्वर नाम दिखाता है। नाम
〇〇.ns.cloudflare.comजैसे होते हैं और हर खाते को अलग मिलते हैं। दूसरे लेखों में लिखे नामों की जगह अपनी स्क्रीन पर दिखे दो नाम ही इस्तेमाल करें। - डोमेन के रजिस्ट्रार की प्रबंधन स्क्रीन में नेमसर्वर इन्हीं दो में बदल दें।
बदलाव हुआ या नहीं, यह नीचे की कमांड से जाँचें। असर दिखने में कुछ घंटे लग सकते हैं।
# नेमसर्वर Cloudflare के दो नेमसर्वर बन गए हैं या नहीं
dig NS example.com +short
# Cloudflare से गुज़र रहा है या नहीं (server: cloudflare और cf-ray लौटते हैं)
curl -sI https://example.com | grep -iE '^(server|cf-ray):'
Cloudflare की स्क्रीन में डोमेन की स्थिति सक्रिय (Active) हो जाए तो बदलाव पूरा है।
चरण 2: SSL/TLS को Full (strict) करें
Cloudflare के SSL/TLS में ऐसे मोड होते हैं जो तय करते हैं कि विज़िटर और Cloudflare के बीच, और Cloudflare और ओरिजिन के बीच एन्क्रिप्शन कैसे हो।
| मोड | Cloudflare और ओरिजिन के बीच | WordPress में कैसे लें |
|---|---|---|
| Off | एन्क्रिप्शन नहीं | इस्तेमाल न करें |
| Flexible | HTTP (एन्क्रिप्शन नहीं) | इस्तेमाल न करें। रीडायरेक्ट लूप और मिश्रित कंटेंट (mixed content) का कारण बनता है |
| Full | HTTPS (प्रमाणपत्र की जाँच नहीं) | प्रमाणपत्र तैयार होने तक की अस्थायी व्यवस्था |
| Full (strict) | HTTPS (प्रमाणपत्र की जाँच होती है) | यही चुनें |
सेटिंग Cloudflare डैशबोर्ड के SSL/TLS के अवलोकन (Overview) पेज पर बदली जाती है। डिफ़ॉल्ट “Automatic SSL/TLS” ओरिजिन जितना सहारा दे, उस दायरे में सुरक्षित मोड अपने-आप चुनता है। खुद Full (strict) चुन देने पर कोई अनचाहा मोड नहीं चलता। ओरिजिन का प्रमाणपत्र किसी सार्वजनिक प्रमाणन प्राधिकरण (Let's Encrypt आदि) का हो सकता है, या Cloudflare का जारी किया हुआ Origin CA प्रमाणपत्र।
Flexible से बचने का कारण यह है। Flexible में अनुरोध ओरिजिन तक HTTP से पहुँचता है, इसलिए WordPress या सर्वर जवाब देता है कि “HTTP से आया है, HTTPS पर भेजो”, और Cloudflare फिर से HTTP से ओरिजिन तक जाता है। यह चक्र चलता रहता है (ब्राउज़र में ERR_TOO_MANY_REDIRECTS दिखता है)। Full (strict) में ओरिजिन तक भी HTTPS से पहुँचा जाता है, इसलिए WordPress की तरफ़ X-Forwarded-Proto देखकर $_SERVER['HTTPS'] बदलने जैसा अतिरिक्त कोड नहीं चाहिए।
साथ ही WordPress के “सेटिंग्स” (Settings) → “सामान्य” (General) में “वर्डप्रेस पता (URL)” (WordPress Address (URL)) और “साइट का पता (URL)” (Site Address (URL)) https:// से शुरू होने चाहिए। अगर तस्वीरें आदि अब भी http:// पर रह गई हैं, तो मिश्रित कंटेंट ठीक करने का तरीका देखें।
चरण 3: विज़िटर का असली IP बहाल करें
Cloudflare से गुज़ारने पर सर्वर तक पहुँचने वाला कनेक्शन-स्रोत (REMOTE_ADDR) Cloudflare का IP पता बन जाता है। ऐसे में एक्सेस लॉग, कमेंट का IP और लॉगिन प्रयासों की सीमा लगाने वाले प्लगइन आदि सभी विज़िटरों को Cloudflare का IP मान लेते हैं। Cloudflare विज़िटर का IP CF-Connecting-IP हेडर में भेजता है, इसलिए कनेक्शन का स्रोत Cloudflare होने पर ही उस हेडर पर भरोसा करने की सेटिंग करें।
अगर स्रोत जाँचे बिना हेडर के मान से REMOTE_ADDR बदल दिया जाए, तो Cloudflare को बायपास करके सीधे ओरिजिन तक आने वाला कोई भी व्यक्ति हेडर में अपनी मर्ज़ी का IP बता सकता है। पुराने लेखों में मिलने वाला “अगर HTTP_CF_CONNECTING_IP हो तो उसे REMOTE_ADDR में डाल दो” वाला कोड इसी कारण इस्तेमाल न करें।
Cloudflare के IP पतों की सूची https://www.cloudflare.com/ips/ पर सार्वजनिक है। सूची बदल सकती है, इसलिए समय-समय पर उसे दोबारा देखें।
Nginx के लिए
ngx_http_realip_module इस्तेमाल करें। http ब्लॉक या server ब्लॉक में Cloudflare की सभी रेंज एक-एक करके लिखें।
# Cloudflare की IP रेंज (नवंबर 2026 तक। ताज़ा सूची cloudflare.com/ips पर देखें)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
sudo nginx -t && sudo systemctl reload nginx
Apache के लिए (Debian / Ubuntu)
mod_remoteip इस्तेमाल करें। /etc/apache2/conf-available/remoteip.conf बनाएँ और Cloudflare की रेंज RemoteIPTrustedProxy में लिखें।
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22
RemoteIPTrustedProxy 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20
RemoteIPTrustedProxy 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13
RemoteIPTrustedProxy 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22
RemoteIPTrustedProxy 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32
RemoteIPTrustedProxy 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
sudo a2enmod remoteip
sudo a2enconf remoteip
sudo apache2ctl configtest
sudo systemctl restart apache2
एक्सेस लॉग में असली IP दिखाने के लिए /etc/apache2/apache2.conf के LogFormat (combined) में %h को %a कर दें।
अगर सर्वर की सेटिंग नहीं बदल सकते (wp-config.php)
रेंटल सर्वर आदि पर वेब सर्वर की सेटिंग छूने की छूट न हो, तो यही जाँच wp-config.php में करें। इसे require_once ABSPATH . 'wp-settings.php'; वाली पंक्ति से पहले रखें। कनेक्शन-स्रोत Cloudflare की रेंज में हो, तभी CF-Connecting-IP का मान (जो IP पते के रूप में सही हो) इस्तेमाल होता है।
<?php
// सिर्फ़ Cloudflare से आने पर ही CF-Connecting-IP को विज़िटर का IP मानें
$cf_ranges = [
'173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22',
'141.101.64.0/18', '108.162.192.0/18', '190.93.240.0/20', '188.114.96.0/20',
'197.234.240.0/22', '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13',
'104.24.0.0/14', '172.64.0.0/13', '131.0.72.0/22',
'2400:cb00::/32', '2606:4700::/32', '2803:f800::/32', '2405:b500::/32',
'2405:8100::/32', '2a06:98c0::/29', '2c0f:f248::/32',
];
function cf_ip_in_range(string $ip, string $cidr): bool
{
[$net, $bits] = explode('/', $cidr);
$ip_bin = inet_pton($ip);
$net_bin = inet_pton($net);
if ($ip_bin === false || $net_bin === false || strlen($ip_bin) !== strlen($net_bin)) {
return false;
}
$bits = (int) $bits;
$bytes = intdiv($bits, 8);
if ($bytes > 0 && substr($ip_bin, 0, $bytes) !== substr($net_bin, 0, $bytes)) {
return false;
}
$rest = $bits % 8;
if ($rest === 0) {
return true;
}
$mask = (0xFF << (8 - $rest)) & 0xFF;
return (ord($ip_bin[$bytes]) & $mask) === (ord($net_bin[$bytes]) & $mask);
}
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) && !empty($_SERVER['REMOTE_ADDR'])) {
foreach ($cf_ranges as $range) {
if (cf_ip_in_range($_SERVER['REMOTE_ADDR'], $range)) {
$visitor = filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP);
if ($visitor !== false) {
$_SERVER['REMOTE_ADDR'] = $visitor;
}
break;
}
}
}
wp-config.php में शुरू से ही <?php होता है, इसलिए पहली पंक्ति का <?php न उतारें, दूसरी पंक्ति से आगे का हिस्सा चिपकाएँ। चिपकाने से पहले wp-config.php का बैकअप ले लें।
चरण 4: WAF के कस्टम रूल से लॉगिन पेज की रक्षा करें
Cloudflare WAF के कस्टम रूल फ़्री प्लान में 5 तक बनाए जा सकते हैं और Log के अलावा कार्रवाइयाँ (Block, Managed Challenge आदि) चुनी जा सकती हैं। इन्हें बनाने के लिए डैशबोर्ड के Security rules पेज पर “Create rule” से “Custom rules” चुनें, शर्त (Field, Operator, Value) और कार्रवाई तय करें, फिर “Deploy” करें।
उदाहरण 1: लॉगिन पेज और एडमिन सिर्फ़ अपने IP के लिए खोलें
यह उस स्थिति का उदाहरण है जब घर या दफ़्तर का स्थिर IP हो। एक्सप्रेशन के रूप में यह इस तरह लिखा जाता है (203.0.113.10 और 198.51.100.0/24 को अपने IP से बदलें)।
(http.request.uri.path eq "/wp-login.php" or starts_with(http.request.uri.path, "/wp-admin/"))
and http.request.uri.path ne "/wp-admin/admin-ajax.php"
and not ip.src in {203.0.113.10 198.51.100.0/24}
कार्रवाई Block रखें। /wp-admin/admin-ajax.php को शर्त से बाहर रखा गया है, क्योंकि संपर्क फ़ॉर्म और इन्फ़िनिट स्क्रॉल जैसी पब्लिक पेज की सुविधाएँ इसे बिना लॉगिन के भी बुला सकती हैं।
उदाहरण 2: स्थिर IP न हो तो देश और Managed Challenge से सीमित करें
(http.request.uri.path eq "/wp-login.php" or http.request.uri.path eq "/xmlrpc.php")
and not ip.src.country in {"JP"}
देश की जाँच के लिए ip.src.country (ISO 3166-1 के 2 अक्षर के कोड) इस्तेमाल करें। पुराने लेखों का ip.geoip.country अब अनुशंसित नहीं है। कार्रवाई पहले Managed Challenge रखें, सिक्योरिटी इवेंट में देखें कि वैध एक्सेस तो नहीं फँस रहा, फिर ज़रूरत हो तो Block कर दें। Cloudflare का दस्तावेज़ भी यही तरीका सुझाता है। xmlrpc.php का इस्तेमाल Jetpack या स्मार्टफ़ोन ऐप से पोस्ट करने में होता है, इसलिए शर्त में डालने से पहले जाँच लें कि आप इसे इस्तेमाल करते हैं या नहीं।
देश के आधार पर रोक एक सहायक उपाय है जिसे VPN आदि से पार किया जा सकता है। इसे 2-फ़ैक्टर ऑथेंटिकेशन और लॉगिन प्रयासों की सीमा के साथ मिलाकर इस्तेमाल करें। Nginx की तरफ़ से देश जाँचने का तरीका Nginx के GeoIP2 से देश के अनुसार एक्सेस सीमित करने का तरीका में बताया गया है।
चरण 5: कैश का डिफ़ॉल्ट व्यवहार और प्रकाशन पर पर्ज
Cloudflare डिफ़ॉल्ट रूप से HTML को कैश नहीं करता। वह तस्वीरें, CSS, JavaScript, फ़ॉन्ट जैसी स्टैटिक फ़ाइलें कैश करता है, जो एक्सटेंशन से तय होती हैं। Set-Cookie हेडर वाले जवाब भी कैश नहीं होते। इसलिए कुछ न बदलने पर एडमिन और लॉगिन पेज Cloudflare में कैश नहीं होते।
HTML को भी कैश करना हो तो Cache Rules से दायरा बढ़ाया जाता है, लेकिन तब /wp-admin/, /wp-login.php, प्रीव्यू और लॉगिन किए हुए उपयोगकर्ताओं के पेज को दायरे से बाहर रखना होगा। बाहर रखने में चूक हुई तो एडमिन वाले पेज दूसरों को दिख सकते हैं, इसलिए भरोसा न हो तो डिफ़ॉल्ट पर ही रहने देना सुरक्षित है।
CSS या तस्वीर बदलने के बाद भी दिखावट न बदले, तो डैशबोर्ड की कैश सेटिंग से पर्ज (हटाना) करें। हर पोस्ट के प्रकाशन या अपडेट पर अपने-आप पर्ज कराना हो, तो Cloudflare का API बुलाएँ। पहले Cloudflare में सिर्फ़ “Cache Purge” अनुमति वाला API टोकन बनाएँ और ज़ोन ID (डोमेन के अवलोकन पेज पर दिखती है) के साथ wp-config.php में कॉन्स्टैंट के रूप में लिखें।
define( 'CF_ZONE_ID', 'ज़ोन ID' );
define( 'CF_API_TOKEN', 'API टोकन' );
नीचे का कोड चाइल्ड थीम के functions.php में रखें, या अपने छोटे प्लगइन में (Code Snippets आदि से भी चलेगा)।
<?php
// पोस्ट प्रकाशित या अपडेट होने पर उस लेख और होम पेज का कैश Cloudflare से हटाएँ
function cf_purge_urls(array $urls): bool
{
if (!defined('CF_ZONE_ID') || !defined('CF_API_TOKEN')) {
return false;
}
$response = wp_remote_post(
'https://api.cloudflare.com/client/v4/zones/' . CF_ZONE_ID . '/purge_cache',
[
'headers' => [
'Authorization' => 'Bearer ' . CF_API_TOKEN,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode(['files' => array_values($urls)]),
'timeout' => 15,
]
);
if (is_wp_error($response)) {
error_log('Cloudflare purge failed: ' . $response->get_error_message());
return false;
}
$result = json_decode(wp_remote_retrieve_body($response), true);
return !empty($result['success']);
}
add_action('publish_post', function (int $post_id): void {
if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
return;
}
cf_purge_urls([get_permalink($post_id), home_url('/')]);
});
publish_post तब चलता है जब पोस्ट प्रकाशित होती है, और तब भी जब प्रकाशित पोस्ट अपडेट होती है। API के purge_cache में URL बताने वाले files के अलावा सब कुछ हटाने वाला purge_everything भी है, पर पूरा पर्ज करने से स्टैटिक फ़ाइलें भी दोबारा लानी पड़ती हैं, इसलिए हर लेख के प्रकाशन पर इसे इस्तेमाल न करें।
बदलाव के बाद जाँचने की बातें
curl -sIके नतीजे मेंserver: cloudflareऔरcf-rayहैं, और ब्राउज़र में ताले का निशान दिखता है- एडमिन में लॉगिन हो जाता है, पोस्ट सेव होती है और मीडिया अपलोड होता है
- नए कमेंट और एक्सेस लॉग में Cloudflare का नहीं, विज़िटर का IP दर्ज हो रहा है
- संपर्क फ़ॉर्म से ईमेल पहुँचता है (
MXरिकॉर्ड प्रॉक्सी नहीं हैं) - WAF का कस्टम रूल बनाया हो तो ऐसी लाइन (जैसे स्मार्टफ़ोन का मोबाइल नेटवर्क) से
wp-login.phpखोलें जिसे अनुमति नहीं दी है, और ब्लॉक या चैलेंज दिखता है
आम समस्याएँ
ERR_TOO_MANY_REDIRECTS आता है
जाँचें कि SSL/TLS मोड Flexible तो नहीं है। ओरिजिन पर प्रमाणपत्र लगाकर Full (strict) कर देने से यह ठीक हो जाता है।
एडमिन में नहीं जा पा रहे
हो सकता है WAF के कस्टम रूल की शर्त में आपका IP या देश शामिल न हो। Cloudflare डैशबोर्ड से रूल को कुछ देर के लिए बंद करें, सिक्योरिटी इवेंट में देखें कि कौन-सा रूल लगा था, फिर एक्सप्रेशन सुधारें।
सारे एक्सेस एक ही IP से दिखते हैं
चरण 3 में बताया असली IP बहाल करना नहीं हुआ है। Nginx में set_real_ip_from की रेंज और real_ip_header, Apache में remoteip चालू है या नहीं, यह जाँचें।
सारांश
- नेमसर्वर अपने खाते को मिले दो नेमसर्वर में बदलें, और
MXजैसे ईमेल के रिकॉर्ड को प्रॉक्सी न करें - SSL/TLS Full (strict) रखें। Flexible रीडायरेक्ट लूप और मिश्रित कंटेंट का कारण बनता है
- असली IP तभी
CF-Connecting-IPपर भरोसा करके बहाल करें जब कनेक्शन का स्रोत Cloudflare की रेंज में हो - लॉगिन पेज को WAF के कस्टम रूल से IP या देश के आधार पर सीमित करें, और शुरू में Managed Challenge से देखें
- HTML डिफ़ॉल्ट रूप से कैश नहीं होता। प्रकाशन पर पर्ज सिर्फ़ “Cache Purge” अनुमति वाले API टोकन से करें
संबंधित लेख
- Cloudflare का DNS सेट करने का तरीका
- Cloudflare का WAF सेट करने का तरीका
- Nginx के GeoIP2 से देश के अनुसार एक्सेस सीमित करने का तरीका
- मिश्रित कंटेंट (Mixed Content) ठीक करने का तरीका
संदर्भ: Restoring original visitor IPs (Cloudflare), Encryption modes (Cloudflare), Custom rules (Cloudflare WAF), Default cache behavior (Cloudflare)
WordPress के बारे में सवाल हैं? इस साइट के प्रकाशक जापान में हैं और जापानी में जवाब देते हैं। संपर्क (जापानी)