X-Forwarded-For nasıl etkinleştirilir; backend tarafında (Apache / Nginx / IIS logları) ne yapmam gerekir?
Kısa cevap
TR7'de HTTP vService'in Details listesinde X-Forwarded-For açılır (varsayılan kapalı); TR7, Kurum Servisine giden her isteğe istemcinin IP'sini taşıyan X-Forwarded-For başlığını ekler. Başlık adı sabittir; istemcinin gönderdiği zinciri tek değerle değiştirmek için Set HTTP Header, farklı adlı bir başlık için Add HTTP Header aksiyonu kullanılır ve içerik fx butonuyla Client IP address Smart Variable'ı seçilerek yazılır. Sunucu tarafında Nginx'te ngx_http_realip_module, Apache'de mod_remoteip ile istemci IP'si başlıktan alınır; IIS'te başlık Enhanced Logging ile loga özel alan olarak eklenir.
Sorun: Başlık Geliyor ama Loglar Değişmiyor
X-Forwarded-For başlığı istemci IP'sini sunucuya taşır, ama web sunucuları varsayılan olarak bağlantının kaynağını (TR7'yi) loglar. İstemci IP'sinin görünmesi için hem TR7'de başlığın eklenmesi hem de sunucunun bu başlığı okuması gerekir. Sunucu başlığa koşulsuz güvenirse istemcinin kendi gönderdiği sahte bir değer de istemci IP'si sayılabilir; bu yüzden güven yalnızca TR7'nin adresiyle sınırlanır.
Çözüm: 3 Yöntem
Üç yöntem birbirinin alternatifidir; hangisi seçilirse seçilsin sunucu tarafı yapılandırma (Sunucu tarafı yapılandırma) ayrıca yapılır.
| Durumunuz | Uygun yöntem |
|---|---|
Standart X-Forwarded-For başlığı yeterli | Yöntem 1: X-Forwarded-For |
| İstemcinin gönderdiği zinciri silip tek değer yazmak istiyorum | Yöntem 2: Set HTTP Header |
Sunucu farklı adlı bir başlık bekliyor (ör. X-Real-IP) | Yöntem 3: Add HTTP Header |
Yöntem 1: X-Forwarded-For Önerilen
- Nasıl çalışır TR7, Kurum Servisine giden her HTTP isteğine
X-Forwarded-Forbaşlığını ekler ve içine istemcinin IP'sini yazar. İstekte zaten bir X-Forwarded-For varsa silinmez; TR7'nin eklediği değer zincirin sonuna gelir. Önünde bir CDN varsa ve Trusted Proxy tanımlıysa yazılan değer, Trusted Proxy'nin çözdüğü gerçek istemci IP'sidir. - Nerede açılır HTTP vService → Details → X-Forwarded-For
- Gereksinim Sunucunun başlığı okuması (web sunucusu ya da uygulama ayarı)
- vService tipi HTTP
Adım adım yapılandırma
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit ile düzenleme formu açılır.
Formdaki Details butonuna tıklanır; panel varsayılan olarak kapalıdır.
Details listesinde X-Forwarded-For etkinleştirilir (varsayılan kapalı). Ek alan açılmaz; başlık adı sabittir.
Save butonuna tıklanır; ayar kaydedildiği anda geçerli olur. Cluster'da değişiklik varsayılan olarak eş cihaza kendiliğinden aktarılır; Manual Sync Mode açıksa Synchronize ile gönderilir.
Sunucu istemci IP'sini başlıktan okuyacak ya da loga yazacak şekilde yapılandırılır (Sunucu tarafı yapılandırma).
Doğrulama
vService Debug mode'dayken Debug Mode Logs kaydının Request sekmesinde Kurum Servisine giden başlıklar görülür.
X-Forwarded-For: 198.51.100.45Sunucu yapılandırıldıktan sonra erişim logunda istemcinin IP'si görünür.
198.51.100.45 - - "GET / HTTP/1.1" 200Yöntem 2: Set HTTP Header
- Nasıl çalışırSet HTTP Header aksiyonu
X-Forwarded-Forbaşlığını tek bir değer olarak yazar; istemcinin gönderdiği önceki değerler kaldırılır. Değer, Header content alanındaki fx butonuyla seçilen Client IP address (%SRCIP) Smart Variable'ıdır. - Nerede açılırLoad Balancer → Actions → Add → Action Type: Set HTTP Header
- Gereksinim HTTP vService; vService'teki X-Forwarded-For seçeneği kapalı
- 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 = Set HTTP Header, Execution Level = On request, Header to Edit = X-Forwarded-For 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.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit tıklanır.
Details → Actions alanında aksiyon seçilir.
Save butonuna tıklanır; ardından sunucu tarafı yapılandırılır (Sunucu tarafı yapılandırma).
Doğrulama
İstemci kendi X-Forwarded-For değeriyle istek gönderdiğinde Debug Mode Logs kaydının Request sekmesinde başlığın tek değer taşıdığı görülür.
X-Forwarded-For: 198.51.100.45Yöntem 3: Add HTTP Header
- Nasıl çalışırAdd HTTP Header aksiyonu istemci IP'sini farklı adlı bir başlıkla (ör.
X-Real-IP) iletir. Değer, Header content alanındaki fx butonuyla seçilen Client IP address (%SRCIP) Smart Variable'ıdır. - Nerede açılırLoad Balancer → Actions → Add → Action Type: Add HTTP Header
- Gereksinim HTTP vService
- 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, 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 (Senaryo 1: istemci IP bilgisini iletme).
Add butonuna tıklanır.
Load Balancer → Load Balancer vService List ekranında HTTP vService seçilip Edit tıklanır.
Details → Actions alanında aksiyon seçilir.
Save butonuna tıklanır; ardından sunucu, başlığı (X-Real-IP) okuyacak şekilde yapılandırılır.
Doğrulama
Debug Mode Logs kaydının Request sekmesinde yeni başlık görülür.
X-Real-IP: 198.51.100.45Sunucu Tarafı Yapılandırma
Örneklerdeki 192.0.2.5 yerine TR7'nin sunucuya bağlandığı IP adresi yazılır: SNAT Default'ta Kurum Servisinin Route table'ında sunucuya giden trafiğin çıktığı arayüzün, sunucuyla (gateway üzerinden gidiliyorsa gateway'le) aynı subnet'teki Interface IP'si, Use Device IP'de seçilen SNAT IP. Cluster'da iki cihazın Interface IP'si de eklenir.
# ngx_http_realip_module (derlemede --with-http_realip_module gerekir)
set_real_ip_from 192.0.2.5;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# Yalnızca loga yazmak için log_format içine:
# $http_x_forwarded_for# mod_remoteip
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.0.2.5
# LogFormat'ta %h yerine %a kullanılır (çözülen istemci IP'si).
# Modül olmadan yalnızca loga yazmak için: %{X-Forwarded-For}i
LogFormat "%a %l %u %t \"%r\" %>s %b" commonIIS Manager → site → Logging → Format: W3C → Select Fields...
W3C Logging Fields → Add Field...
Field Name : X-Forwarded-For
Source Type: Request Header
Source : X-Forwarded-For
OK → OK → Actions: ApplyYalnızca TR7'ye güvenin
TR7 istemcinin gönderdiği X-Forwarded-For değerini silmez, kendi değerini zincirin sonuna ekler. Nginx'te set_real_ip_from, Apache'de RemoteIPInternalProxy yalnızca TR7'nin adresine verilir; real_ip_recursive on ile Nginx zincirdeki güvenilmeyen son adresi, yani TR7'nin eklediği değeri alır (ngx_http_realip_module, mod_remoteip). IIS'te bu ayar yalnızca log sütunu ekler; uygulama istemci IP'sini başlıktan ayrıca okumalıdır (Enhanced Logging for IIS 8.5).
Sık Yapılan Hatalar
- Sunucuda güveni TR7 ile sınırlamamak. TR7 istemcinin gönderdiği X-Forwarded-For'u silmez; uygulama zincirin en solunu okursa istemcinin yazdığı sahte bir IP'yi görebilir. Sunucu yalnızca TR7'den gelen değere güvenir.
- X-Forwarded-For seçeneğini aynı başlığı yazan bir aksiyonla birlikte kullanmak. Add HTTP Header ile
X-Forwarded-Foreklenirse çift X-Forwarded-For başlığı oluşur; Set HTTP Header kullanılıyorsa vService'teki seçenek kapalı tutulur. İkisinden biri seçilir. - Traffic mirroring'in "Add X-Forwarded-For Header" seçeneğiyle karıştırmak. O seçenek yalnızca yansıtılan kopya trafik içindir.
- L7 TCP ya da Network vService'te X-Forwarded-For aramak. Başlık yalnızca HTTP vService'te eklenir; diğer tiplerde PROXY protokolü ya da Use Client IP kullanılır (HTTP olmayan TCP servislerinde gerçek istemci IP'sini nasıl iletirim?).
- Cluster'da yalnızca bir cihazın adresini güvenilir yazmak. Eş cihaz aktif olduğunda başlık yok sayılır ve loglarda TR7'nin adresi görünür.
Dokümantasyonda nasıl yapılır
