2026年11月12日
2026年11月12日
WordPress’e Cloudflare Kurulumu: Ad Sunucusu, SSL, Gerçek IP, WAF
Bu makale, Japonca orijinalin yerelleştirilmiş sürümüdür. Japonca orijinali oku
WordPress'e Cloudflare kurma işi şu sırayla ilerler: ① siteyi Cloudflare'e ekleyip alan adının ad sunucularını (nameserver) değiştirmek, ② SSL/TLS şifreleme modunu Full (strict) yapmak, ③ ziyaretçinin gerçek IP'sini sunucu tarafında geri getirmek, ④ WAF özel kurallarıyla giriş ekranını korumak. Ücretsiz planda da CDN, SSL, DDoS koruması ve özel kurallar (en fazla 5 adet) kullanılabilir.
Bu yazıda her ayar ve geçişten sonra kontrol edilecek noktalar anlatılır. Cloudflare ekranındaki adlar ve yerleşim değişebildiğinden, burada Kasım 2026 itibarıyla resmî belgelere (developers.cloudflare.com) göre yazılmıştır.
İşe başlamadan önce karar verilecekler
- DNS yönetimini Cloudflare'e taşımış olursunuz. Alan adının kayıtlı olduğu yer (registrar) değişmez, ancak DNS kayıtlarını Cloudflare ekranından düzenlersiniz.
- E-posta DNS kayıtlarını (MX vb.) proxy'den geçirmeyin. Cloudflare'den geçen yalnızca web trafiğidir (HTTP/HTTPS).
- Origin'in (WordPress'in bulunduğu sunucunun) geçerli bir SSL sertifikası olduğundan emin olun. Let's Encrypt vb. ile HTTPS kullanılabiliyorsa olduğu gibi kalabilir.
- Registrar tarafında DNSSEC etkinse, ad sunucularını değiştirmeden önce devre dışı bırakın. Eski DS kaydı kalırsa ad çözümlemesi başarısız olur.
Adım 1: Siteyi ekleyin ve ad sunucularını değiştirin
- Bir Cloudflare hesabı açın ve panelde alan adını ekleyin. Plan olarak Free seçebilirsiniz.
- Cloudflare mevcut DNS kayıtlarını okuyup listeler; eksik olup olmadığını kontrol edin. Okunamayan kayıtlar da olduğundan, mevcut DNS yönetim ekranıyla karşılaştırıp eksikleri elle ekleyin.
- Web sitesinin
A(veyaAAAA,CNAME) kayıtlarında proxy durumunu açık (turuncu bulut) yapın.MXve e-posta sunucusu için olanAkayıtlarını kapalı (yalnızca DNS, gri bulut) yapın. - Cloudflare iki ad sunucusu adı gösterir. Adlar
〇〇.ns.cloudflare.combiçimindedir ve hesap başına atanır. Başka yazılarda geçen adları değil, kendi ekranınızda görünen iki adı kullanın. - Alan adının kayıtlı olduğu registrar'ın yönetim ekranında ad sunucularını bu ikisiyle değiştirin.
Geçişin gerçekleşip gerçekleşmediğini aşağıdaki komutlarla kontrol edin. Yansıması birkaç saat sürebilir.
# Ad sunucuları Cloudflare'in iki sunucusu mu
dig NS example.com +short
# Cloudflare'den geçiyor mu (server: cloudflare ve cf-ray döner)
curl -sI https://example.com | grep -iE '^(server|cf-ray):'
Cloudflare ekranında alan adının durumu etkin (Active) olduğunda geçiş tamamdır.
Adım 2: SSL/TLS’yi Full (strict) yapın
Cloudflare'in SSL/TLS bölümünde, ziyaretçi ile Cloudflare arasının ve Cloudflare ile origin arasının nasıl şifreleneceğine dair modlar vardır.
| Mod | Cloudflare ile origin arası | WordPress'te durum |
|---|---|---|
| Off | Şifrelenmez | Kullanılmaz |
| Flexible | HTTP (şifrelenmez) | Kullanılmaz. Yönlendirme döngüsüne ve karma içeriğe neden olur |
| Full | HTTPS (sertifika doğrulanmaz) | Sertifika hazırlanana kadarki geçici çözüm |
| Full (strict) | HTTPS (sertifika doğrulanır) | Bunu seçin |
Ayar, Cloudflare panelindeki SSL/TLS'nin genel bakış (Overview) sayfasından değiştirilir. Varsayılan "Automatic SSL/TLS", origin'in desteklediği ölçüde güvenli modu otomatik seçen bir mekanizmadır. Full (strict)'i kendiniz seçerseniz istenmeyen bir modda çalışmaz. Origin sertifikası olarak genel bir sertifika otoritesinin sertifikası (Let's Encrypt vb.) ya da Cloudflare'in verdiği Origin CA sertifikası kullanılabilir.
Flexible'dan kaçınma nedeni şudur. Flexible'da origin'e HTTP ile ulaşıldığı için WordPress veya sunucu "HTTP geldi, HTTPS'e yönlendir" diye yanıt verir, Cloudflare yine HTTP ile origin'e gider ve bu böyle tekrarlanır (tarayıcıda ERR_TOO_MANY_REDIRECTS görünür). Full (strict)'te origin'e de HTTPS ile ulaşıldığı için WordPress tarafında X-Forwarded-Proto'ya bakıp $_SERVER['HTTPS']'yi yeniden yazan ek kodlara gerek kalmaz.
Bununla birlikte WordPress'in "Ayarlar" (Settings) → "Genel" (General) bölümündeki "WordPress Adresi (URL)" ve "Site Adresi (URL)" değerlerinin https:// olduğunu kontrol edin. Görseller gibi öğeler http:// olarak kalmışsa karma içeriğin düzeltilmesi yazısına bakın.
Adım 3: Ziyaretçinin gerçek IP’sini geri getirin
Cloudflare üzerinden geçince sunucuya ulaşan bağlantı kaynağı (REMOTE_ADDR) Cloudflare'in IP adresi olur. Bu haliyle erişim günlükleri, yorumların IP'si, giriş denemelerini sınırlayan eklentiler vb. tüm ziyaretçileri Cloudflare'in IP'si olarak görür. Cloudflare ziyaretçinin IP'sini CF-Connecting-IP başlığıyla iletir; bu yüzden yalnızca bağlantı kaynağı Cloudflare olduğunda bu başlığa güvenecek şekilde ayarlayın.
Bağlantı kaynağını kontrol etmeden başlıktaki değerle REMOTE_ADDR'i yeniden yazarsanız, Cloudflare'den geçmeden doğrudan origin'e erişen kişi başlıkla istediği IP'yi kendine atayabilir. Eski yazılarda geçen, yalnızca "HTTP_CF_CONNECTING_IP varsa REMOTE_ADDR'e ata" biçimindeki kodu bu nedenle kullanmayın.
Cloudflare'in IP adresi listesi https://www.cloudflare.com/ips/ adresinde yayımlanmaktadır. Liste değişebildiğinden düzenli olarak gözden geçirin.
Nginx için
ngx_http_realip_module kullanılır. http veya server bloğuna Cloudflare'in tüm aralıklarını sıralayın.
# Cloudflare IP aralıkları (Kasım 2026 itibarıyla. En güncel hali için cloudflare.com/ips'e bakın)
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 için (Debian / Ubuntu)
mod_remoteip kullanılır. /etc/apache2/conf-available/remoteip.conf dosyasını oluşturup Cloudflare'in aralıklarını RemoteIPTrustedProxy olarak sıralayın.
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
Erişim günlüğünde gerçek IP'yi göstermek için /etc/apache2/apache2.conf içindeki LogFormat (combined) değerinde %h yerine %a yazın.
Sunucu ayarları değiştirilemiyorsa (wp-config.php)
Kiralık sunucu vb. nedeniyle web sunucusu ayarlarına dokunamıyorsanız, aynı denetimi wp-config.php içinde yapın. require_once ABSPATH . 'wp-settings.php'; satırından önce koyun. Yalnızca bağlantı kaynağı Cloudflare aralığındaysa CF-Connecting-IP değerini (IP adresi olarak geçerli olanı) kullanır.
<?php
// Yalnızca Cloudflare üzerinden gelindiğinde CF-Connecting-IP'yi ziyaretçinin IP'si olarak kullan
$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 dosyasında en başta zaten <?php bulunduğundan, 1. satırdaki <?php'yi kopyalamayın, 2. satırdan itibaren yapıştırın. Yapıştırmadan önce wp-config.php dosyasının yedeğini alın.
Adım 4: WAF özel kurallarıyla giriş ekranını koruyun
Cloudflare WAF özel kuralları ücretsiz planda en fazla 5 adet oluşturulabilir ve Log dışındaki eylemler (Block, Managed Challenge vb.) seçilebilir. Oluşturmak için panelde Security rules sayfasında "Create rule"dan "Custom rules"u seçin, koşulu (Field, Operator, Value) ve eylemi belirtip "Deploy" edin.
Örnek 1: Giriş ekranını ve yönetim ekranını yalnızca kendi IP’nize açın
Evde veya işyerinde sabit IP'niz varsa örnektir. İfade olarak yazılışı şöyledir (203.0.113.10 ve 198.51.100.0/24 yerine kendi IP'nizi yazın).
(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}
Eylemi Block yapın. /wp-admin/admin-ajax.php, iletişim formu ve sonsuz kaydırma gibi herkese açık sayfa işlevlerinin oturum açmadan çağırabildiği bir adres olduğundan, koşulun dışında bırakılmıştır.
Örnek 2: Sabit IP yoksa ülke ve Managed Challenge ile daraltın
(http.request.uri.path eq "/wp-login.php" or http.request.uri.path eq "/xmlrpc.php")
and not ip.src.country in {"JP"}
Ülke denetiminde ip.src.country (ISO 3166-1'in 2 harfli kodu) kullanılır; buradaki "JP" Japonya'dır, kendi ülkenizin koduyla değiştirin. Eski yazılardaki ip.geoip.country kullanımdan kalkmıştır. Eylemi önce Managed Challenge yapın, güvenlik olaylarında meşru erişimlerin takılıp takılmadığına bakın, gerekirse Block'a çevirin. Cloudflare belgeleri de bu yaklaşımı önerir. xmlrpc.php, Jetpack veya akıllı telefon uygulamalarından yazı gönderilirken kullanıldığından, kullanıp kullanmadığınızı kontrol ettikten sonra koşula ekleyin.
Ülkeye göre kısıtlama VPN vb. ile aşılabilen yardımcı bir önlemdir. İki adımlı doğrulama ve giriş denemesi sınırlamasıyla birlikte kullanın. Nginx tarafında ülke denetimi yapma yöntemi Nginx GeoIP2 ile ülkeye göre erişimi kısıtlama yazısında anlatılmaktadır.
Adım 5: Önbelleğin varsayılan davranışı ve yayımlanırken temizleme
Cloudflare varsayılan olarak HTML'i önbelleğe almaz. Önbelleğe aldığı, görsel, CSS, JavaScript, yazı tipi gibi uzantıyla belirlenen statik dosyalardır. Ayrıca Set-Cookie başlığı içeren yanıtları da önbelleğe almaz. Bu yüzden hiçbir şey ayarlamazsanız yönetim ekranı ve giriş ekranı Cloudflare tarafından önbelleğe alınmaz.
HTML'i de önbelleğe almak isterseniz Cache Rules ile kapsamı genişletirsiniz; ancak o zaman /wp-admin/, /wp-login.php, önizleme ve oturum açmış kullanıcıların gördüğü sayfaları kapsam dışında bırakmanız gerekir. Yanlış dışlarsanız yöneticiye ait ekranlar başkalarına gösterilebileceğinden, emin değilseniz varsayılan halinde bırakmak daha güvenlidir.
CSS veya görseli değiştirdiğiniz halde görünüm değişmiyorsa, panelin önbellek ayarlarından temizleyin (purge). Bir yazı yayımlandığında veya güncellendiğinde otomatik temizlemek isterseniz Cloudflare API'sini çağırın. Önce Cloudflare'de yalnızca "Cache Purge" yetkisine sahip bir API belirteci (token) oluşturun ve bölge kimliğiyle (alan adının genel bakış sayfasında görünür) birlikte wp-config.php içine sabit olarak yazın.
define( 'CF_ZONE_ID', 'Bölge kimliği' );
define( 'CF_API_TOKEN', 'API belirteci' );
Aşağıdaki kodu alt temanın functions.php dosyasına veya kendi küçük eklentinize (Code Snippets vb. de olur) koyun.
<?php
// Bir yazı yayımlanınca veya güncellenince, o yazının ve ana sayfanın önbelleğini Cloudflare'den sil
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, bir yazı yayımlandığında ve yayımlanmış bir yazı güncellendiğinde çalışır. API'nin purge_cache işlevinde URL belirten files dışında tümünü silen purge_everything da vardır; ancak tümünü temizlemek statik dosyaların hepsinin yeniden alınmasına yol açtığından, her yazı yayımlandığında kullanılmaz.
Geçişten sonra kontrol edilecekler
curl -sIsonucundaserver: cloudflarevecf-rayvar ve tarayıcıda kilit simgesi görünüyor- Yönetim ekranına giriş yapılabiliyor, yazı kaydetme ve medya yükleme çalışıyor
- Yeni yorumlarda ve erişim günlüğünde Cloudflare'in IP'si değil ziyaretçinin IP'si kaydediliyor
- İletişim formundan e-posta ulaşıyor (
MXkayıtları proxy'den geçmiyor) - WAF özel kuralı oluşturduysanız, izin vermediğiniz bir hattan (akıllı telefonun mobil hattı gibi)
wp-login.phpaçıldığında engelleme veya doğrulama (challenge) çıkıyor
Sık görülen sorunlar
ERR_TOO_MANY_REDIRECTS alınıyor
SSL/TLS modunun Flexible olup olmadığını kontrol edin. Origin'e sertifika kurup Full (strict)'e geçince çözülür.
Yönetim ekranına girilemez oldu
WAF özel kuralının koşuluna kendi IP'nizin veya ülkenizin dahil olmaması olabilir. Cloudflare panelinden kuralı geçici olarak devre dışı bırakın, güvenlik olaylarında hangi kurala takıldığınıza bakıp ifadeyi düzeltin.
Tüm erişimler aynı IP’den görünüyor
Adım 3'teki gerçek IP geri getirme yapılmamış demektir. Nginx'te set_real_ip_from aralığını ve real_ip_header'ı, Apache'de remoteip'in etkin olup olmadığını kontrol edin.
Özet
- Ad sunucularını hesabınıza atanan iki sunucuya değiştirin,
MXgibi e-posta kayıtlarını proxy'den geçirmeyin - SSL/TLS, Full (strict) olmalıdır. Flexible, yönlendirme döngüsüne ve karma içeriğe neden olur
- Gerçek IP, yalnızca bağlantı kaynağı Cloudflare aralığındayken
CF-Connecting-IP'ye güvenilerek geri getirilir - Giriş ekranını WAF özel kuralıyla IP veya ülkeye göre daraltın, önce Managed Challenge ile gidişatı izleyin
- HTML varsayılan olarak önbelleğe alınmaz. Yayımlarken temizleme, yalnızca "Cache Purge" yetkili bir API belirteciyle yapılır
İlgili yazılar
- Cloudflare DNS nasıl ayarlanır
- Cloudflare WAF nasıl ayarlanır
- Nginx GeoIP2 ile ülkeye göre erişimi kısıtlama
- Karma içerik (Mixed Content) nasıl düzeltilir
Kaynaklar: Restoring original visitor IPs (Cloudflare), Encryption modes (Cloudflare), Custom rules (Cloudflare WAF), Default cache behavior (Cloudflare)
WordPress hakkında sorunuz mu var? Bu sitenin yayıncısı Japonya'dadır ve Japonca yanıt verir. İletişim (Japonca)