X-Forwarded-For ve Via gibi HTTP proxy başlıkları, proxy sunucuları tarafından; özgün istemciye, isteğin izlediği yola ve proxy'nin varlığı yüzünden başka türlü görünmeyecek diğer bağlamsal verilere ilişkin bilgileri upstream sunucuya iletmek için kullanılır.
Bir HTTP isteği bir veya daha fazla proxy sunucusundan geçtiğinde, hemen üstteki upstream sunucu genellikle özgün istemcinin değil son proxy'nin IP adresini görür. Proxy başlıkları, belirli HTTP başlıklarını ekleyerek veya değiştirerek bu sorunu çözer ve özgün istemcinin IP'sinin, protokolünün, host bilgisinin ve proxy sırasının nihai hedef sunucuya iletilmesini sağlar.
X-Forwarded-For
X-Forwarded-For (XFF) başlığı, bir HTTP proxy'si veya yük dengeleyici üzerinden web sunucusuna bağlanan istemcinin kaynak IP adresini belirlemek için kullanılan fiili standart bir başlıktır.
Amaç
Temel amacı; web sunucusunun günlük kaydı, analiz, güvenlik ve uygulamaya özgü mantık (örneğin IP tabanlı erişim denetimi, coğrafi konumlandırma) için özgün istemcinin IP adresine erişebilmesidir. XFF olmadan tüm isteklerin proxy sunucusunun IP adresinden geliyormuş gibi görünürdü.
Biçim ve örnekler
XFF başlığı, virgülle ayrılmış bir IP adresi listesi içerebilir. Bir istek birden fazla proxy'den geçtiğinde her proxy, kendisine bağlanan istemcinin IP adresini XFF başlığına ekler.
X-Forwarded-For: <client>, <proxy1>, <proxy2>
Örnek 1: Tek proxy
Bir istemci (192.0.2.1) bir proxy'ye (198.51.100.1) bağlanır, proxy de origin sunucuya bağlanır.
Proxy şunu ekler:
X-Forwarded-For: 192.0.2.1
Origin sunucu isteği 198.51.100.1 adresinden gelmiş olarak ve X-Forwarded-For: 192.0.2.1 başlığıyla görür.
Örnek 2: Birden fazla proxy
Bir istemci (192.0.2.1) Proxy A'ya (198.51.100.1) bağlanır, o Proxy B'ye (203.0.113.1) bağlanır, o da origin sunucuya bağlanır.
1. İstemciden Proxy A'ya: Proxy A X-Forwarded-For: 192.0.2.1 ekler.
2. Proxy A'dan Proxy B'ye: Proxy B X-Forwarded-For: 192.0.2.1 başlığını alır. Proxy B buna 198.51.100.1 değerini ekler.
Başlık şu hâle gelir: X-Forwarded-For: 192.0.2.1, 198.51.100.1.
3. Proxy B'den origin sunucuya: Origin sunucu X-Forwarded-For: 192.0.2.1, 198.51.100.1 başlığını alır.
Bir proxy zincirinde en soldaki IP adresi genellikle özgün istemcidir. En sağdaki IP adresi ise hemen üstteki upstream proxy'nin (mevcut proxy'ye bağlanan istemcinin) IP'sidir.
X-Forwarded-For için güvenlik değerlendirmeleri
X-Forwarded-For başlığı kötü niyetli bir istemci tarafından kolayca taklit edilebilir. İstemci, uydurma bir X-Forwarded-For başlığıyla istek gönderebilir.
GET / HTTP/1.1
Host: example.com
X-Forwarded-For: 10.0.0.1, 1.1.1.1
Bir proxy buna körü körüne ekleme yaparsa origin sunucunun aldığı başlık şöyle görünebilir: X-Forwarded-For: 10.0.0.1, 1.1.1.1, <proxy_ip>.
Bu nedenle downstream uygulamalar X-Forwarded-For başlığının tüm değerine doğrudan güvenmemelidir. Genel kabul gören yaklaşım; bilinen güvenilir proxy'lere ait girdileri çıkardıktan sonra listedeki en sağdaki güvenilmeyen IP adresini gerçek istemci IP'si olarak kabul etmektir. Birçok web sunucusu ve uygulama çatısı, güvenilir proxy listesi tanımlamak için mekanizmalar sunar.
Via
Via başlığı, bir isteğin (veya yanıtın) geçtiği ara proxy'leri ve ağ geçitlerini belirten standart bir HTTP başlığıdır.
Amaç
Via başlığı birkaç amaca hizmet eder:
* İzlenebilirlik: proxy zincirinin izini sunar, ağ yollarında hata ayıklamak için faydalıdır.
* Döngü tespiti: proxy zincirlerindeki istek döngülerinin saptanmasına yardımcı olabilir.
* Protokol uyumluluğu: her ara proxy'nin kullandığı protokol sürümlerini bildirir; bu, protokol dönüşümlerinde önemli olabilir.
Biçim ve örnekler
Her proxy başlığa kendi Via girdisini ekler. Her girdinin biçimi protocol-name/protocol-version host:port (comment) şeklindedir. comment alanı isteğe bağlıdır ve rastgele bilgi içerebilir.
Via: <protocol-name>/<protocol-version> <host>:<port> (comment)
Örnek:
Bir istemci, Proxy A (hostname proxy-a.example.com, port 8080) ve Proxy B (hostname proxy-b.example.com, port 80) üzerinden geçen bir istek gönderir.
- İstemciden Proxy A'ya: Proxy A
Via: HTTP/1.1 proxy-a.example.com:8080ekler. - Proxy A'dan Proxy B'ye: Proxy B
Via: HTTP/1.1 proxy-a.example.com:8080başlığını alır. Proxy B kendi girdisini başa ekler.
Başlık şu hâle gelir:Via: 1.1 proxy-b.example.com, 1.1 proxy-a.example.com:8080.
(Not: Protokol HTTP olduğundaHTTP/genellikle yazılmaz, 80/443 portları da atlanabilir.) - Proxy B'den origin sunucuya: Origin sunucu tam
Viabaşlığını alır.
Gizlilik ve operasyonel değerlendirmeler
Via başlığı iç ağ topolojisini ve hostname'leri açığa çıkarır; bazı kurulumlarda bu bir güvenlik veya gizlilik sorunu olabilir. Kurumlar, iç ağ bilgisinin dışarı sızmasını engellemek için dışa bakan proxy'lerde bu başlığı silmeyi veya değiştirmeyi tercih edebilir.
Forwarded
Forwarded başlığı, RFC 7239'da tanımlanmış standart bir başlıktır ve fiili standart olan X-Forwarded-For, X-Forwarded-Host ve X-Forwarded-Proto başlıklarının yerini almayı amaçlar.
Amaç
Özgün istemciye, proxy'nin kendisine ve özgün istek bağlamına (host, protokol) dair bilgileri upstream sunucuya iletmek için daha yapılandırılmış ve genişletilebilir bir yol sunar.
Biçim ve örnekler
Forwarded başlığı, zincirdeki her proxy'yi temsil eden, virgülle ayrılmış bir veya daha fazla parametre kümesi içerebilir. Her parametre kümesi anahtar-değer çiftleri kullanır. Yaygın parametreler:
* for: özgün istemcinin IP adresi (veya gizlenmiş tanımlayıcısı).
* by: isteği ileten proxy'nin IP adresi (veya gizlenmiş tanımlayıcısı).
* host: istemcinin talep ettiği özgün Host başlığı.
* proto: istemcinin kullandığı özgün protokol (örneğin http veya https).
Forwarded: for=<client_ip>; proto=<protocol>; host=<original_host>
Forwarded: for=<client_ip>, for=<proxy_ip>; proto=<protocol>
Örnek 1: Tek proxy
Bir istemci (192.0.2.1), example.com isteyerek HTTPS üzerinden bir proxy'ye (198.51.100.1) bağlanır.
Proxy şunu ekler:
Forwarded: for=192.0.2.1; proto=https; host=example.com
Örnek 2: Birden fazla proxy
İstemci (192.0.2.1) -> Proxy A (198.51.100.1) -> Proxy B (203.0.113.1) -> origin sunucu.
1. İstemciden Proxy A'ya: Proxy A Forwarded: for=192.0.2.1; proto=https; host=example.com ekler.
2. Proxy A'dan Proxy B'ye: Proxy B başlığı alır. Proxy B, kendisini tanımlamak üzere by dâhil olmak üzere kendi girdisini ekler.
Başlık şu hâle gelir:
Forwarded: for=192.0.2.1; proto=https; host=example.com, for=198.51.100.1; by=203.0.113.1
(Not: host ve proto parametreleri, bir proxy protokol veya host yeniden yazımı yapmadıkça genellikle yalnızca özgün istemciye ait ilk girdide yer alır.)
Karşılaştırma: X-Forwarded-For vs. Forwarded
| Özellik | X-Forwarded-For |
Forwarded |
|---|---|---|
| Standart durumu | Fiili standart (standart olmayan X- başlığı) |
RFC 7239 standardı |
| Bilgi | Yalnızca istemci IP adresleri | İstemci IP'si, proxy IP'si (by), özgün host, özgün protokol (proto) |
| Yapı | Virgülle ayrılmış IP adresi listesi | Virgülle ayrılmış, yapılandırılmış anahtar-değer parametre kümeleri listesi |
| Genişletilebilirlik | IP adresleriyle sınırlı | Ek parametrelerle yüksek düzeyde genişletilebilir |
| Yaygınlık | Mevcut yazılım ve altyapılar tarafından geniş biçimde destekleniyor | Kullanımı artıyor, ancak şu an XFF kadar yaygın değil |
| Güvenlik | Sahteciliğe açık; dikkatli ayrıştırma gerektirir | Yine sahteciliğe açık; yapılandırılmış ayrıştırma sağlamlığı artırır |
Diğer proxy başlıkları
X-Forwarded-Host
Bu fiili standart başlık, istemcinin Host HTTP istek başlığında talep ettiği özgün Host bilgisini belirtir. Bir proxy veya yük dengeleyici, isteği upstream sunucuya iletmeden önce Host başlığını (örneğin iç yönlendirme için) değiştirdiğinde, ancak uygulamanın mutlak URL üretmek veya sanal host'ları yönetmek gibi işler için istemcinin talep ettiği özgün host'u bilmesi gerektiğinde işe yarar.
Örnek:
İstemci example.com ister. Proxy, isteği iç host app-server-1 adresine iletir.
Host: app-server-1
X-Forwarded-Host: example.com
X-Forwarded-Proto
Bu fiili standart başlık, istemcinin proxy'ye veya yük dengeleyiciye bağlanırken kullandığı protokolü (HTTP veya HTTPS) belirtir. Proxy SSL/TLS sonlandırma yaptığında, yani istemci HTTPS ile bağlanırken proxy arka uç sunucuyla düz HTTP üzerinden haberleştiğinde bu bilgi kritiktir. Uygulamanın doğru bağlantılar üretebilmesi (örneğin http:// yerine https://) için özgün protokolü bilmesi gerekir.
Örnek:
İstemci bir yük dengeleyiciye HTTPS ile bağlanır. Yük dengeleyici arka uca HTTP ile bağlanır.
X-Forwarded-Proto: https
X-Real-IP
Bu da özgün istemcinin IP adresini iletmek için yaygın olarak NGINX tarafından kullanılan bir başka fiili standart başlıktır. X-Forwarded-For'dan farklı olarak genellikle tek bir IP adresi içerir: özgün istemcinin ya da hemen üstteki güvenilir upstream proxy'nin adresi. Çoğunlukla zincirdeki ilk proxy tarafından, X-Forwarded-For başlığı doğrulandıktan sonra ayarlanır.
Örnek:
X-Real-IP: 192.0.2.1
Pratik sonuçlar ve kullanım senaryoları
Proxy başlıkları; proxy'ler, yük dengeleyiciler ve CDN'ler içeren modern web mimarilerinde doğru çalışma ve güvenlik açısından temel öneme sahiptir.
- Günlük kaydı ve analiz: doğru istemci IP adresleri; web sunucusu erişim günlükleri, trafik analizi ve kullanıcı davranışı takibi için şarttır.
- Güvenlik:
- IP tabanlı erişim denetimi: belirli kaynaklara erişimi istemci IP adreslerine göre kısıtlamak.
- Hız sınırlama: istemci IP'si başına istekleri sınırlayarak kötüye kullanımı veya DDoS saldırılarını önlemek.
- Web Uygulama Güvenlik Duvarları (WAF): güvenlik kurallarını özgün istemcinin kimliğine göre uygulamak.
- Coğrafi konumlandırma: içerik özelleştirme veya mevzuata uyum için kullanıcının coğrafi konumunu belirlemek.
- Uygulama mantığı:
- URL üretimi: uygulamaların, istemcinin özgün isteğiyle uyumlu doğru mutlak URL'ler (örneğin yönlendirmeler veya uygulama içi bağlantılar) oluşturabilmesi için
X-Forwarded-HostveX-Forwarded-Protobaşlıklarına ihtiyacı vardır. - Oturum yönetimi: bazı oturum mekanizmaları IP adreslerine bağlı olabilir.
- Çok kiracılı uygulamalar: kiracıları özgün
Hostbaşlığına göre ayırt etmek.
- URL üretimi: uygulamaların, istemcinin özgün isteğiyle uyumlu doğru mutlak URL'ler (örneğin yönlendirmeler veya uygulama içi bağlantılar) oluşturabilmesi için
- Hata ayıklama ve sorun giderme:
Viabaşlığı ve tamX-Forwarded-Forzinciri, ağ yolu sorunlarını teşhis etmeye ve sorunlu proxy'leri belirlemeye yardımcı olur.
Proxy yapılandırması ve güvenlik en iyi uygulamaları
Proxy'lerin bu başlıkları doğru işleyecek şekilde yapılandırılması kritik önemdedir.
- Güven sınırları: yalnızca bilinen ve güvenilen upstream proxy'lerden gelen
X-Forwarded-For(veyaForwarded) girdilerine güvenin. Başlığı ayrıştıracak, güvenilir proxy IP'lerini tanıyacak ve gerçek istemci IP'sini en sağdaki güvenilmeyen girdiden türetecek bir mantık uygulayın. - Başlık silme/temizleme: dışa bakan proxy'lerde, iç ağ topolojisine dair bilgi sızmasını önlemek için
Viabaşlıklarını ve özel içX-başlıklarını silmeyi ya da temizlemeyi düşünün. - Tutarlılık: bir zincirdeki tüm proxy'lerin ve yük dengeleyicilerin bu başlıkları doğru şekilde ekleyecek veya ayarlayacak biçimde tutarlı yapılandırıldığından emin olun.
- Standart mı, özel mi: standart olan
Forwardedolsa daX-Forwarded-For,X-Forwarded-HostveX-Forwarded-Protohâlâ yaygın kullanılıyor. Uygulamalar çoğu zaman ikisini de destekler ya da varsaForwardedbaşlığına öncelik verir.
