Backend sunucularım neden tüm istekleri TR7'nin IP'sinden geliyormuş gibi görüyor?
Kısa cevap
TR7, HTTP ve L7 TCP vService'lerde bir Reverse Proxy olarak çalışır: istemcinin bağlantısını sonlandırır ve Kurum Servisine yeni bir bağlantıyı kendisi açar. Kurum Servisinin SNAT alanı varsayılan değeri Default'ta bırakıldığında bu bağlantının kaynak adresi, Kurum Servisinin Route Table'ında sunucuya giden trafiğin çıktığı arayüzün, sunucuyla (gateway üzerinden gidiliyorsa gateway'le) aynı subnet'teki Interface IP'sidir; bu yüzden sunucu bütün istekleri TR7'den geliyor görür. Bu bir hata değil, varsayılan davranıştır; istemci IP'si X-Forwarded-For, Use Client IP, PROXY protokolü ya da Network vService'te LB Mode ile iletilir (Backend'de gerçek istemci IP'sini nasıl görürüm?).
Temel Bilgi
Bir TCP bağlantısı dört değerle tanımlanır: kaynak IP, kaynak port, hedef IP ve hedef port. Sunucu yanıtı her zaman isteğin kaynak IP'sine gönderir. Reverse Proxy, istemciyle bir bağlantı, sunucuyla ayrı bir bağlantı kurar; sunucu yalnızca ikinci bağlantıyı, yani proxy'nin adresini görür. Bu yüzden istemcinin adresi sunucuya ancak başka bir yolla (HTTP başlığı, PROXY protokolü ya da kaynak adresin korunması) taşınır.
Nasıl Çalışır?
- İstemci (ör.
198.51.100.45) vService adresine bağlanır. - TR7 bağlantıyı sonlandırır, isteği işler ve Kurum Servisini seçer.
- TR7, Kurum Servisine yeni bir bağlantı açar. SNAT = Default'ta kaynak adres, Kurum Servisinin Route table'ında sunucuya giden trafiğin çıktığı arayüzün, sunucuyla aynı subnet'teki Interface IP'sidir (sunucuya gateway üzerinden gidiliyorsa gateway'le aynı subnet'teki Interface IP'si). Cluster'da her cihaz kendi Interface IP'sini kullanır. O subnet'te arayüze birden fazla IP eklenmişse hangisinin kullanılacağı arayüzdeki sıradan anlaşılmaz; belirli bir adres gerekiyorsa Use Device IP seçilir.
- Kurum Servisi isteği TR7'den gelmiş görür ve yanıtı TR7'ye gönderir; TR7 yanıtı istemciye iletir.
Örnek: Route table'da 192.0.2.5/24 Interface IP'si olan TR7, 192.0.2.20 adresindeki sunucuya 192.0.2.5 kaynağıyla bağlanır. Sabit bir kaynak adres isteniyorsa Use Device IP ile Route table'daki IP'lerden biri seçilir (SNAT alanındaki "Default" ne anlama gelir; özel bir SNAT IP'si seçebilir miyim?).
TR7'nin IP adresi (192.0.2.5)
X-Forwarded-For: 198.51.100.45
Neden Varsayılan Bu?
- Dönüş yolu kendiliğinden doğrudur. Sunucu yanıtı isteğin kaynak IP'sine gönderir. Kaynak TR7 olduğunda yanıt, sunucunun yönlendirmesi ne olursa olsun TR7'ye döner; sunucularda ve ağda hiçbir değişiklik gerekmez.
- Simetrik akış korunur. İstemcinin IP'siyle bağlanılırsa sunucu yanıtı kendi default gateway'ine gönderir. Gateway TR7 değilse yanıt TR7'yi atlar: TR7 bağlantıyı tamamlayamaz, istemci de beklemediği bir adresten (vService IP'si yerine sunucunun IP'si) gelen paketi reddeder. Arada durum tutan (stateful) bir firewall varsa tek yönünü gördüğü akışı düşürür.
- Ağ topolojisinden bağımsızdır. Sunucu TR7 ile aynı subnet'te olmak zorunda değildir; TR7'nin Route table'ından erişilebilen her ağdaki sunucu kullanılabilir.
- Bedeli istemci IP'sidir. Sunucu istemcinin adresini bağlantıdan göremez; bu yüzden HTTP'de X-Forwarded-For, diğer durumlarda PROXY protokolü ya da kaynak adresi koruyan Use Client IP kullanılır. Use Client IP, yanıtların TR7 üzerinden dönmesini gerektirir: sunucuların default gateway'i TR7 olur ya da Spoofing açılır (SNAT nedir, neden varsayılan olarak kullanılıyor?).
vService Tipine Göre
| vService tipi | Sunucunun gördüğü kaynak (varsayılan) | İstemci IP'sini iletme yolu |
|---|---|---|
| HTTP | TR7'nin IP'si (SNAT Default) | X-Forwarded-For, Use Client IP, PROXY protokolü, Add HTTP Header aksiyonu |
| L7 TCP | TR7'nin IP'si (SNAT Default) | Use Client IP, PROXY protokolü |
| Network | LB mode'a bağlı: Direct Server Return (varsayılan) ve Route Mode'da istemcinin IP'si, SNAT modunda seçilen SNAT IP | LB Mode; Network vService'te Kurum Servisinin SNAT alanı kullanılmaz |
Etkisi
- Sunucunun erişim logları ve analizleri bütün trafiği tek adresten gelmiş gösterir.
- Sunucudaki IP tabanlı kısıtlamalar ve istek limitleri bütün kullanıcıları tek istemci sayar.
- Uygulamanın güvenlik kararları istemcinin değil TR7'nin adresiyle verilir.
Sık Karıştırılan Noktalar
- "TR7 istemci IP'sini kaybediyor." TR7 istemcinin IP'sini bilir; loglarında, koşullarında ve güvenlik özelliklerinde kullanır. Yalnızca Kurum Servisine açtığı bağlantıda kendi adresini kullanır.
- "Kaynak adres route table'daki ilk arayüzün IP'sidir." Kaynak, route table'daki ilk arayüz IP'si değil; sunucuya giden trafiğin çıktığı arayüzün, sunucuyla (gateway üzerinden gidiliyorsa gateway'le) aynı subnet'teki Interface IP'sidir.
- "X-Forwarded-For açılınca sunucu logu kendiliğinden düzelir." Sunucu başlığı okuyacak şekilde yapılandırılmalıdır (X-Forwarded-For nasıl etkinleştirilir; backend tarafında (Apache / Nginx / IIS logları) ne yapmam gerekir?).
- "TR7'nin önündeki CDN'in IP'si de aynı sorundur." TR7 bir CDN arkasındaysa TR7'nin kendisi de CDN'in IP'sini görür; bu Trusted Proxy ile çözülür (TR7'nin önünde Cloudflare / Akamai gibi bir CDN var; gerçek istemci IP'sini nasıl alırım (Trusted Proxy)?).
Dokümantasyonda nasıl yapılır
