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=2500000 komutunu çalıştırın ve /etc/sysctl.conf dosyası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 PORT komutuyla kontrol edebilirsiniz
  • TLS sertifika hatası: Eğer origin servisiniz self-signed sertifika kullanıyorsa noTLSVerify: true ekleyin
# 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir