Cloudflare Spectrum ile TCP ve UDP Proxy Nasıl Yapılandırılır

Cloudflare’in sunduğu hizmetler arasında en az konuşulanlardan biri olan Spectrum, aslında HTTP/HTTPS dışındaki protokolleri de Cloudflare altyapısından geçirmenizi sağlayan güçlü bir araçtır. Bir oyun sunucusu yönetiyorsanız, özel bir TCP tabanlı uygulama çalıştırıyorsanız ya da UDP trafiğini DDoS saldırılarına karşı korumak istiyorsanız, Spectrum tam olarak bu iş için tasarlanmış. Bu yazıda Cloudflare Spectrum’ü baştan sona inceleyeceğiz; nasıl çalıştığını, nasıl yapılandırıldığını ve gerçek dünya senaryolarında nasıl kullanıldığını ele alacağız.

Cloudflare Spectrum Nedir?

Cloudflare Spectrum, TCP ve UDP protokollerini destekleyen bir ters proxy hizmetidir. Normalde Cloudflare yalnızca HTTP ve HTTPS trafiğini proxy’ler. Yani bir web sitesini Cloudflare’in arkasına koyduğunuzda, tüm HTTP istekleri Cloudflare üzerinden geçer ve orijin sunucunuzu gizler. Peki ya SSH bağlantılarınız? Minecraft sunucunuz? MySQL veritabanınız? İşte Spectrum burada devreye giriyor.

Spectrum ile şunları yapabilirsiniz:

  • TCP tabanlı protokolleri (SSH, RDP, MySQL, MongoDB, özel protokoller) Cloudflare ağı üzerinden proxy’leyebilirsiniz
  • UDP tabanlı protokolleri (oyun sunucuları, DNS, VoIP) Cloudflare’in DDoS korumasından yararlandırabilirsiniz
  • Gerçek kaynak IP adresinizi gizleyebilirsiniz
  • DDoS saldırılarını HTTP dışındaki protokollerde de filtreleyebilirsiniz
  • Coğrafi kısıtlamalar uygulayabilirsiniz

Spectrum, Cloudflare’in Pro, Business ve Enterprise planlarında mevcuttur. Pro planda oldukça kısıtlı özelliklerle gelir, Business planda daha kapsamlı kullanım sunar, Enterprise’da ise tam potansiyeline ulaşır. Fiyatlandırma veri aktarımına ve bağlantı sayısına göre değişir.

Spectrum Nasıl Çalışır?

Normal bir Cloudflare DNS kaydında, bir A veya AAAA kaydı oluşturup proxy seçeneğini etkinleştirdiğinizde, bu yalnızca 80 ve 443 portları için işe yarar. Spectrum ise bu sınırlamayı ortadan kaldırır.

Spectrum üzerinden bir uygulama tanımladığınızda şu akış gerçekleşir:

  1. Kullanıcı, örneğin ssh.domain.com:22 adresine bağlanır
  2. DNS sorgusu yapıldığında, Cloudflare’in IP adresleri döner (gerçek sunucunuzun değil)
  3. Bağlantı Cloudflare’in edge sunucusuna ulaşır
  4. Cloudflare, DDoS filtresi ve IP erişim kontrollerini uygular
  5. Temizlenmiş trafik, gerçek sunucunuza iletilir

Bu yapı sayesinde gerçek sunucu IP’niz hiçbir zaman dışarıya görünmez. Saldırganlar Cloudflare’in IP’lerine saldırabilir, ama bu sizi etkilemez çünkü Cloudflare’in kapasitesi çok daha büyüktür.

Cloudflare API ile Spectrum Uygulaması Oluşturma

Cloudflare Dashboard üzerinden Spectrum yapılandırması yapabilirsiniz, ancak otomasyon için API kullanmak çok daha pratiktir. Önce gerekli bilgileri hazırlayalım.

# Cloudflare API token ve Zone ID'yi ortam değişkenlerine atalım
export CF_API_TOKEN="your_cloudflare_api_token_here"
export CF_ZONE_ID="your_zone_id_here"

# Zone ID'yi API üzerinden öğrenmek için
curl -s -X GET "https://api.cloudflare.com/client/v4/zones" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" | jq '.result[] | {name: .name, id: .id}'

Şimdi bir Spectrum uygulaması oluşturalım. Önce SSH için basit bir örnek yapalım:

# SSH için Spectrum uygulaması oluşturma
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "protocol": "tcp/22",
    "dns": {
      "type": "CNAME",
      "name": "ssh.example.com"
    },
    "origin_dns": {
      "name": "origin.example.com",
      "ttl": 1200
    },
    "origin_port": 22,
    "ip_firewall": true,
    "proxy_protocol": "off",
    "tls": "off",
    "traffic_type": "direct",
    "edge_ips": {
      "type": "dynamic",
      "connectivity": "all"
    }
  }' | jq '.'

Bu komut, ssh.example.com:22 adresine gelen tüm TCP bağlantılarını, origin.example.com:22 adresine iletecek bir Spectrum uygulaması oluşturur.

Gerçek Dünya Senaryosu 1: Oyun Sunucusu Koruması

Minecraft, CS:GO veya benzeri oyun sunucuları UDP tabanlı DDoS saldırılarının en sık hedeflerinden biridir. Rakip sunucular veya kötü niyetli oyuncular, sunucunuzu çevrimdışı yapmak için amplifikasyon saldırıları düzenleyebilir. Spectrum burada çok işe yarıyor.

Bir Minecraft Java Edition sunucusu için Spectrum yapılandırması (TCP/25565):

# Minecraft Java Edition için Spectrum uygulaması
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "protocol": "tcp/25565",
    "dns": {
      "type": "CNAME",
      "name": "mc.example.com"
    },
    "origin_dns": {
      "name": "mc-origin.example.com",
      "ttl": 600
    },
    "origin_port": 25565,
    "ip_firewall": true,
    "proxy_protocol": "off",
    "tls": "off",
    "traffic_type": "direct"
  }' | jq '.result | {id: .id, dns_name: .dns.name, protocol: .protocol}'

Bedrock Edition için UDP kullanmak gerekiyor:

# Minecraft Bedrock Edition için UDP Spectrum uygulaması
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "protocol": "udp/19132",
    "dns": {
      "type": "CNAME",
      "name": "bedrock.example.com"
    },
    "origin_dns": {
      "name": "mc-origin.example.com",
      "ttl": 600
    },
    "origin_port": 19132,
    "ip_firewall": true,
    "proxy_protocol": "off",
    "traffic_type": "direct"
  }' | jq '.'

Sunucu tarafında da güvenlik duvarını düzgün yapılandırmanız gerekiyor. Cloudflare’in Spectrum için kullandığı IP aralıkları belgelenmiştir. Sadece bu IP’lerden gelen bağlantıları kabul edecek şekilde iptables kuralları ekleyin:

#!/bin/bash
# Cloudflare Spectrum IP'lerinden Minecraft portuna izin ver
# Diğer tüm kaynaklardan gelen bağlantıları engelle

# Cloudflare IPv4 aralıklarını indir ve iptables kurallarına ekle
CLOUDFLARE_IPS=$(curl -s https://www.cloudflare.com/ips-v4)

# Önce mevcut kuralları temizle
iptables -F INPUT

# Loopback'e izin ver
iptables -A INPUT -i lo -j ACCEPT

# Mevcut bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH için sadece yönetim IP'nize izin verin
iptables -A INPUT -p tcp --dport 22 -s YOUR_MANAGEMENT_IP -j ACCEPT

# Cloudflare Spectrum IP'lerinden oyun portlarına izin ver
for ip in $CLOUDFLARE_IPS; do
    iptables -A INPUT -p tcp --dport 25565 -s $ip -j ACCEPT
    iptables -A INPUT -p udp --dport 19132 -s $ip -j ACCEPT
done

# Diğer her şeyi engelle
iptables -A INPUT -j DROP

# Kuralları kalıcı hale getir
iptables-save > /etc/iptables/rules.v4
echo "Güvenlik duvarı kuralları uygulandı."

Gerçek Dünya Senaryosu 2: Veritabanı Erişimini Güvenli Hale Getirme

Bu biraz tartışmalı bir kullanım senaryosu olsa da bazı durumlarda uzak ekipler için veritabanı erişimini Spectrum üzerinden yönlendirmek mantıklı olabilir. Özellikle IP whitelist yönetimi zorlaştığında ve VPN kurmak çok karmaşık geldiğinde bu yaklaşım işe yarıyor.

MySQL için Spectrum yapılandırması:

# MySQL için Spectrum uygulaması (dikkatli kullanın!)
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "protocol": "tcp/3306",
    "dns": {
      "type": "CNAME",
      "name": "db.example.com"
    },
    "origin_dns": {
      "name": "db-origin.example.com",
      "ttl": 600
    },
    "origin_port": 3306,
    "ip_firewall": true,
    "proxy_protocol": "v2",
    "tls": "off",
    "traffic_type": "direct"
  }' | jq '.'

Burada proxy_protocol: v2 seçeneğini kullandım. Bu, gerçek istemci IP adresinin MySQL sunucusuna iletilmesini sağlar. MySQL loglarında ve bağlantı istatistiklerinde gerçek IP’yi görmek için bu önemlidir.

MySQL tarafında ise ProxyProtocol desteği için bir proxy katmanı kullanmanız gerekir. HAProxy bu iş için idealdir:

# /etc/haproxy/haproxy.cfg
# Spectrum'den gelen Proxy Protocol v2 bağlantılarını MySQL'e iletmek için

global
    log /dev/log local0
    maxconn 4096
    daemon

defaults
    mode tcp
    log global
    option tcplog
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend mysql_frontend
    bind *:3306 accept-proxy
    default_backend mysql_backend

backend mysql_backend
    server mysql_primary 127.0.0.1:3307 check

Bu yapılandırmayla HAProxy, 3306 portunda Proxy Protocol ile gelen bağlantıları kabul eder ve gerçek MySQL daemon’ına (3307’de çalışan) iletir.

Spectrum Uygulamalarını Yönetme

Mevcut Spectrum uygulamalarınızı listelemek ve yönetmek için şu komutları kullanabilirsiniz:

#!/bin/bash
# Tüm Spectrum uygulamalarını listele ve özet bilgi göster

CF_API_TOKEN="your_token"
CF_ZONE_ID="your_zone_id"

echo "=== Mevcut Spectrum Uygulamaları ==="
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" | 
  jq -r '.result[] | "ID: (.id)nProtokol: (.protocol)nDNS: (.dns.name)nOrigin: (.origin_dns.name):(.origin_port)nIP Firewall: (.ip_firewall)n---"'

# Belirli bir uygulamayı silmek için
delete_spectrum_app() {
    local APP_ID=$1
    curl -s -X DELETE 
        "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps/$APP_ID" 
        -H "Authorization: Bearer $CF_API_TOKEN" 
        -H "Content-Type: application/json" | 
        jq '{success: .success, errors: .errors}'
}

# Kullanım: delete_spectrum_app "app_id_here"

Terraform ile Spectrum Yönetimi

Infrastructure as Code yaklaşımını benimsiyorsanız, Spectrum yapılandırmalarını Terraform ile yönetebilirsiniz. Bu, özellikle birden fazla uygulama veya ortam yönetirken büyük kolaylık sağlar.

# main.tf - Cloudflare Spectrum Terraform Konfigürasyonu

terraform {
  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "~> 4.0"
    }
  }
}

provider "cloudflare" {
  api_token = var.cloudflare_api_token
}

# SSH Spectrum uygulaması
resource "cloudflare_spectrum_application" "ssh" {
  zone_id      = var.zone_id
  protocol     = "tcp/22"
  traffic_type = "direct"
  ip_firewall  = true

  dns {
    type = "CNAME"
    name = "ssh.${var.domain}"
  }

  origin_dns {
    name = "origin.${var.domain}"
    ttl  = 1200
  }

  origin_port    = 22
  proxy_protocol = "off"
  tls            = "off"
}

# Minecraft Spectrum uygulaması
resource "cloudflare_spectrum_application" "minecraft" {
  zone_id      = var.zone_id
  protocol     = "tcp/25565"
  traffic_type = "direct"
  ip_firewall  = true

  dns {
    type = "CNAME"
    name = "mc.${var.domain}"
  }

  origin_dns {
    name = "game-server.${var.domain}"
    ttl  = 600
  }

  origin_port    = 25565
  proxy_protocol = "off"
  tls            = "off"
}

Spectrum ile IP Firewall Kullanımı

Spectrum’ün IP Firewall özelliği, belirli ülkelerin veya IP aralıklarının bağlantılarını engellemenizi sağlar. Bu, coğrafi kısıtlama veya bilinen kötü niyetli IP bloklarını engelleme için kullanışlıdır.

Cloudflare Dashboard üzerinden Spectrum uygulamanızı seçip “IP Access Rules” bölümünden bu kuralları tanımlayabilirsiniz. API ile yapmak isterseniz:

# Belirli bir ülkeden gelen bağlantıları engelle
curl -s -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "mode": "block",
    "configuration": {
      "target": "country",
      "value": "XX"
    },
    "notes": "Spectrum uygulaması için ülke engeli"
  }' | jq '{success: .success, id: .result.id}'

# Belirli bir IP aralığını whitelist'e ekle
curl -s -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "mode": "whitelist",
    "configuration": {
      "target": "ip_range",
      "value": "192.168.1.0/24"
    },
    "notes": "Ofis IP aralığı - Spectrum erişimi"
  }' | jq '{success: .success, id: .result.id}'

Spectrum ile TLS Sonlandırma

Spectrum, TLS sonlandırma desteği de sunar. Yani Cloudflare, istemcilerle TLS bağlantısını sonlandırabilir ve arka taraftaki sunucunuza şifrelenmemiş veya yeniden şifrelenmiş trafik gönderebilir. Bu özellikle TLS sertifika yönetimini merkezileştirmek istediğinizde kullanışlıdır.

# TLS sonlandırma ile Spectrum uygulaması
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/spectrum/apps" 
  -H "Authorization: Bearer $CF_API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "protocol": "tcp/443",
    "dns": {
      "type": "CNAME",
      "name": "secure-app.example.com"
    },
    "origin_dns": {
      "name": "origin.example.com",
      "ttl": 600
    },
    "origin_port": 8443,
    "ip_firewall": true,
    "proxy_protocol": "off",
    "tls": "flexible",
    "traffic_type": "direct",
    "edge_ips": {
      "type": "dynamic",
      "connectivity": "all"
    }
  }' | jq '.result | {id: .id, tls: .tls, protocol: .protocol}'

TLS seçenekleri şunlardır:

  • off: TLS sonlandırma yok, bağlantı doğrudan geçer
  • flexible: Cloudflare istemciyle TLS kurar, origin’e HTTP gönderir
  • full: Hem istemciyle hem origin’le TLS kullanır, sertifika doğrulaması yapılmaz
  • strict: Full gibi, ama origin sertifikası mutlaka geçerli olmalıdır

Monitoring ve Troubleshooting

Spectrum uygulamalarınızın sağlıklı çalışıp çalışmadığını izlemek için birkaç yöntem kullanabilirsiniz.

Önce bağlantıyı test edelim:

#!/bin/bash
# Spectrum bağlantı testi - SSH için
HOST="ssh.example.com"
PORT=22
TIMEOUT=10

echo "Spectrum SSH bağlantısı test ediliyor: $HOST:$PORT"

# TCP bağlantı testi
if timeout $TIMEOUT bash -c "echo >/dev/tcp/$HOST/$PORT" 2>/dev/null; then
    echo "BAŞARILI: $HOST:$PORT adresine TCP bağlantısı kuruldu"
else
    echo "BAŞARISIZ: $HOST:$PORT adresine bağlanılamadı"
    exit 1
fi

# Latency ölçümü
echo "Latency testi yapılıyor..."
time (for i in {1..5}; do
    timeout $TIMEOUT bash -c "echo >/dev/tcp/$HOST/$PORT" 2>/dev/null && echo "Bağlantı $i: Başarılı"
done)

# Hangi Cloudflare edge'e bağlandığımızı öğrenmek için
echo "Cloudflare edge bilgisi:"
curl -s --connect-timeout 5 "https://cloudflare.com/cdn-cgi/trace" | grep -E "colo|ip"

Ağ katmanında sorun giderme için:

# Spectrum üzerinden geçen trafiği izlemek için tcpdump (origin sunucuda)
# Cloudflare'in proxy IP'lerinden gelen bağlantıları gör
sudo tcpdump -i eth0 -n 'port 25565' -v

# Bağlantı durumunu kontrol et
ss -tnp | grep 25565

# Cloudflare'in gerçekten proxy işlevi gördüğünü doğrula
# (IP adresinin Cloudflare'e ait olduğunu kontrol et)
curl -s "https://ipapi.co/$(curl -s ifconfig.me)/json/" | jq '.org'

# Origin sunucuda aktif Spectrum bağlantılarını say
netstat -an | grep ':25565' | grep ESTABLISHED | wc -l

Dikkat Edilmesi Gereken Noktalar

Spectrum’ü production ortamında kullanmadan önce bilmeniz gereken bazı önemli detaylar var.

Latency etkisi: Trafik Cloudflare’in ağından geçtiği için ek bir gecikme yaşanır. Bu genellikle 1-10ms arasındadır. Çoğu uygulama için sorun değildir, ancak ultra düşük gecikme gerektiren finansal uygulamalar veya gerçek zamanlı sistemler için dikkate alınmalıdır.

Bant genişliği maliyeti: Spectrum, aktarılan veri üzerinden fiyatlandırılır. Yüksek trafikli oyun sunucuları veya büyük dosya transferleri için maliyetlerin önceden hesaplanması gerekir.

Kaynak IP gizleme: Spectrum, gerçek sunucu IP’nizi gizler. Bu iyi bir şeydir, ancak bir kez Spectrum kullandıktan sonra orijin IP’nizi başka bir DNS kaydıyla ifşa etmemeye dikkat edin. İnsanlar historical DNS kayıtlarına bakarak orijin IP’yi bulmaya çalışabilir.

Protocol desteği: Her protokol Spectrum üzerinden sorunsuz çalışmayabilir. Özellikle UDP tabanlı protokoller, durum bilgisi gerektiren uygulamalarda sorun yaratabilir. Test ortamında mutlaka deneyin.

Port aralıkları: Spectrum belirli portları destekler. 1-65535 arasındaki portların tamamı kullanılabilir değildir, bazı portlar Cloudflare tarafından rezerve edilmiştir.

Sonuç

Cloudflare Spectrum, HTTP/HTTPS dışındaki protokolleri de Cloudflare’in güçlü DDoS koruma ve global ağ altyapısından yararlandırmanızı sağlayan çok değerli bir araçtır. Oyun sunucularından veritabanı erişimine, SSH tünellemesinden özel TCP uygulamalarına kadar geniş bir yelpazede kullanım alanı vardır.

Pratik açıdan bakıldığında, Spectrum’ün en büyük değeri DDoS korumasıdır. Özellikle oyun sunucusu yöneticileri için UDP flood saldırıları gerçek bir kabus olabilir ve Spectrum bu sorunu neredeyse sıfır operasyonel yükle çözer. Bunun yanında, gerçek sunucu IP’nizi gizleme özelliği de ikincil saldırı vektörlerini ortadan kaldırır.

Terraform entegrasyonu ve API desteğiyle Spectrum’ü modern DevOps pipeline’larına dahil etmek son derece kolaydır. Infrastructure as Code prensiplerine uygun şekilde yönetildiğinde, yüzlerce Spectrum uygulamasını bile merkezi olarak idare edebilirsiniz.

Başlamak için en iyi yol, kritik olmayan bir servisle test etmektir. Bir Minecraft sunucusu ya da test SSH instance’ı üzerinde deneyin, gecikmeyi ölçün, IP firewall kurallarını test edin ve ardından production sistemlerinize geçin. Spectrum’ün gücünü bir kez gördükten sonra, TCP ve UDP servislerinizi neden bu kadar uzun süre korumasız bıraktığınıza hayıflanacaksınız.

Bir yanıt yazın

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