Cloudflare Tunnel ile Sunucuya Port Açmadan Güvenli Erişim Sağlama
Evde bir Raspberry Pi üzerinde koşan küçük bir web uygulamanız var ve bunu dışarıdan erişilebilir yapmak istiyorsunuz. Ya da şirket içi bir servis var ve VPN kurmadan uzak çalışanların bu servise güvenli erişimini sağlamanız gerekiyor. Klasik çözüm: router’a gir, port yönlendirme ayarla, ISP’den statik IP al (veya DDNS kur), firewall kuralı yaz. Bu süreç hem zahmetli hem de güvenlik açısından ciddi riskler barındırıyor. Cloudflare Tunnel tam da bu sorunu çözüyor.
Cloudflare Tunnel Nedir ve Nasıl Çalışır?
Cloudflare Tunnel (eski adıyla Argo Tunnel), sunucunuzdan Cloudflare’in edge ağına giden kalıcı, şifreli bir tünel oluşturur. Bu tünelin en kritik özelliği şu: sunucunuzda hiçbir port açmanıza gerek kalmaz. Bağlantı her zaman sunucudan Cloudflare’e doğru başlar, dışarıdan içeriye gelen herhangi bir bağlantı söz konusu değildir.
Teknik olarak şöyle çalışır: Sunucunuza kurduğunuz cloudflared daemon’ı, Cloudflare’in en yakın PoP’una (Point of Presence) birden fazla bağlantı açar. Bir kullanıcı alan adınıza istek gönderdiğinde, bu istek Cloudflare edge’ine ulaşır ve oradan tünel üzerinden sunucunuza iletilir. Yanıt da aynı yoldan geri döner. Sunucunuz internete kapalı olsa bile, tünel çalıştığı sürece servisiniz erişilebilir durumda kalır.
Bu yapının güvenlik açısından sunduğu avantajlar gerçekten önemlidir:
- Sıfır açık port: Sunucunuzda 22, 80, 443 dahil hiçbir port dışarıya açık olmak zorunda değil
- DDoS koruması: Tüm trafik Cloudflare üzerinden geçtiği için Cloudflare’in DDoS koruma mekanizmaları devreye girer
- Gerçek IP gizleme: Sunucunuzun IP adresi hiç kimseye görünmez
- Otomatik TLS: Cloudflare ücretsiz SSL sertifikası sağlar, siz sertifika yönetimiyle uğraşmazsınız
Gereksinimler ve Ön Hazırlık
Başlamadan önce şunlara ihtiyacınız var:
- Cloudflare üzerinde yönettiğiniz bir alan adı (ücretsiz plan yeterli)
- Cloudflare hesabı
- Ubuntu/Debian veya CentOS/RHEL tabanlı bir sunucu
- Sunucuda root veya sudo yetkisi
Alan adınızın nameserver’larının Cloudflare’e yönlendirilmiş olması şart. Eğer alan adınızı sadece DNS için Cloudflare’e bağlamadıysanız, önce alan adı sağlayıcınızın panelinden nameserver’ları Cloudflare’in verdiği nameserver adresleriyle değiştirmeniz gerekiyor.
cloudflared Kurulumu
Debian/Ubuntu için Kurulum
# Cloudflare GPG anahtarını ekle
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
# Repository'i ekle
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
# Paketi kur
sudo apt update && sudo apt install cloudflared -y
# Versiyon kontrolü
cloudflared --version
CentOS/RHEL için Kurulum
# RPM paketini direkt indir
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.rpm -o cloudflared.rpm
# Kur
sudo rpm -ivh cloudflared.rpm
# Veya yum ile
sudo yum localinstall cloudflared.rpm -y
ARM Tabanlı Sistemler (Raspberry Pi) için
# ARM64 için
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# ARM32 için (eski Pi modelleri)
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
Cloudflare Hesabına Bağlanma ve Tünel Oluşturma
Kurulum tamamlandıktan sonra cloudflared‘ı Cloudflare hesabınıza bağlamanız gerekiyor.
# Cloudflare'e giriş yap - bu komut bir URL üretecek
cloudflared tunnel login
Bu komut çalıştırıldığında terminalde bir URL göreceksiniz. Bu URL’yi tarayıcınızda açın, Cloudflare hesabınıza giriş yapın ve tünel için kullanmak istediğiniz alan adını seçin. Onayladıktan sonra kimlik bilgileri ~/.cloudflared/cert.pem dosyasına kaydedilir.
Şimdi tüneli oluşturalım:
# Tünel oluştur (isim istediğiniz gibi olabilir)
cloudflared tunnel create production-web
# Oluşturulan tünel bilgilerini gör
cloudflared tunnel list
Bu komut size bir tünel ID’si verecek, örneğin: a1b2c3d4-e5f6-7890-abcd-ef1234567890. Bu ID’yi not edin, sonra kullanacağız.
Yapılandırma Dosyası Oluşturma
cloudflared için bir yapılandırma dosyası oluşturmak en temiz yöntem. Bu dosya sayesinde hangi servislerin hangi alt alan adlarına yönlendirileceğini merkezi olarak yönetebilirsiniz.
sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml
Temel bir yapılandırma şöyle görünür:
tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json
ingress:
- hostname: app.orneksite.com
service: http://localhost:3000
- hostname: panel.orneksite.com
service: http://localhost:8080
- hostname: ssh.orneksite.com
service: ssh://localhost:22
- service: http_status:404
Burada dikkat edilmesi gereken nokta: yapılandırma dosyasının sonunda mutlaka catch-all kuralı olmalı, yoksa cloudflared hata verir. http_status:404 bu amaçla kullanılıyor.
DNS Kaydı Oluşturma
Tüneli Cloudflare DNS’e bağlamak için:
# Her hostname için DNS kaydı oluştur
cloudflared tunnel route dns production-web app.orneksite.com
cloudflared tunnel route dns production-web panel.orneksite.com
cloudflared tunnel route dns production-web ssh.orneksite.com
Bu komutlar otomatik olarak Cloudflare DNS’te CNAME kaydı oluşturur. Kayıtlar .cfargotunnel.com hedefine işaret eder ve proxy modu (turuncu bulut) aktif olarak ayarlanır.
Tüneli Servis Olarak Çalıştırma
Tünelin sistem başlangıcında otomatik başlaması için systemd servisi olarak kurmanız gerekiyor:
# Servisi kur
sudo cloudflared service install
# Servisi başlat
sudo systemctl start cloudflared
# Otomatik başlatmayı aktif et
sudo systemctl enable cloudflared
# Durum kontrolü
sudo systemctl status cloudflared
Servis durumunu detaylı görmek için:
# Canlı logları izle
sudo journalctl -u cloudflared -f
# Son 50 satır log
sudo journalctl -u cloudflared -n 50 --no-pager
Gerçek Dünya Senaryosu: Ev Sunucusunu Dışarıya Açma
Diyelim ki evde bir Ubuntu sunucunuz var ve üzerinde şunlar çalışıyor:
- Nextcloud (port 8080)
- Gitea (port 3000)
- Grafana (port 3001)
- SSH erişimi (port 22)
ISP’niz CGNAT kullandığı için doğrudan port yönlendirme yapamıyorsunuz. Cloudflare Tunnel ile bu sorunu tamamen aşabilirsiniz:
tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json
ingress:
- hostname: cloud.evim.com
service: http://localhost:8080
originRequest:
noTLSVerify: true
- hostname: git.evim.com
service: http://localhost:3000
- hostname: grafana.evim.com
service: http://localhost:3001
originRequest:
httpHostHeader: "grafana.evim.com"
- hostname: ssh.evim.com
service: ssh://localhost:22
- service: http_status:404
Bu yapılandırmayla evdeki tüm servislerinize dünyanın her yerinden güvenli şekilde erişebilirsiniz. Router’da tek bir port açmanıza gerek yok.
SSH Tüneli Üzerinden Bağlanma
SSH erişimini de Cloudflare üzerinden geçirmek mümkün. Hem sunucu tarafında hem de istemci tarafında küçük bir yapılandırma gerekiyor.
Sunucu tarafında yapılandırma dosyasına SSH ingress kuralını ekledikten sonra, istemci (bilgisayarınız) tarafında da cloudflared kurulu olması gerekiyor:
# İstemci bilgisayara cloudflared kurulumu (macOS)
brew install cloudflare/cloudflare/cloudflared
# Linux istemci için yukarıdaki kurulum adımları geçerli
İstemci SSH yapılandırmasını düzenleyin:
nano ~/.ssh/config
Şu satırları ekleyin:
Host ssh.evim.com
ProxyCommand cloudflared access ssh --hostname %h
User kullanici_adi
IdentityFile ~/.ssh/id_rsa
Artık normal SSH komutuyla bağlanabilirsiniz:
ssh ssh.evim.com
Bu komut çalıştırıldığında cloudflared otomatik olarak Cloudflare üzerinden tüneli kurar ve SSH bağlantısını sağlar.
Cloudflare Access ile Kimlik Doğrulama Ekleme
Cloudflare Tunnel’ın en güçlü özelliklerinden biri Cloudflare Access ile entegrasyonu. Bu özellikle servislerinize erişmeden önce kimlik doğrulama zorunlu kılabilirsiniz. Ücretsiz planda 50 kullanıcıya kadar Cloudflare Access kullanabilirsiniz.
Cloudflare dashboard’unda Zero Trust > Access > Applications bölümüne gidin. “Add an application” seçeneğiyle yeni uygulama ekleyin. Self-hosted seçeneğini seçin ve alan adınızı girin.
Policy oluşturma aşamasında şu kriterlere göre erişim kısıtlaması yapabilirsiniz:
- Email: Belirli e-posta adreslerine izin ver
- Email domain: Şirket domain’indeki herkesin erişimine izin ver
- IP ranges: Belirli IP bloklarından erişime izin ver
- Country: Ülke bazlı kısıtlama
- One-time PIN: E-posta ile tek kullanımlık kod
Bu yapılandırmayla örneğin Grafana’nızı sadece @sirketiniz.com e-posta adresine sahip kişilerin erişebileceği şekilde ayarlayabilirsiniz. Uygulama kendi login mekanizması olmasa bile Cloudflare katmanında güvenlik sağlanmış olur.
Çoklu Sunucu Yapılandırması
Birden fazla sunucunuz varsa ve hepsini tek alan adı altında yönetmek istiyorsanız, her sunucuda ayrı tünel çalıştırıp DNS kayıtlarını buna göre düzenleyebilirsiniz.
# Sunucu 1'de
cloudflared tunnel create web-server-1
# Sunucu 2'de
cloudflared tunnel create web-server-2
# Sunucu 3'te (veritabanı sunucusu - sadece dahili erişim)
cloudflared tunnel create db-server
Her sunucunun config dosyasını kendi servislerine göre düzenleyebilirsiniz. Bu yaklaşımın güzel yanı şu: tüm bu sunucular internete kapalı olabilir, sadece Cloudflare’e bağlantı açabilmeleri yeterli.
Yük dengeleme için de Cloudflare Tunnel kullanılabilir. Aynı hostname için birden fazla tünel tanımlandığında Cloudflare bunlar arasında otomatik yük dengeleme yapar, bir tünel çökerse diğerine yönlendirir.
Sorun Giderme
Tünel çalışmıyorsa sırayla şunları kontrol edin:
# Tünel bağlantı durumunu kontrol et
cloudflared tunnel info production-web
# Yapılandırma dosyasını test et
cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate
# Belirli bir hostname'i test et
cloudflared tunnel --config /etc/cloudflared/config.yml ingress rule https://app.orneksite.com
# Bağlantı tanısı çalıştır
cloudflared tunnel diag
Sık karşılaşılan sorunlar ve çözümleri:
- “failed to sufficiently increase receive buffer size” hatası: Kernel parametrelerini ayarlamanız gerekebilir.
sudo sysctl -w net.core.rmem_max=2500000komutunu çalıştırın ve/etc/sysctl.confdosyasına bu satırı ekleyin - DNS kaydı görünmüyor: Cloudflare dashboard’unda DNS bölümüne bakın, CNAME kaydı oluşturulmuş mu kontrol edin. Proxy modunun açık olması gerekiyor
- Servis erişilemiyor ama tünel çalışıyor: Servisin gerçekten
localhostüzerinde belirtilen portta çalıştığından emin olun.ss -tlnp | grep PORTkomutuyla kontrol edebilirsiniz - TLS sertifika hatası: Eğer origin servisiniz self-signed sertifika kullanıyorsa
noTLSVerify: trueekleyin
# Servis portunu kontrol et
ss -tlnp | grep 3000
# Tünel loglarını gerçek zamanlı izle
sudo journalctl -u cloudflared -f --output=cat
Güvenlik Önerileri
Cloudflare Tunnel kullandığınızda bile uygulamanız gereken güvenlik pratikleri var:
Sunucu firewall’ını aktif tutun ve sadece giden bağlantılara izin verin. Cloudflare Tunnel’ın çalışması için giden HTTPS (443) yeterli:
# UFW ile örnek yapılandırma
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh # Eğer lokal erişim için SSH tutmak istiyorsanız
sudo ufw enable
Dikkat edin: SSH’ı tamamen kapatırsanız sunucuya yerel ağdan da bağlanamazsınız. Genellikle yerel ağdan SSH’ı açık tutmak, sadece dışarıdan gelenleri engellemek daha mantıklı.
cloudflared daemon’ını root ile çalıştırmak yerine özel bir kullanıcıyla çalıştırın:
# Özel kullanıcı oluştur
sudo useradd -r -s /sbin/nologin cloudflared-user
# Credential dosyasının sahipliğini değiştir
sudo chown cloudflared-user:cloudflared-user /root/.cloudflared/*.json
# systemd servis dosyasını düzenle
sudo nano /etc/systemd/system/cloudflared.service
Servis dosyasına User=cloudflared-user satırını ekleyerek daemon’ın düşük yetkiyle çalışmasını sağlayabilirsiniz.
Performans Tuning
Yüksek trafikli uygulamalar için bazı optimizasyonlar yapılabilir:
tunnel: a1b2c3d4-e5f6-7890-abcd-ef1234567890
credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json
# Genel origin ayarları
originRequest:
connectTimeout: 30s
tlsTimeout: 30s
tcpKeepAlive: 30s
keepAliveConnections: 10
keepAliveTimeout: 90s
ingress:
- hostname: app.orneksite.com
service: http://localhost:3000
originRequest:
httpHostHeader: "app.orneksite.com"
connectTimeout: 10s
- service: http_status:404
Cloudflare ücretsiz planda HTTP/2 ve gzip sıkıştırma otomatik olarak aktif gelir. Pro plana geçerseniz HTTP/3 (QUIC) desteği de eklenir, bu özellikle yüksek latency bağlantılarda ciddi performans farkı yaratır.
Sonuç
Cloudflare Tunnel, özellikle ev sunucuları, CGNAT arkasındaki sistemler ve güvenlik gereksinimi yüksek ortamlar için mükemmel bir çözüm. Kurulumu görece basit, bakım maliyeti düşük ve ücretsiz planda bile oldukça yetenekli.
Öne çıkan pratik faydaları özetlemek gerekirse: ISP bağımsızlığı sayesinde dinamik IP veya CGNAT sorunu ortadan kalkıyor. Sunucu IP adresiniz tamamen gizli kalıyor, port tarama saldırılarından doğal olarak korunuyorsunuz. Cloudflare Access entegrasyonuyla ek bir authentication katmanı ekliyorsunuz ve bu tamamen ücretsiz. Birden fazla servis ve sunucuyu tek yerden yönetmek son derece kolay hale geliyor.
Elbette sınırlılıkları da var. UDP tabanlı servisler (oyun sunucuları gibi) için Cloudflare Tunnel uygun değil, sadece TCP destekleniyor. Ücretsiz planda bant genişliği sınırlamaları var ve Cloudflare’in hizmet koşullarına göre bazı kullanım senaryoları kısıtlanabiliyor. Tamamen Cloudflare’e bağımlı bir altyapı oluşturduğunuzun da farkında olmak gerekiyor.
Ama genel ihtiyaçlar için, özellikle web uygulamaları ve iç araçlar için Cloudflare Tunnel’dan daha pratik ve güvenli bir çözüm bulmak gerçekten zor. Karmaşık firewall kuralları, port yönlendirme, Let’s Encrypt sertifika yenileme script’leri derken uğraştığınız vakitleri düşünün. Cloudflare Tunnel bu karmaşıklığın büyük çoğunluğunu ortadan kaldırıyor.
