SSL passthrough nedir; ne zaman termination yerine passthrough kullanmalıyım?
Kısa cevap
SSL passthrough'ta TLS TR7'de açılmaz: TR7 şifreli bağlantıyı olduğu gibi Kurum Servisine taşır, TLS el sıkışması istemci ile sunucu arasında yapılır ve sertifika yalnızca sunucudadır. TR7'de L7 TCP vService'te frontend Protocol alanında TCP seçilerek (TCP + TLS değil) kurulur; Kurum Servislerinde SSL Service kapalı kalır ve adresleri sunucuların TLS portunu gösterir. Birden fazla alan adı farklı sunuculara gidecekse SSL SNI Info koşulu ve Conditional Backend Services (Content Switching) kullanılır. Özel anahtar TR7'ye konamıyorsa ya da istemci sertifikasını uygulamanın kendisi doğrulayacaksa tercih edilir; bu yapıda WAF, HTTP koşulları ve HTTP aksiyonları kullanılmaz.
Temel Bilgi
SSL passthrough, şifreli trafiğin ara cihazda hiç çözülmeden hedef sunucuya iletilmesidir. TLS oturumu istemci ile sunucu arasında uçtan uca kurulur; ara cihaz yalnızca bağlantıyı dengeler ve içeriği göremez. Ara cihazın okuyabildiği tek bilgi, TLS el sıkışmasının şifresiz ilk paketindeki (ClientHello) SNI alanıdır: istemcinin bağlanmak istediği alan adı. Termination'da TLS ara cihazda sonlandırılır; bridging'de ara cihaz TLS'i sonlandırıp sunucuya yeni bir TLS bağlantısı kurar.
Sorun: Şifrenin TR7'de Açılmaması Gerekiyor
TR7'nin trafiği görebilmesi çoğu kurulumda istenen şeydir; WAF, koşullar ve aksiyonlar buna dayanır. Bazı durumlarda ise şifrenin ara katmanda hiç açılmaması gerekir:
- Kurum politikası ya da denetim şartı gereği özel anahtar yalnızca uygulama sunucusunda durmalıdır; TLS sonlandırma, anahtarın bir kopyasının TR7'de bulunmasını gerektirir.
- Uygulama, istemcinin sunduğu sertifikayı kendisi doğrulamak ister (uçtan uca mTLS).
- Trafik HTTP değildir ve içeriğe bakmak gerekmez (ör. şifreli veritabanı ya da mesajlaşma protokolleri).
Bu durumlarda TR7'nin yük dağıtmaya devam etmesi, ama şifreye dokunmaması gerekir.
Çözüm: İki Yöntem
TR7'de "SSL passthrough" adında ayrı bir seçenek yoktur: TLS'i sonlandırmayan bir frontend satırı passthrough'tur. Yöntem 2, Yöntem 1'in üzerine SNI'ye göre yönlendirme ekler.
| Durumunuz | Uygun yöntem |
|---|---|
| Özel anahtar TR7'ye konamıyor; bütün bağlantılar aynı sunucu grubuna gidecek | Yöntem 1: L7 TCP vService, Protocol = TCP |
| Aynı IP ve portta birden fazla alan adı var; her biri farklı sunuculara gidecek | Yöntem 2: Passthrough + SNI'ye göre yönlendirme |
| WAF, içerik koşulları ya da başlık aksiyonları gerekiyor | Passthrough uygun değildir → termination: SSL offloading (termination) nedir, nasıl yapılır? |
| İçerik görünürlüğü ve TR7–sunucu arasında şifreleme birlikte gerekiyor | Bridging → SSL bridging nedir; backend'e giden trafiği de nasıl şifrelerim? |
Yöntem 1: L7 TCP vService, Protocol = TCP Önerilen
- Nasıl çalışır Frontend satırında TCP seçildiğinde TR7 bağlantıyı TCP düzeyinde karşılar ve baytları olduğu gibi Kurum Servisine iletir; TLS el sıkışmasını sunucu yapar. Formda Certificate ve SSL Security alanları görünmez.
- Nerede açılırLoad Balancer → Load Balancer vService List → Add → Type = L7 TCP → Frontend → Protocol = TCP
- Gereksinim Sunucularda geçerli sertifika ve TLS dinleyen port; Kurum Servislerinde SSL Service kapalı
- vService tipi L7 TCP
- vService tipi değişmez Mevcut bir HTTP vService passthrough'a çevrilemez; Type alanı yalnızca oluştururken seçilir. Yeni bir L7 TCP vService oluşturulur.
Adım adım yapılandırma
vService'in dinleyeceği adres TR7'de tanımlı değilse Network → Interfaces ekranında ilgili arayüze Add IP ile eklenir (nasıl eklenir; cluster kurulumunda VIP olarak).
Load Balancer → Backend Services ekranında Add tıklanır (nasıl eklenir). Sunucular zaten tanımlıysa 2–4. adımlar atlanır; o Kurum Servislerinde SSL Service'in kapalı olduğu kontrol edilir.
Backend Service Name girilir; Address alanına sunucunun IP'si ve TLS dinlediği port yazılır (ör. 192.0.2.21 : 443). SSL Service kapalı bırakılır (varsayılan); açılırsa TR7 zaten şifreli olan bağlantının içinde ikinci bir TLS kurmaya çalışır ve bağlantı kurulamaz.
Add tıklanır. Her sunucu için 2–4. adımlar tekrarlanır.
Load Balancer → Load Balancer vService List ekranında Add tıklanır (nasıl eklenir).
Frontend satırında Frontend IP seçilir, Port = 443 yazılır ve Protocol = Unencrypted grubundaki TCP seçilir. Encrypted (TLS) grubundaki TCP + TLS seçilmez: o seçenek TLS'i TR7'de sonlandırır ve sertifika ister.
Default Backend Services tablosunda Add Backend Services ile 2–4. adımlardaki Kurum Servisleri (ya da onları içeren bir Backend Group) seçilir. Tablo boş bırakılırsa bağlantılar reddedilir.
Save tıklanır; vService Enabled durumdaysa hemen bağlantı almaya başlar. Cluster kurulumunda varsayılan auto-sync ile yapılandırma eş cihaza da gönderilir; Manual Sync Mode açıksa eş cihaza elle gönderilir.
Sunucular, bağlantının kaynağı olarak TR7'nin IP'sini görür; istemci IP'si HTTP başlığıyla taşınamaz. Gerekiyorsa Kurum Servisinde Proxy (Proxy Protocol; sunucunun da desteklemesi gerekir) ya da SNAT = Use Client IP kullanılır (HTTP olmayan TCP servislerinde gerçek istemci IP'sini nasıl iletirim?).
Doğrulama
Passthrough'un kanıtı, istemcinin sunucunun kendi sertifikasını görmesidir.
Komut: openssl s_client -connect 203.0.113.10:443 -servername www.example.com
subject ve issuer sunucudaki sertifikayı gösterirvService'in Live Stats ekranında bağlantıların Kurum Servislerine dağıldığı görülür.
Kurum Servislerinde aktif oturumYöntem 2: Passthrough + SNI'ye Göre Yönlendirme
- Nasıl çalışır TR7, ClientHello'daki SNI'yi okur ve şifreyi açmadan bağlantıyı alan adına göre farklı Kurum Servislerine iletir. Her alan adı için bir SSL SNI Info koşulu ve bir Conditional Backend Services kuralı tanımlanır; hiçbir kurala uymayan bağlantılar Default Backend Services'e gider.
- Nerede açılırLoad Balancer → Conditions · L7 TCP vService → Conditional Backend Services
- Gereksinim Yöntem 1'deki L7 TCP vService (Protocol = TCP); istemcilerin SNI göndermesi
- vService tipi L7 TCP
- Kullanılabilen koşullar Bağlantı düzeyindeki koşullar: SSL SNI Info, Source IP, Destination IP, Destination Port vb. TLS çözülmediği için SSL Version ve SSL Cipher koşulları bu frontend'de eşleşmez; Host, yol ve başlık koşulları L7 TCP'de yoktur.
Adım adım yapılandırma
Load Balancer → Conditions ekranında Add tıklanır (nasıl eklenir).
Condition Name girilir (ör. sni-a); Criteria = SSL SNI Info seçilir ve Query alanına alan adı yazılır (ör. a.example.com). Eşleşme tam addır ve büyük/küçük harfe duyarsızdır; joker (*.example.com) ya da birden fazla ad girilemez.
Add tıklanır. Her alan adı için 1–3. adımlar tekrarlanır; Add & Repeat formu açık tutar.
Her alan adının sunucuları Yöntem 1'in 2–4. adımlarıyla Kurum Servisi olarak eklenir; adresler sunucuların TLS portunu gösterir, SSL Service kapalı kalır.
Load Balancer → Load Balancer vService List ekranında Yöntem 1'deki L7 TCP vService seçilip Edit tıklanır (vService yoksa Yöntem 1'in 5–8. adımlarıyla oluşturulur). Frontend satırının Protocol değeri TCP olmalıdır.
Backend Services tablosunun başlığındaki + Conditional Backend Services tıklanır; tablonun üstünde CONDITIONAL BACKEND #1 bloğu açılır.
Blokta koşul olarak 2. adımdaki SSL SNI Info koşulu seçilir; bloğun Backend Services tablosuna o alan adının Kurum Servisleri eklenir. Her alan adı için 6–7. adımlar tekrarlanır. Kurallar yukarıdan aşağıya değerlendirilir, ilk eşleşen kural uygulanır; sıra sürükle-bırak ile değiştirilir.
Default Backend Services tablosunda SNI göndermeyen ya da hiçbir kurala uymayan bağlantıların gideceği Kurum Servisi seçilir. Tablo boş bırakılırsa bu bağlantılar reddedilir.
Save tıklanır. Cluster kurulumunda varsayılan auto-sync ile değişiklik eş cihaza da gönderilir; Manual Sync Mode açıksa eş cihaza elle gönderilir.
Doğrulama
Aynı adrese iki farklı alan adıyla bağlanılır.
Komut: openssl s_client -connect 203.0.113.10:443 -servername a.example.com · openssl s_client -connect 203.0.113.10:443 -servername b.example.com
Her ad kendi sunucusunun sertifikasını döndürürSık Yapılan Hatalar
TCP + TLS passthrough değildir
L7 TCP'deki TCP + TLS seçeneği adına rağmen TLS'i TR7'de sonlandırır ve sertifika ister. Passthrough için Protocol alanında TCP seçilir.
- Kurum Servisinde SSL Service'i açmak. SSL Service, TR7'nin sunucuya kendi TLS bağlantısını kurmasını sağlar; passthrough'ta bağlantı zaten şifreli geldiği için iki TLS katmanı üst üste biner ve bağlantı kurulamaz. Bu alan termination ve bridging yapılandırmalarına aittir.
- HTTP vService'te passthrough aramak. HTTP vService gelen isteği HTTP olarak işler; Protocol = HTTP bırakılan satır düz HTTP bekler, şifreli bağlantıyı çözemez. Passthrough yalnızca L7 TCP vService'te yapılır.
- Passthrough'ta WAF ya da HTTP aksiyonu beklemek. WAF, Cache, Compression, X-Forwarded-For, başlık ve çerez aksiyonları yalnızca HTTP vService'te vardır; L7 TCP'de L7 DDoS & Threat Protection ve bağlantı düzeyindeki Actions kullanılabilir. İçerik denetimi gerekiyorsa termination ya da bridging seçilir.
- SSL Version ya da SSL Cipher koşuluyla ayrım yapmaya çalışmak. Bu koşullar TR7'nin sonlandırdığı TLS bağlantısını okur; passthrough frontend'inde eşleşmez. Passthrough'ta yalnızca SSL SNI Info koşulu TLS bilgisine bakar.
- SSL SNI Info koşulunu SNI göndermeyen protokollerde kullanmak. Koşul tanımlı vService'te TR7, bağlantının ilk paketinde TLS el sıkışmasını bekler; sunucunun önce konuştuğu protokollerde (SMTP, FTP, STARTTLS kullananlar) bağlantının kabulü 10 saniyeye kadar gecikir. Bu protokoller ayrı bir vService'te tutulur.
- Sertifika takibini unutmak. Sertifika TR7'de durmadığı için süre bildirimi ve ACME yenilemesi bu sunucular için çalışmaz; her sunucuda ayrıca izlenir.
Dokümantasyonda nasıl yapılır
