Geçenlerde bir üretim ERP’sinin dahili API’ını, dışarıdan erişilebilir hale getirmem gerektiğinde, firewall’da port açma fikri bile içimi rahatsız etti. Geleneksel yöntemlerle bir servisi internete açmak, genellikle güvenlik duvarında belirli portları açmayı ve reverse proxy yapılandırmayı gerektirir; bu da potansiyel saldırı yüzeyini artırır ve DDoS gibi tehditlere karşı doğrudan savunmasız kalmak demektir. İşte tam bu noktada Cloudflare Tunnel, self-hosted servisleri güvenli bir şekilde yayınlamak için outbound-only bir çözüm sunarak bu sorunları ortadan kaldırıyor.
Cloudflare Tunnel, sunucunuzdan Cloudflare ağına doğru şifreli bir tünel oluşturarak, hiçbir gelen portu açmadan servislerinizi internete güvenle çıkarmanızı sağlar. Bu sayede sunucunuzun IP adresi gizli kalır, doğrudan saldırılara maruz kalmaz ve Cloudflare’ın geniş güvenlik katmanlarından (DDoS koruması, WAF, kimlik doğrulama) faydalanmış olursunuz. Ben de bu yazıda, kendi tecrübelerimden yola çıkarak Cloudflare Tunnel’ı nasıl kurup yapılandırdığımızı ve bu sürecin beş temel adımını detaylıca anlatacağım.
Cloudflare Tunnel Nedir ve Neden Kullanmalıyız?
Cloudflare Tunnel, kendi sunucunuzda çalışan cloudflared adında hafif bir agent aracılığıyla, sunucunuzdan Cloudflare ağına doğru kalıcı, şifreli bir bağlantı kuran bir Zero Trust servisidir. Geleneksel yaklaşımların aksine, sunucunuzun güvenlik duvarında herhangi bir gelen (inbound) port açmanıza gerek kalmaz; tüm trafik bu tünel üzerinden, Cloudflare’ın global ağı aracılığıyla yönlendirilir.
Bu yaklaşım, özellikle kendi ev sunucularında veya şirket içi altyapılarda servis yayınlayanlar için ciddi güvenlik avantajları sunar. Sunucunuzun gerçek IP adresi gizlenir, doğrudan DDoS saldırılarına veya port taramalarına karşı korunursunuz ve Cloudflare’ın WAF (Web Application Firewall) gibi ek güvenlik özelliklerinden otomatik olarak faydalanırsınız. Bir müşterinin dahili uygulamasını dışarıdan erişilebilir kılarken, VPN’siz ve firewall’da port açmadan bu yolu seçtiğimde, kurulumun basitliği ve sağladığı güvenlik beni oldukça etkilemişti.
graph TD; A["Kullanıcı"] --> B["Cloudflare Edge"]; B --> C["Cloudflare Tunnel"]; C --> D["cloudflared agent (sunucuda)"]; D --> E["Self-Hosted Servis"];
Yukarıdaki diyagram, Cloudflare Tunnel’ın temel çalışma prensibini gösteriyor. Kullanıcıdan gelen istekler önce Cloudflare’ın dünya çapındaki edge sunucularına ulaşır, buradan güvenli tünel aracılığıyla cloudflared agent’ına, o da son olarak yerel servisinize iletir. Bu akış, hem performansı optimize eder hem de güvenlik katmanlarını devreye sokar.
Cloudflare Tunnel Kurulumuna Nasıl Başlanır?
Cloudflare Tunnel’ı kullanmaya başlamak için ilk adım, sunucunuza cloudflared agent’ını kurmak ve Cloudflare hesabınıza bağlamaktır. Bu agent, tüneli oluşturan ve gelen istekleri doğru servislere yönlendiren kritik bileşendir. Ben genelde Linux sunucularda çalıştığım için, kurulum adımlarını Ubuntu/Debian tabanlı sistemler üzerinden örnekleyeceğim, ancak cloudflared neredeyse tüm popüler işletim sistemlerinde desteklenir.
İlk olarak, cloudflared binary’sini resmi Cloudflare deposundan indirip sisteminize kurmanız gerekir:
# İlk olarak Cloudflare GPG anahtarını ekleyin
curl -fsSL https://pkg.cloudflare.com/cloudflare-req.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloudflare-archive-keyring.gpg
# Sonra Cloudflare deposunu sources.list.d dizinine ekleyin
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
# Paket listesini güncelleyin ve cloudflared'ı kurun
sudo apt update
sudo apt install cloudflared
Kurulum tamamlandıktan sonra, cloudflared’ı Cloudflare hesabınızla kimlik doğrulamanız gerekiyor. Bu işlem, bir tarayıcı aracılığıyla yapılır ve tünelinizi yönetmek için gerekli kimlik bilgilerini indirir.
cloudflared tunnel login
Bu komut, size bir URL sağlayacak ve bu URL’yi tarayıcınızda açarak Cloudflare hesabınıza giriş yapmanızı isteyecektir. Başarılı bir girişin ardından cert.pem adında bir sertifika dosyası oluşacak ve cloudflared agent’ınız Cloudflare hesabınızla ilişkilendirilmiş olacaktır.
Yeni Bir Cloudflare Tunnel Nasıl Oluşturulur ve Servisler Nasıl Tanımlanır?
cloudflared agent’ını kurup kimlik doğrulamasını yaptıktan sonra, artık ilk tünelinizi oluşturmaya hazırsınız. Bir tünel oluşturmak, aslında Cloudflare ağı üzerinde kalıcı bir bağlantı noktası tanımlamak ve bu tünel üzerinden hangi servislerin yayınlanacağını belirtmek anlamına gelir.
Önce tünelinizi oluşturun ve ona bir isim verin:
cloudflared tunnel create my-erp-tunnel
Bu komut, tünel için benzersiz bir UUID (Universally Unique Identifier) ve bir kimlik doğrulama anahtarı oluşturacaktır. Çıktıda verilen UUID’yi not alın, çünkü bu, tünelinizin benzersiz tanımlayıcısıdır.
Şimdi bu tünel için bir yapılandırma dosyası (config.yml) oluşturmamız gerekiyor. Bu dosya, tünelin hangi alan adları üzerinden erişilebilir olacağını ve bu alan adlarına gelen isteklerin hangi yerel servislere yönlendirileceğini tanımlar. Ben genellikle /etc/cloudflared/ dizininde bir yapılandırma dosyası oluşturmayı tercih ediyorum.
# /etc/cloudflared/config.yml
tunnel: <TUNNEL_UUID> # Yukarıdaki create komutundan aldığınız UUID
credentials-file: /root/.cloudflared/<TUNNEL_UUID>.json # Kimlik doğrulama dosyası
ingress:
- hostname: erp.example.com
service: http://localhost:8000 # Yerel ERP API'm
- hostname: dashboard.example.com
service: http://localhost:3000 # Yerel yönetici paneli
- service: http_status:404 # Tanımlanmayan diğer istekler için 404 dön
Bu config.yml dosyasında, <TUNNEL_UUID> yerine kendi tünelinizin UUID’sini ve <TUNNEL_UUID>.json yerine de kimlik doğrulama dosyanızın adını yazmalısınız. ingress bölümü, gelen isteklerin nasıl yönlendirileceğini belirler. Burada erp.example.com adresine gelen isteklerin localhost:8000 portundaki servise, dashboard.example.com adresine gelen isteklerin ise localhost:3000 portundaki servise yönlendirileceğini tanımladım. Son service: http_status:404 kuralı ise hiçbir kurala uymayan istekler için bir fallback görevi görür.
Yapılandırma dosyasını kaydettikten sonra, Cloudflare DNS panelinizde erp.example.com ve dashboard.example.com için CNAME kayıtları oluşturmanız ve bu kayıtları tünelinize yönlendirmeniz gerekir. Bu kayıtlar CNAME olarak tünelinizin UUID’si ile ilişkilendirilmiş cfargotunnel.com adresine işaret etmelidir (örneğin: erp.example.com CNAME <TUNNEL_UUID>.cfargotunnel.com).
Son olarak, cloudflared tünelini bir systemd servisi olarak çalıştırmalıyız ki sunucu yeniden başladığında otomatik olarak devreye girsin ve arka planda sürekli çalışsın.
# systemd servis dosyasını oluşturun
sudo nano /etc/systemd/system/[email protected]
İçeriği aşağıdaki gibi düzenleyin:
[Unit]
Description=Cloudflared Tunnel %i
After=network-online.target
[Service]
ExecStart=/usr/bin/cloudflared tunnel --config /etc/cloudflared/config.yml run %i
Restart=on-failure
RestartSec=5s
User=root # veya başka bir kullanıcı
Group=root # veya başka bir grup
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=yes
StandardOutput=journal
StandardError=journal
SyslogIdentifier=cloudflared-%i
[Install]
WantedBy=multi-user.target
Servis dosyasını kaydettikten sonra, systemd’yi güncelleyin ve servisi başlatın:
sudo systemctl daemon-reload
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
journalctl -u [email protected] komutuyla tünelin durumunu ve loglarını kontrol edebilirsiniz. Tünel başarılı bir şekilde çalışmaya başladığında, belirlediğiniz alan adları üzerinden yerel servislerinize erişebileceksiniz. Bir süre önce kendi yan ürünümün finansal hesaplayıcılarının backend’ini bu yolla yayınlamıştım ve kurulumun ne kadar basit ve güvenli olduğunu görmüştüm.
SSH ve Diğer TCP Servisleri İçin Tünel Yapılandırması
Cloudflare Tunnel sadece HTTP/S servisleri için değil, SSH, RDP veya herhangi bir TCP servisi için de kullanılabilir. Bu, özellikle sunucularınıza güvenli bir şekilde uzaktan erişmek istediğinizde çok işe yarar. config.yml dosyasında ingress kurallarına ek olarak tunnel komutunu ssh için kullanabiliriz.
SSH erişimi için config.yml dosyasını aşağıdaki gibi güncelleyebiliriz:
# /etc/cloudflared/config.yml (devamı)
# ... mevcut ingress kuralları ...
- service: ssh://localhost:22 # SSH servisi için
hostname: ssh.example.com
originRequest:
noTLSVerify: true # Yerel SSH servisi genellikle TLS kullanmaz
Ardından, Cloudflare panelinde ssh.example.com için bir CNAME kaydı oluşturmayı unutmayın. Daha sonra, SSH istemcinizden bu tüneli kullanmak için ~/.ssh/config dosyanıza aşağıdaki gibi bir yapılandırma ekleyebilirsiniz:
Host ssh.example.com
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
Bu yapılandırma sayesinde, ssh ssh.example.com komutunu çalıştırdığınızda, SSH trafiğiniz Cloudflare Tunnel üzerinden güvenli bir şekilde yönlendirilecektir. Bu, geleneksel VPN bağlantılarına harika bir alternatif sunar ve Zero Trust prensiplerini SSH erişiminize de taşır.
Cloudflare Tunnel’ın Güvenlik Faydaları Nelerdir?
Cloudflare Tunnel kullanmak, self-hosted servislerinizin güvenlik duruşunu önemli ölçüde artıran bir dizi fayda sağlar. Bu faydalar, geleneksel yöntemlerle elde etmesi zor veya maliyetli olabilecek katmanlı bir savunma mekanizması oluşturur.
- Gelen Port Yok, Saldırı Yüzeyi Azalır: Sunucunuzda hiçbir gelen port açılmadığı için, potansiyel saldırganlar sunucunuzun IP adresini doğrudan hedef alamazlar. Port taramaları, zayıf parolalı SSH denemeleri veya bilinmeyen zafiyetlere karşı sunucunuz çok daha güvenli hale gelir. Kendi geliştirdiğim Android spam engelleyici uygulamasının backend API’ını korumak için benzer bir yapı kurduğumda, dışarıya kapalı bir sunucuda çalışmanın verdiği rahatlığı yaşamıştım.
- Origin IP Gizleme: Servisleriniz Cloudflare üzerinden yayınlandığı için, sunucunuzun gerçek IP adresi internete ifşa olmaz. Bu, hedefli saldırıları ve bilgi toplama girişimlerini zorlaştırır.
- DDoS ve Bot Koruması: Tüm trafik Cloudflare ağı üzerinden geçtiği için, Cloudflare’ın geniş DDoS koruma ve bot yönetim sistemlerinden otomatik olarak faydalanırsınız. Bu, özellikle yüksek trafikli uygulamalar veya potansiyel saldırı riski taşıyan servisler için hayati öneme sahiptir.
- Web Uygulaması Güvenlik Duvarı (WAF): HTTP/S trafiği için Cloudflare WAF, SQL injection, XSS gibi yaygın web saldırılarına karşı koruma sağlar. Bu, uygulamanızdaki olası güvenlik açıklarını kapatmaya yardımcı olur.
- Kimlik Doğrulama ve Yetkilendirme (Cloudflare Access): Cloudflare Access ile tünel üzerinden yayınladığınız servislere erişimi kullanıcı bazında kısıtlayabilirsiniz. Örneğin, Google Workspace, Okta veya Azure AD gibi Identity Provider’lar (IdP) ile entegre olarak yalnızca belirli kullanıcıların veya grupların erişmesine izin verebilirsiniz. Bu, dahili araçlar veya yönetici panelleri için mükemmel bir güvenlik katmanıdır. JWT ve OAuth2 desenlerini kullanarak bu tür kimlik doğrulama mekanizmalarını birden fazla projede uyguladık.
- Trafik Şifrelemesi:
cloudflaredagent’ı ile Cloudflare Edge arasındaki tüm trafik TLS ile şifrelenir. Bu, verilerinizin aktarım sırasında güvenliğini sağlar.
Bu faydaların birleşimi, Cloudflare Tunnel’ı self-hosted servisler için sadece bir erişim çözümü olmaktan çıkarıp, kapsamlı bir güvenlik stratejisinin temel taşı haline getirir.
Cloudflare Tunnel Kullanırken Karşılaşılan Zorluklar ve Trade-off’lar Nelerdir?
Cloudflare Tunnel’ın sunduğu birçok avantajın yanı sıra, her teknoloji gibi onun da kendine özgü zorlukları ve trade-off’ları vardır. Bu noktaları göz önünde bulundurarak, projeniz için doğru kararı verebilirsiniz.
- Vendor Lock-in: Cloudflare Tunnel’ı kullandığınızda, Cloudflare ekosistemine bağlanmış olursunuz. DNS yönetiminden tünel yapılandırmasına kadar birçok bileşen Cloudflare’a bağımlı hale gelir. Bu, uzun vadede farklı bir sağlayıcıya geçişi zorlaştırabilir veya ek maliyetler doğurabilir. Ben genelde altyapıda mümkün olduğunca açık kaynak ve esnek çözümler kullanmayı severim, ancak Cloudflare’ın sunduğu kolaylık ve güvenlik bazen bu “lock-in” riskini göze almaya değer kılıyor.
- Performans Etkisi: Trafiğin sunucunuzdan Cloudflare ağına ve oradan kullanıcıya gitmesi, geleneksel doğrudan bağlantıya göre ek bir “hop” ekler. Çoğu durumda bu etki ihmal edilebilir düzeyde olsa da, ultra düşük gecikme süresi gerektiren uygulamalar için dikkate alınmalıdır. Cloudflare’ın geniş ağı sayesinde bu gecikme genellikle minimize edilir, ancak yine de bir faktördür.
cloudflaredAgent’ının Güvenilirliği:cloudflaredagent’ı genellikle stabil çalışsa da, sunucunuzdaki kaynak sınırlamaları (CPU, bellek) veya ağ sorunları nedeniyle beklenmedik şekilde durabilir. Bir projedecloudflaredservisi beklenmedik şekilde durduğunda,systemdunit’iniRestart=on-failureveRestartSecgibi parametrelerle doğru yapılandırmanın ne kadar önemli olduğunu bir kez daha anladım. Hatta bazen OOM-killed olduğu durumlar bile oldu, bu yüzdencgrouplimitlerini ayarlamak gerekebiliyor.- Hata Ayıklama Karmaşıklığı: Sorun giderme süreçleri, geleneksel setup’lara göre biraz daha karmaşık olabilir. Hata, tünelin kendisinde mi, Cloudflare Edge’de mi, yoksa arka uç servisinde mi diye ayıklamak zaman alabilir.
journalctlçıktılarını ve Cloudflare dashboard’daki logları dikkatlice incelemek, bu süreçte kritik öneme sahiptir. - Ücretsiz Katman Limitleri: Cloudflare’ın ücretsiz katmanı birçok kullanıcı için yeterli olsa da, belirli trafik veya özellik limitleri olabilir. Daha gelişmiş güvenlik özellikleri (örneğin daha kapsamlı WAF kuralları) veya daha yüksek bant genişliği gerektiren senaryolar için ücretli planlara geçmek gerekebilir.
Bu zorlukları ve trade-off’ları bilmek, Cloudflare Tunnel’ı stratejik olarak kullanmanıza yardımcı olur. Her araç gibi, doğru senaryoda ve doğru beklentilerle kullanıldığında en yüksek faydayı sağlar.
Tünel Altyapısını Nasıl İzler ve Yönetiriz?
Bir Cloudflare Tunnel’ı kurmak sadece başlangıçtır; asıl mesele, onun stabil ve güvenli bir şekilde çalışmasını sağlamaktır. Tünel altyapınızı etkin bir şekilde izlemek ve yönetmek, olası sorunları proaktif olarak tespit etmek ve hizmet kesintilerini önlemek için hayati öneme sahiptir.
-
cloudflaredLoglarını Takip Etme:cloudflaredagent’ı, çalıştığı süre boyunca önemli loglar üretir. Bu loglar, tünelin durumu, gelen istekler, hata mesajları ve bağlantı sorunları hakkında değerli bilgiler içerir.systemdservisi olarak çalıştırdığımızda, loglarıjournalctlüzerinden kolayca takip edebiliriz:journalctl -u [email protected] -fBu komut, tünelin anlık log akışını gösterir ve herhangi bir anormallik durumunda hızlıca müdahale etmemizi sağlar. Geçen ay bir VPS’te
cloudflared’ınOOM-killedolduğunujournalctlçıktılarından görmüş, sonrasındacgroupmemory limit’lerini ayarlayarak sorunu çözmüştüm. -
Cloudflare Dashboard Üzerinden İzleme: Cloudflare paneli, tünellerinizi yönetmek ve durumlarını izlemek için merkezi bir arayüz sunar. Buradan tünellerinizin aktif olup olmadığını görebilir, trafik istatistiklerini inceleyebilir ve Access politikalarını yönetebilirsiniz. Dashboard, özellikle birden fazla tüneliniz olduğunda genel bir bakış sağlamak için kullanışlıdır.
-
Otomatik Güncelleme Stratejileri:
cloudflaredagent’ı zaman zaman yeni özellikler veya güvenlik yamaları ile güncellenir. Bu güncellemeleri düzenli olarak uygulamak, tünelinizin hem performansını hem de güvenliğini artırır.aptveyayumgibi paket yöneticileri kullanılarak kurulancloudflaredsürümleri, sistemin normal güncelleme akışına dahil edilebilir. Ancak bazen manuel kontrol ve test yapmak, özellikle üretim ortamlarında, daha güvenli bir yaklaşımdır.sudo apt update && sudo apt upgrade cloudflared -
Yüksek Erişilebilirlik (High Availability) İçin Birden Fazla Agent: Kritik servisler için tek bir
cloudflaredagent’ının arızalanma riskini azaltmak adına, aynı tünel için birden fazla sunucudacloudflaredagent’ı çalıştırabilirsiniz. Cloudflare, tünel UUID’si aynı olduğu sürece bu agent’lar arasında otomatik olarak yük dengelemesi yapar. Bu, bir agent çevrimdışı kalsa bile servisinizin erişilebilir kalmasını sağlar. Bir üretim ortamında ERP’nin API’ı için bu yapıyı kullanmak, servis sürekliliği açısından bize büyük bir rahatlık sağlamıştı. -
Sağlık Kontrolleri ve Uyarılar: Tünel üzerinden yayınladığınız servislerin sağlık durumunu izlemek ve olası sorunlarda uyarı almak için Cloudflare’ın sağlık kontrolü özelliklerini veya Prometheus/Grafana gibi harici izleme araçlarını entegre edebilirsiniz. Bu, tünelin kendisi sorunsuz çalışsa bile, arkasındaki servisin erişilemez hale gelmesi durumunda sizi bilgilendirir.
Bu yönetim ve izleme pratikleri, Cloudflare Tunnel kurulumunuzun sadece çalışmasını değil, aynı zamanda güvenilir ve sürdürülebilir olmasını da garanti altına alır.
Sonuç
Cloudflare Tunnel, self-hosted servisleri internete güvenli bir şekilde açmak isteyen herkes için güçlü ve pratik bir çözüm sunuyor. Geleneksel port açma yöntemlerinin getirdiği güvenlik risklerini ortadan kaldırırken, Cloudflare’ın geniş güvenlik ve performans özelliklerinden faydalanmanızı sağlıyor. Kendi tecrübelerimden de gördüğüm gibi, özellikle Zero Trust prensiplerini uygulamak, saldırı yüzeyini azaltmak ve uzaktan erişim süreçlerini basitleştirmek adına Cloudflare Tunnel vazgeçilmez bir araç haline geliyor.
Kurulumun basitliği, esnek yapılandırma seçenekleri ve sağladığı katmanlı güvenlik faydaları, onu hem küçük kişisel projeler hem de büyük kurumsal uygulamalar için cazip kılıyor. Elbette, her teknoloji gibi trade-off’ları ve yönetim gereksinimleri var; ancak bu adımları doğru uyguladığınızda, self-hosted altyapınızın güvenliğini önemli ölçüde artırabilir ve operasyonel yükünüzü hafifletebilirsiniz. Bir sonraki adım, Cloudflare Access ile bu tüneller üzerinden yayınladığınız servislere erişimi daha da kısıtlamak ve kimlik doğrulama katmanını eklemek olacaktır.