Cloudflare 522 Bağlantı Zaman Aşımı Hatasını Giderme
Cloudflare arkasındaki bir sunucuya bağlanmaya çalışırken tarayıcıda büyük turuncu bir hata sayfası belirdi: 522 Connection Timed Out. Bu hatayı ilk gördüğünde “DNS mi bozuldu, sunucu mu çöktü, Cloudflare mı deli oldu?” diye kafan karışıyor. Merak etme, bu yazıda 522 hatasını kök nedenlerine kadar inip adım adım çözeceğiz.
522 Hatası Tam Olarak Ne Anlama Geliyor?
Cloudflare 522 hatası, Cloudflare’ın origin sunucuna (yani senin gerçek sunucuna) TCP bağlantısı kurmaya çalıştığı ancak bu bağlantının zaman aşımına uğradığı anlamına gelir. Dikkat et, bu hata kullanıcının tarayıcısı ile Cloudflare arasındaki bağlantı sorunu değil. Sorun Cloudflare edge sunucuları ile senin origin IP’n arasında yaşanıyor.
Daha teknik konuşmak gerekirse: Cloudflare, origin sunucuna TCP SYN paketi gönderir. Eğer 15 saniye içinde TCP SYN+ACK yanıtı almazsa 522 döner. Ya da bağlantı kurulduktan sonra HTTP isteği gönderir ve 90 saniye içinde yanıt alamazsa yine 522 döner.
Bu hatanın 504 (Gateway Timeout) ile karıştırılmaması gerekiyor. 504’te bağlantı kurulur ama yanıt geç gelir. 522’de ise bağlantı hiç kurulamaz veya TCP handshake bile tamamlanamaz.
Olası Nedenler
Önce şüpheli listeni oluşturalım:
- Origin sunucusu çevrimdışı veya yanıt vermiyor: En basit neden
- Güvenlik duvarı Cloudflare IP’lerini engelliyor: Çok sık görülen senaryo
- Origin sunucusunda kaynak tükenmesi: CPU, RAM, bağlantı havuzu dolmuş
- Web sunucusu (nginx/apache) çökmüş veya kilitlenmiş
- Yanlış port yapılandırması
- TCP bağlantı limitleri aşılmış
- Cloudflare ile origin arasında ağ yolu sorunu
Adım 1: Sunucunun Gerçekten Ayakta Olup Olmadığını Kontrol Et
İlk iş, origin sunucusuna doğrudan ping at ve servislerin ayakta olup olmadığını kontrol et.
# Sunucuya temel erişimi kontrol et
ping -c 4 senin-origin-ip-adresin
# Web sunucusunun portu dinleyip dinlemediğini kontrol et
nc -zv senin-origin-ip-adresin 80
nc -zv senin-origin-ip-adresin 443
# Sunucuda hangi servislerin çalıştığını gör
ss -tlnp | grep -E '(80|443|8080|8443)'
Eğer origin sunucusuna SSH ile bağlanabiliyorsan, doğrudan yerelden test et:
# Sunucu üzerinde web sunucusunun durumunu kontrol et
sudo systemctl status nginx
sudo systemctl status apache2
# Son log satırlarına bak
sudo journalctl -u nginx -n 50 --no-pager
sudo journalctl -u apache2 -n 50 --no-pager
# Kaç aktif bağlantı var?
ss -s
Eğer nginx veya apache servisi çökmüşse şunu dene:
# Servisi yeniden başlat
sudo systemctl restart nginx
# Config dosyasında sözdizimi hatası var mı diye kontrol et
sudo nginx -t
sudo apachectl configtest
Adım 2: Cloudflare IP Aralıklarını Güvenlik Duvarında Kontrol Et
Bu, 522 hatasının en yaygın nedeni. Sunucunda bir güvenlik duvarı (iptables, ufw, nftables, hatta hosting panelinin güvenlik duvarı) Cloudflare’ın IP aralıklarını engelliyor olabilir. Cloudflare, origin sunucusuna kendi IP’lerinden istek gönderir ve bu IP’lerin açık olması şart.
Cloudflare’ın güncel IP aralıklarını her zaman resmi kaynaktan almalısın:
# Cloudflare IPv4 aralıklarını çek
curl -s https://www.cloudflare.com/ips-v4
# Cloudflare IPv6 aralıklarını çek
curl -s https://www.cloudflare.com/ips-v6
Şimdi bu IP’leri güvenlik duvarına ekleyelim. UFW kullananlar için:
# Cloudflare IPv4 aralıkları için 80 ve 443 portlarını aç
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
sudo ufw allow from $ip to any port 80
sudo ufw allow from $ip to any port 443
done
# IPv6 aralıkları için de aynısını yap
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
sudo ufw allow from $ip to any port 80
sudo ufw allow from $ip to any port 443
done
sudo ufw reload
sudo ufw status
iptables kullananlar için:
# Mevcut kuralları kontrol et
sudo iptables -L INPUT -n -v --line-numbers
# Cloudflare IP'lerini izin ver (örnek olarak birkaç aralık)
sudo iptables -I INPUT -s 103.21.244.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 103.22.200.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 103.31.4.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 141.101.64.0/18 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 108.162.192.0/18 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 190.93.240.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 188.114.96.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 197.234.240.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 198.41.128.0/17 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 162.158.0.0/15 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 104.16.0.0/13 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 104.24.0.0/14 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 172.64.0.0/13 -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -I INPUT -s 131.0.72.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
Önemli not: Eğer sunucuna sadece Cloudflare üzerinden erişim olacaksa, direkt IP erişimini kısıtlayabilirsin. Bu aynı zamanda origin IP’ni gizli tutar. Ama bunu yaparken SSH bağlantını kesmemek için 22 portunu açık bırak.
Adım 3: Origin Sunucusu Kaynaklarını İncele
Sunucu ayakta ama bağlantılar yine de zaman aşımına uğruyorsa, kaynak tükenmesi söz konusu olabilir.
# CPU ve bellek kullanımına bak
top -b -n 1 | head -20
# Disk I/O durumunu kontrol et
iostat -x 1 3
# Yük ortalamasını kontrol et
uptime
# Bellek detayı
free -m
# En çok kaynak tüketen process'leri bul
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
Nginx için maksimum bağlantı sayısını kontrol et:
# Nginx worker process sayısı ve bağlantı limiti
grep -E '(worker_processes|worker_connections)' /etc/nginx/nginx.conf
# Şu an kaç aktif nginx bağlantısı var?
sudo nginx -V 2>&1 | grep -o 'with-http_stub_status_module'
# stub_status modülü aktifse:
curl http://localhost/nginx_status 2>/dev/null
Eğer sunucuda çok sayıda TIME_WAIT bağlantısı birikiyorsa bu da sorun yaratır:
# TCP bağlantı durumlarını say
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
# TIME_WAIT bağlantılarını listele
ss -tan state time-wait | wc -l
TIME_WAIT sayısı binlerce ise /etc/sysctl.conf dosyasına şunları ekleyip uygula:
# /etc/sysctl.conf dosyasını düzenle
sudo nano /etc/sysctl.conf
# Aşağıdaki satırları ekle:
# net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_fin_timeout = 15
# net.core.somaxconn = 65535
# net.ipv4.tcp_max_syn_backlog = 65535
# Değişiklikleri uygula
sudo sysctl -p
Adım 4: DNS Kayıtlarını ve Origin IP’yi Doğrula
Cloudflare proxy aktifken (turuncu bulut ikonu), DNS kaydındaki IP adresi doğrudan origin sunucuyu göstermelidir. Eğer bu IP yanlışsa, Cloudflare yanlış sunucuya bağlanmaya çalışır.
# Cloudflare DNS kayıtlarındaki IP'yi kontrol et
# (Bu komutu kendi bilgisayarından çalıştır)
dig +short senin-domain.com
# Cloudflare proxy aktifken gerçek origin IP gözükmez,
# Cloudflare IP'si görünür. Bu normal.
# Ama origin IP'nin doğru olduğunu Cloudflare panelinden kontrol et.
# Origin sunucunun gerçek IP'sini öğrenmek için:
curl -s https://api.ipify.org
Cloudflare’ın origin sunucuna ulaşıp ulaşamadığını test etmek için, Cloudflare’ın sunduğu diagnostic araçlarını kullan. Cloudflare panelinde “Speed > Diagnostics” veya “Support > Diagnostics” kısmından origin sunucu testi yapabilirsin.
Adım 5: SSL/TLS Yapılandırmasını Kontrol Et
Eğer Cloudflare SSL modu Full veya Full (Strict) olarak ayarlıysa, Cloudflare origin sunucuna 443 portu üzerinden HTTPS bağlantısı kurmaya çalışır. Eğer origin’de geçerli bir SSL sertifikası yoksa veya HTTPS düzgün çalışmıyorsa 522 çıkabilir.
# Origin sunucusunda SSL sertifikasını kontrol et
openssl s_client -connect localhost:443 -servername senin-domain.com </dev/null 2>/dev/null | openssl x509 -noout -dates
# Sertifika expire olmuş mu?
openssl s_client -connect senin-origin-ip:443 -servername senin-domain.com </dev/null 2>/dev/null | openssl x509 -noout -enddate
# 443 portunda nginx gerçekten dinliyor mu?
sudo ss -tlnp | grep 443
Eğer origin’de SSL sertifikan yoksa ve Cloudflare SSL modun “Full” ise, Cloudflare panelinden bunu Flexible olarak değiştir. Ama bu geçici bir çözüm, uzun vadede origin’e de SSL eklemek gerekiyor.
Adım 6: Cloudflare Tarafındaki Ayarları İncele
Bazı Cloudflare özellikleri yanlış yapılandırıldığında 522’ye yol açabilir:
Proxy durumu: DNS kaydında turuncu bulut (proxy açık) yerine gri bulut (DNS only) seçiliyse, Cloudflare araya girmez. Eğer yanlışlıkla gri bulutla bıraktıysan ve A kaydı doğru IP’yi gösteriyorsa sorun Cloudflare değil doğrudan origin’dir.
Origin Rules ve Transform Rules: Cloudflare’da yanlış yapılandırılmış bir kural origin’e farklı bir header veya farklı bir adres gönderebilir.
Load Balancing: Birden fazla origin tanımladıysan ve sağlıklı origin kalmadıysa 522 görürsün.
Cloudflare’ın kendi durumunu da kontrol et:
# Cloudflare'ın genel servis durumunu API üzerinden sorgula
curl -s https://www.cloudflarestatus.com/api/v2/status.json | python3 -m json.tool | grep -E '(name|indicator)'
Gerçek Dünya Senaryosu: Hoster Güvenlik Duvarı
Geçen ay bir müşterinin sitesi için 522 sorunu yaşadık. Durum şuydu: Site yıllardır sorunsuz çalışıyordu. Bir gece aniden 522 başladı. Sunucu ayaktaydı, SSH ile giriyorduk, nginx çalışıyordu.
Kontrol ettiğimizde şunu gördük:
# Sunucuda iptables kurallarına baktık
sudo iptables -L INPUT -n -v | grep DROP
# Çıktıda şöyle bir şey vardı:
# 15234 912K DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
# Hosting firmasının otomatik güvenlik sistemi bir DDoS saldırısına
# karşı 443 portunu tamamen kapamıştı!
Hosting firması, gece yarısı yüksek trafik gördüğünde otomatik olarak 443 portunu kapatan bir kural devreye almıştı. Bu kuralı kaldırıp Cloudflare IP’lerini whitelist’e alarak sorunu çözdük:
# DROP kuralını sil (satır numarasına göre)
sudo iptables -D INPUT 5
# Cloudflare IP'lerini ekle ve kural setini kalıcı hale getir
sudo iptables-save > /etc/iptables/rules.v4
Gerçek Dünya Senaryosu: PHP-FPM Tıkanması
Başka bir vakada origin sunucusu TCP bağlantısını kabul ediyor ama yanıt vermiyordu. Bu durumda 522 değil 524 görmen gerekir ama bazen 522 olarak da görebilirsin. Nginx loglarına bakınca şunu gördük:
# Nginx error loguna bak
sudo tail -f /var/log/nginx/error.log
# Şöyle bir hata görüyorduk:
# connect() to unix:/var/run/php/php8.1-fpm.sock failed (11: Resource temporarily unavailable)
# no live upstreams while connecting to upstream
# PHP-FPM durumunu kontrol et
sudo systemctl status php8.1-fpm
# PHP-FPM process sayısını kontrol et
sudo ps aux | grep php-fpm | wc -l
# PHP-FPM pool yapılandırmasını incele
cat /etc/php/8.1/fpm/pool.d/www.conf | grep -E '(pm.|max_children|start_servers)'
PHP-FPM’in max_children değeri çok düşük ayarlanmıştı. Tüm worker’lar meşguldü ve yeni bağlantılar düşüyordu:
# www.conf dosyasını düzenle
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
# pm.max_children değerini sunucu RAM'ine göre artır
# Kural: (Toplam RAM - Sistem için ayrılan RAM) / Ortalama PHP process RAM kullanımı
# Örnek: (4096MB - 512MB) / 50MB = yaklaşık 72
# pm.max_children = 72
# pm.start_servers = 18
# pm.min_spare_servers = 10
# pm.max_spare_servers = 30
sudo systemctl restart php8.1-fpm
Windows Server Üzerinde IIS İçin Özel Kontroller
Windows tabanlı origin kullanıyorsan kontroller biraz farklı:
# PowerShell ile IIS servis durumu
Get-Service W3SVC | Select-Object Status, Name
# Application Pool durumu
Import-Module WebAdministration
Get-WebConfiguration system.applicationHost/applicationPools/add | Select-Object name, state
# Windows Firewall kurallarını kontrol et
Get-NetFirewallRule | Where-Object {$_.LocalPort -eq "80" -or $_.LocalPort -eq "443"} | Select-Object DisplayName, Action, Enabled
# Cloudflare IP aralıklarına izin veren kural ekle
New-NetFirewallRule -DisplayName "Cloudflare HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -RemoteAddress "103.21.244.0/22","104.16.0.0/13","104.24.0.0/14" -Action Allow
Hızlı Tanı Akışı
Durumu hızlı değerlendirmek için şu sırayı takip et:
- Sunucu SSH ile erişilebilir mi? Hayır ise sunucu kapalı veya ağ sorunu var, hosting firmanı ara.
- Web sunucusu servisi ayakta mı? Hayır ise
systemctl restart nginx/apachedene. - 80/443 portu dinleniyor mu?
ss -tlnpile kontrol et. Dinlenmiyorsa web sunucusu yapılandırma hatası var. - Güvenlik duvarı Cloudflare IP’lerini engelliyor mu?
iptables -L -nveyaufw statusile kontrol et. - Sunucu yük ortalaması yüksek mi?
uptimekomutuyla bak, yüksekse kaynak sorunu var. - SSL bağlantısı çalışıyor mu?
openssl s_client -connect ip:443ile test et. - Cloudflare kendi sorununu mu yaşıyor?
cloudflarestatus.comadresini kontrol et.
Cloudflare’ın Origin Sunucuyu Test Etme Aracı
Cloudflare panelinde yapabileceğin hızlı testler:
Cloudflare Dashboard > Alan adını seç > “Support” menüsünden “Diagnose” seçeneğine gir. Buradan Cloudflare’ın senin origin sunucuna bağlantı testi yapmasını sağlayabilirsin. Bu test, Cloudflare edge’den gerçek bir bağlantı denemesi yapar ve nerede takıldığını söyler.
Ayrıca Cloudflare Trace kullanabilirsin:
# Cloudflare trace endpoint'i ile routing bilgisi al
curl -s https://senin-domain.com/cdn-cgi/trace
# Bu çıktıda şunları görürsün:
# ip - İsteği yapan IP
# uag - User agent
# colo - Hangi Cloudflare veri merkezinden yanıt geldiği
# h - İstenen host
# ts - Zaman damgası
Önleyici Tedbirler
522 hatası bir daha yaşanmasın dersen şunları yap:
- Cloudflare Health Checks’i etkinleştir: Cloudflare panelinde origin sunucu için health check tanımla. Sunucu sorunlara girdiğinde anında haberdar ol.
- Cloudflare IP listesini düzenli güncelle: Cloudflare zaman zaman IP aralıklarını değiştirir. Bunu otomatik hale getirmek için bir cron job kurabilirsin:
# /usr/local/bin/update-cloudflare-ips.sh dosyası oluştur
cat > /usr/local/bin/update-cloudflare-ips.sh << 'EOF'
#!/bin/bash
# Eski Cloudflare kurallarını sil
iptables -D INPUT -m comment --comment "cloudflare" -j ACCEPT 2>/dev/null || true
# Yeni IP'leri çek ve ekle
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
iptables -I INPUT -s $ip -p tcp -m multiport --dports 80,443 -m comment --comment "cloudflare" -j ACCEPT
done
# Kaydet
iptables-save > /etc/iptables/rules.v4
echo "$(date): Cloudflare IPs updated" >> /var/log/cloudflare-ip-update.log
EOF
chmod +x /usr/local/bin/update-cloudflare-ips.sh
# Haftalık çalıştırmak için cron'a ekle
echo "0 2 * * 0 root /usr/local/bin/update-cloudflare-ips.sh" >> /etc/cron.d/cloudflare-ips
- Uptime monitörü kur: Basit bir uptime monitörü (UptimeRobot, Better Uptime veya kendi kurduğun bir çözüm) sayesinde 522 başlar başlamaz SMS veya e-posta alırsın.
- Origin sunucu loglarını düzenli kontrol et: Özellikle “too many open files”, “resource temporarily unavailable” gibi hatalar 522 öncesinde genellikle loglarda belirir.
Sonuç
522 hatası ilk bakışta karmaşık görünse de büyük çoğunlukla birkaç yaygın nedenden kaynaklanır: güvenlik duvarı engeli, web sunucusu servisi çökmüş veya kaynak tükenmesi. Sistematik yaklaşırsan; önce sunucunun ayakta olup olmadığını, sonra web servisinin çalışıp çalışmadığını, ardından güvenlik duvarı kurallarını kontrol edersen çoğu durumda dakikalar içinde sorunu bulursun.
En önemli tavsiyem şu: Cloudflare’ın IP aralıklarını güvenlik duvarında beyaz listeye al ve bunu otomatik güncelleyecek bir mekanizma kur. Bu tek adım, 522 vakalarının büyük çoğunluğunu ortadan kaldırır. Geri kalan vakalar için de loglara bakmayı ve kaynakları izlemeyi alışkanlık haline getir.
Sorun yaşamaya devam edersen Cloudflare Support’a ticket aç ve onlardan origin sunucuna yaptıkları bağlantı girişimlerinin loglarını iste. Bu loglar, sorunun tam olarak nerede olduğunu görmeni sağlar.
