Backend'de gerçek istemci IP'sini nasıl görürüm?
Kısa cevap
HTTP vService'te X-Forwarded-For seçeneği açılır ve sunucu bu başlığı okuyacak şekilde ayarlanır. Başlığa bağlı kalmadan TR7'nin sunucuya istemcinin IP'siyle bağlanması için Kurum Servisinin SNAT alanında Use Client IP seçilir; bunun için yanıtların TR7'den dönmesi gerekir (sunucunun default gateway'i TR7 ya da Spoofing açık). Sunucu destekliyorsa Kurum Servisinin Proxy alanıyla PROXY protokolü, Network vService'te ise LB Mode olarak Route Mode ya da Direct Server Return kullanılır. Sunucu farklı adda bir başlık bekliyorsa Add HTTP Header aksiyonuyla X-Real-IP gibi bir başlık eklenir.
Sorun: Sunucu Loglarında Yalnızca TR7'nin IP'si Var
Kurum Servisi bağlantıyı TR7'den aldığı için loglar, erişim kontrolleri ve uygulama istemcinin gerçek adresini göremez; sunucudaki coğrafi kısıtlamalar çalışmaz, IP başına istek limitleri bütün kullanıcıları tek adres gibi sayar ve güvenlik kararları yanlış veriyle verilir. Nedenin ayrıntısı: Backend sunucularım neden tüm istekleri TR7'nin IP'sinden geliyormuş gibi görüyor?
Çözüm: Beş Yöntem
Gerçek istemci IP'si Kurum Servisine beş yoldan taşınır. Yöntemler birbirinin alternatifidir; ağ düzenine, vService tipine ve sunucunun neyi desteklediğine göre seçilir.
| Durumunuz | Uygun yöntem |
|---|---|
| HTTP vService; ağ düzenini değiştirmek istemiyorum | Yöntem 1: X-Forwarded-For |
| L7 TCP vService; ağ düzeni TR7'yi dönüş yoluna almaya uygun | Yöntem 2: SNAT → Use Client IP |
| HTTP ya da L7 TCP; sunucu PROXY protokolünü destekliyor (Nginx, Apache, Postfix…), ağ değişmeyecek | Yöntem 3: PROXY protokolü |
| Network vService (TCP - L4 / UDP - L4) | Yöntem 4: Network vService'te LB mode |
| Uygulama bir HTTP başlığını okuyamıyor, IP'yi bağlantıdan görmeli | Yöntem 2: SNAT → Use Client IP |
HTTP; sunucu farklı adda bir başlık bekliyor (ör. X-Real-IP) | Yöntem 5: Add HTTP Header aksiyonu |
| TR7'nin önünde CDN veya başka bir proxy var | Önce Trusted Proxy ile gerçek IP çözülür, ardından Yöntem 1 → TR7'nin önünde Cloudflare / Akamai gibi bir CDN var; gerçek istemci IP'sini nasıl alırım (Trusted Proxy)? |
Yöntem 1: X-Forwarded-For Önerilen
- Nasıl çalışır TR7, Kurum Servisine ilettiği her isteğe
X-Forwarded-Forbaşlığını ekler ve içine gerçek istemci IP'sini yazar. Bağlantı yine TR7'den gelir. - Nerede açılır vService → Details → X-Forwarded-For
- Gereksinim Ağda değişiklik gerekmez. Kurum Servisi başlığı okuyacak şekilde yapılandırılır (5. adım).
- vService tipi Yalnızca HTTP
- İstekte zaten XFF varsa Silinmez; TR7 kendi gördüğü adresi zincirin sonuna ekler.
Adım adım yapılandırma
Load Balancer → Load Balancer vService List adımları izlenir ve X-Forwarded-For etkinleştirilecek HTTP vService açılır. Yeni bir vService oluşturulurken de aynı form kullanılır.
Formun üst kısmındaki Details butonuna tıklanır. Bu panel varsayılan olarak kapalıdır; tıklandığında gelişmiş seçenekler sağ tarafta listelenir.
Details listesinden X-Forwarded-For aktif edilir. Bu seçenek tek bir aç/kapa seçeneğidir; aktif edildiğinde alt ayar veya ek alan açılmaz.
Save butonuna tıklanır. Ayar kaydedildiği anda geçerli olur.
TR7 başlığı ekler; başlığın kullanılması Kurum Servisinin işidir. Sunucu X-Forwarded-For değerini istemci IP'si olarak okuyacak şekilde yapılandırılmazsa loglarda yine TR7'nin adresi görünür. Nginx, Apache ve IIS için yapılandırma: X-Forwarded-For nasıl etkinleştirilir; backend tarafında (Apache / Nginx / IIS logları) ne yapmam gerekir? Sunucu başlığı yalnızca TR7'nin IP adresinden gelen bağlantılarda dikkate almalıdır.
Doğrulama
vService Debug mode durumuna alınır. İlgili vService'in Debug Logları açılır, kayda tıklanır ve Request sekmesindeki Header info listesi incelenir.
X-Forwarded-For: 198.51.100.45İstemci XFF göndermemişse satır yeşil (eklenen), göndermişse sarı (değiştirilen) görünür.
Sunucu üzerinde TR7'den gelen isteğin ham içeriği dinlenir. Örneğin 80 numaralı port için:
tcpdump -A -s0 'tcp dst port 80' | grep -i x-forwarded-forX-Forwarded-For: 198.51.100.45Yöntem 2: SNAT → Use Client IP
- Nasıl çalışır TR7, Kurum Servisine bağlanırken kaynak adres olarak istemcinin gerçek IP'sini kullanır. IP bir başlıkla değil, bağlantının kendisiyle (L4) taşınır.
- Nerede açılırKurum Servisi → Details → SNAT → Use Client IP
- Gereksinim Kurum Servisinin cevap trafiği TR7 üzerinden dönmelidir: default gateway TR7 yapılır ya da Spoofing açılır (4. adım). Sağlanmazsa cevaplar TR7'yi atlar ve bağlantı tamamlanmaz.
- vService tipiHTTP, L7 TCP (Network vService'te bu alan kullanılmaz; bkz. Yöntem 4)
- Kurum Servisi tarafı Ek yapılandırma gerekmez; IP doğrudan görünür.
Adım adım yapılandırma
Load Balancer → Backend Services adımları izlenir, ilgili Kurum Servisi seçilir ve Edit butonuna tıklanır. Buton yalnızca tek bir Kurum Servisi seçiliyken etkindir.
Formun altındaki Details anahtarı açılır. Anahtar varsayılan olarak kapalıdır; SNAT ve Spoofing alanları bu bölümdedir.
SNAT alanında Use Client IP seçilir. Diğer seçenekler: Default (varsayılan; kaynak adres, 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) ve Use Device IP (seçilen TR7 IP'si kaynak olur).
İki yoldan biri uygulanır:
- Default gateway TR7: Kurum Servisinin default gateway'i TR7 yapılır. Bu değişiklik sunucu tarafında yapılır; TR7'de ek alan gerekmez.
- Spoofing: Gateway değiştirilemiyorsa aynı formda Spoofing açılır (yalnızca Use Client IP seçiliyken görünür; varsayılan kapalı). TR7, Kurum Servisinin ağında ARP spoofing yaparak cevap trafiğini kendine çeker. Spoofing IP boş bırakılırsa route tablosunun default gateway'i hedeflenir. Cluster kurulumunda Spoofing IP VIP Condition ile spoofing'in VIP'in etkin olduğu cihazda çalışması sağlanır.
Formun altındaki Edit butonuna tıklanır. Aynı Kurum Servisini kullanan bütün vService'ler bu davranışı devralır.
Doğrulama
Sunucunun erişim loguna bakılır. Kaynak adres sütununda artık TR7'nin değil istemcinin IP'si yazmalıdır.
198.51.100.45 - - "GET / HTTP/1.1" 200Sunucu üzerinde gelen bağlantıların kaynak adresi dinlenir. Örneğin 80 numaralı port için:
tcpdump -n 'tcp dst port 80 and tcp[tcpflags] & tcp-syn != 0'IP 198.51.100.45.51234 > 192.0.2.20.80: Flags [S]Yöntem 3: PROXY Protokolü
- Nasıl çalışır TR7, Kurum Servisine açtığı her bağlantının en başında istemcinin IP ve port bilgisini PROXY protokolü başlığıyla gönderir; sunucu bu başlığı okuyup istemci IP'si olarak kullanır.
- Nerede açılır Kurum Servisi → Details → Proxy → Proxy (v1) ya da Proxy v2
- Gereksinim Kurum Servisinin PROXY protokolünü desteklemesi ve bekleyecek şekilde yapılandırılması; health check'in TCP türünde olması ya da ayrı bir porta yapılması; ağda değişiklik gerekmez
- vService tipi HTTP, L7 TCP
Adım adım yapılandırma
Kurum Servisi PROXY protokolü başlığını bekleyecek şekilde yapılandırılır (örnekler aşağıdaki panelde). Sunucu hazırlanmadan TR7'de açılırsa sunucu başlığı uygulama verisi sanar ve bağlantılar başarısız olur.
TR7'nin health check'leri PROXY protokolü başlığı göndermez; HTTP türündeki bir health check, başlığı bekleyen portta reddedilir ve Kurum Servisi down görünür. Bu yüzden Kurum Servisine TCP türünde bir health check atanır ya da 7. adımdaki Use Different IP for Health Check ile PROXY protokolü beklemeyen ayrı bir sağlık portu denetlenir. TCP türünde profil yoksa Load Balancer → Profiles → Health Checks → Add tıklanır (nasıl eklenir); profil zaten varsa 2–4. adımlar atlanır.
Name girilir ve Check Type = TCP seçilir (varsayılan HTTP'dir; tür kayıttan sonra değiştirilemez).
Formdaki Add butonuna tıklanır.
Load Balancer → Backend Services adımları izlenir, Kurum Servisi seçilip Edit butonuna tıklanır.
Formun altındaki Details anahtarı açılır; Proxy alanı bu bölümdedir.
Proxy alanında sunucunun desteklediği sürüm seçilir: metin tabanlı Proxy (v1) ya da ikili Proxy v2. Varsayılan No Proxy'dir. Health Check alanında TCP türündeki profil seçilir ya da Use Different IP for Health Check alanında Different address seçilip PROXY protokolü beklemeyen sağlık adresi ve portu girilir.
Formun altındaki Edit butonuna tıklanır. Aynı Kurum Servisini kullanan bütün vService'ler bu davranışı devralır.
Örneklerdeki 192.0.2.10 yerine TR7'nin Kurum Servisine bağlandığı IP adresi yazılır.
server {
listen 80 proxy_protocol;
set_real_ip_from 192.0.2.10;
real_ip_header proxy_protocol;
}# mod_remoteip (Apache 2.4.31+)
RemoteIPProxyProtocol On# main.cf
smtpd_upstream_proxy_protocol = haproxyYalnızca TR7'den gelen bağlantılarda
PROXY protokolünü bekleyen port, başlığı göndermeyen istemcilerden gelen bağlantıları reddeder. Bu port yalnızca TR7'nin bağlantılarına açık tutulur.
Doğrulama
Sunucunun erişim logunda kaynak adres sütununa bakılır.
198.51.100.45 - - "GET / HTTP/1.1" 200Yöntem 4: Network vService'te LB mode
- Nasıl çalışır Network vService bağlantıyı sonlandırmaz. Route Mode'da paketin yalnızca hedef adresi değiştirilir, Direct Server Return'de hiç değiştirilmez; iki modda da kaynak adres istemcinin IP'si olarak kalır.
- Nerede açılır Network vService → LB Mode → Route Mode ya da Direct Server Return
- Gereksinim Route Mode: Kurum Servisinin dönüş trafiği TR7'den geçmeli · Direct Server Return: Kurum Servisi TR7 ile aynı L2 segmentinde olmalı ve vService adresini kabul edecek şekilde hazırlanmalı
- vService tipi Network (TCP - L4, UDP - L4)
Adım adım yapılandırma
Load Balancer → Load Balancer vService List adımları izlenir ve Network vService açılır.
LB Mode alanında Route Mode ya da Direct Server Return seçilir. SNAT modu kaynak adresi değiştirdiği için istemci IP'si iletilmez.
Route Mode'da sunucuların default gateway'i TR7 yapılır (Route Mode'da dönüş trafiği neden TR7 üzerinden akmak zorunda?). Direct Server Return'de sunucuda vService adresi yerel adres olarak tanımlanır ve bu adres için ARP yanıtı kapatılır (Direct Server Return (DSR) nedir; sunucu tarafında ne hazırlık gerekir?).
Save butonuna tıklanır. Network vService'te her kayıt vService'i yeniden başlatır; değişiklik düşük trafikli bir zamanda yapılır.
Doğrulama
tcpdump -n 'tcp dst port 80 and tcp[tcpflags] & tcp-syn != 0'IP 198.51.100.45.51234 > 192.0.2.20.80: Flags [S]Yöntem 5: Add HTTP Header Aksiyonu
- Nasıl çalışırAdd HTTP Header aksiyonu, isteğe istenen adla (ör.
X-Real-IP) bir başlık ekler; başlığın değeri Header content alanındaki fx butonuyla seçilen Smart Variable%SRCIP(Client IP address) ile her istekte istemcinin IP'si olur. - Nerede açılırLoad Balancer → Actions → Add → Action Type: Add HTTP Header
- Gereksinim HTTP vService; sunucunun başlığı okuyacak şekilde yapılandırılması (X-Forwarded-For nasıl etkinleştirilir; backend tarafında (Apache / Nginx / IIS logları) ne yapmam gerekir?)
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Actions yolu izlenip Add'e tıklanır.
Action Name girilir; Action Type = Add HTTP Header, Execution Level = On request (seçilmezse istek aşamasında çalışır), Header to Add = X-Real-IP yazılır.
Header Content alanının yanındaki fx butonuna tıklanır; açılan Add variable penceresinde Variable name listesinden Connection info - Client IP address (%SRCIP) seçilir ve Submit ile alana yazılır.
Add butonuna tıklanır. Conditions boş bırakıldığı için aksiyon bütün isteklere uygulanır.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit ile düzenleme formu açılır.
Details → Actions alanında aksiyon seçilir.
Save butonuna tıklanır. Cluster'da değişiklik varsayılan olarak eş cihaza kendiliğinden aktarılır; Manual Sync Mode açıksa Synchronize ile gönderilir.
Doğrulama
Sunucunun erişim logunda istemcinin gerçek IP'si görünür (ya da tcpdump -A ile başlık görülür).
İstemci IP'siSık Yapılan Hatalar
TR7'nin önünde bir CDN veya proxy varsa
X-Forwarded-For, TR7'den Kurum Servisine giden yönde çalışır. TR7'nin önünde bir CDN veya proxy bulunuyorsa TR7'nin gördüğü adres zaten o ara katmanın adresidir ve XFF bu adresi iletir. Bu durumda önce gerçek istemci IP adresi Trusted Proxy ile çözülür.
- Use client IP seçip ağ koşulunu atlamak. SNAT → Use Client IP seçildiği hâlde gateway değiştirilmez ve Spoofing açılmazsa bağlantılar tamamlanmaz; site erişilemez hâle gelir.
- Kurum Servisini yapılandırmamak. XFF açıldığı hâlde sunucu başlığı okumuyorsa loglarda yine TR7'nin IP'si görünür.
- PROXY protokolünü sunucuyu hazırlamadan açmak. Sunucu başlığı uygulama verisi olarak yorumlar ve bağlantılar başarısız olur.
- PROXY protokolüyle HTTP health check kullanmak. Health check başlık göndermediği için reddedilir ve Kurum Servisi trafik alabildiği hâlde down görünür.
- Network vService'te Kurum Servisinin SNAT alanını değiştirmek. Bu alan yalnızca HTTP ve L7 TCP'de kullanılır; Network'te istemci IP'si LB mode ile korunur.
- X-Forwarded-For başlığının adını değiştirmeye çalışmak. Başlık her zaman
X-Forwarded-Foradıyla eklenir; farklı ad gerekiyorsa Yöntem 5 kullanılır. - Traffic mirroring'deki seçenekle karıştırılmamalıdır. Traffic Mirroring action'ının kendi Add X-Forwarded-For Header seçeneği yalnızca ayna hedefine giden kopya isteği ilgilendirir.
- Varsayılan kapalıdır. Yeni oluşturulan her vService'te X-Forwarded-For ayrıca açılmalıdır.
Dokümantasyonda nasıl yapılır
