PROXY Protocol, bir proxy'nin veya yük dengeleyicinin TCP bağlantısının başına küçük ve standartlaştırılmış bir başlık ekleyerek orijinal istemcinin bağlantı bilgilerini —gerçek IP adresi ve portu dahil— arka uç sunucusuna iletmesini sağlar.
Neden PROXY Protocol? Çözdüğü sorun
Standart TCP proxy'leri, istemci adına arka uç sunucusuna yeni bir bağlantı kurarak çalışır. Arka uç sunucusunun bakış açısından bağlantı, orijinal istemcinin değil proxy'nin IP adresinden gelir. Bu davranış istemcinin gerçek kimliğini gizler ve birkaç soruna yol açar:
- Log kaydı: Sunucu erişim logları proxy'nin IP'sini kaydeder; bu da isteklerin tek tek istemcilere kadar izlenmesini imkânsız kılar.
- Güvenlik: Arka uç sunucularındaki Web Application Firewall'lar (WAF), hız sınırlayıcılar ve erişim kontrol listeleri (ACL), kötü niyetli istemcileri gerçek IP adreslerine göre doğru şekilde tanıyıp engelleyemez.
- Analitik: Coğrafi hedefleme, kişiselleştirilmiş içerik sunumu ve kötüye kullanım tespiti sistemleri, istemcinin konum ve davranış verilerini kaybeder.
- Hata ayıklama: Orijinal istemci kaynağı görünmediğinde ağ sorunlarını veya belirli istemci davranışlarını teşhis etmek çok daha karmaşık hale gelir.
PROXY Protocol bunu, proxy'nin istemcinin bağlantı ayrıntılarını (kaynak IP, kaynak port, hedef IP, hedef port) proxy katmanının ötesine iletmesini sağlayan bir mekanizma sunarak çözer; böylece arka uç sunucusu orijinal istemciyi doğru şekilde tanıyabilir.
PROXY Protocol nasıl çalışır
PROXY Protocol, OSI modelinin taşıma katmanında (Katman 4) çalışır. PROXY Protocol destekleyen bir proxy veya yük dengeleyici bir istemciden bağlantı aldığında, arka uç sunucusuna yeni bir bağlantı kurar. Herhangi bir uygulama katmanı verisi (örneğin HTTP istekleri, veritabanı sorguları) göndermeden önce proxy, önce bir PROXY Protocol başlığı gönderir. Bu başlık istemcinin bağlantı bilgilerini içerir.
PROXY Protocol'ün doğru çalışması için iki koşulun sağlanması gerekir:
1. Proxy veya yük dengeleyici, PROXY Protocol başlığını gönderecek şekilde yapılandırılmalıdır.
2. Arka uç sunucusu, herhangi bir uygulama katmanı verisini işlemeden önce PROXY Protocol başlığını alacak ve ayrıştıracak şekilde yapılandırılmalıdır. Arka uç sunucusu başlığı anlamazsa, onu bozuk uygulama verisi olarak yorumlar ve bağlantı hataları oluşur.
PROXY Protocol sürümleri
PROXY Protocol'ün iki temel sürümü vardır: v1 ve v2.
Sürüm 1 (v1)
PROXY Protocol v1, ASCII tabanlı ve insan tarafından okunabilir bir biçimdir. TCP üzerinden IPv4 ve IPv6 destekler.
Biçim:
PROXY <INET_PROTOCOL> <CLIENT_IP> <PROXY_IP> <CLIENT_PORT> <PROXY_PORT>\r\n
<INET_PROTOCOL>: IPv4 içinTCP4, IPv6 içinTCP6.<CLIENT_IP>: Orijinal istemcinin IP adresi.<PROXY_IP>: Proxy'nin IP adresi (arka ucun bağlantı kaynağı olarak gördüğü IP).<CLIENT_PORT>: Orijinal istemcinin kaynak portu.<PROXY_PORT>: İstemcinin bağlandığı, proxy üzerindeki hedef port.
Örnek (IPv4):
PROXY TCP4 192.168.1.1 10.0.0.1 52345 80\r\n
Bu başlık, 192.168.1.1:52345 istemcisinden proxy'ye gelen bir TCPv4 bağlantısını ve proxy'nin ardından arka uca 10.0.0.1:80 üzerinden bağlandığını gösterir.
v1'in sınırlamaları:
* Yalnızca TCP bağlantılarıyla sınırlıdır.
* ASCII ek yükü onu bir miktar daha az verimli kılabilir.
* Ek meta veri desteklemez.
Sürüm 2 (v2)
PROXY Protocol v2, verimlilik ve genişletilebilirlik için tasarlanmış ikili (binary) bir biçimdir. TCP ve UDP üzerinden IPv4, IPv6 ve UNIX soketlerini destekler ve ek bağlantı meta verisi iletmek için Type-Length-Value (TLV) alan mekanizması içerir.
v2'nin avantajları:
* Verimlilik: İkili biçim başlık boyutunu küçültür.
* Daha geniş protokol desteği: TCP, UDP ve UNIX soketlerini destekler.
* IPv6 desteği: IPv6'yı tam olarak entegre eder.
* Genişletilebilirlik (TLV): SSL bağlantı bilgileri, benzersiz bağlantı kimlikleri veya uygulamaya özgü diğer veriler gibi rastgele meta verilerin iletilmesine olanak tanır.
Yapıya genel bakış (basitleştirilmiş):
v2 başlığı 13 baytlık bir imzayla başlar; ardından 1 baytlık sürüm/komut alanı, 1 baytlık protokol alanı, 2 baytlık adres uzunluğu alanı ve sonrasında değişken uzunluktaki adres bilgisi ile isteğe bağlı TLV alanları gelir.
Ham ikili biçim karmaşık olsa da, asıl önemli nokta daha fazla bilgiyi verimli şekilde ve daha geniş bir protokol yelpazesinde iletebilmesidir.
PROXY Protocol ile X-Forwarded-For (XFF) karşılaştırması
Hem PROXY Protocol hem de X-Forwarded-For (XFF) HTTP başlığı, istemci IP bilgisini bir proxy üzerinden aktarmayı amaçlar. Ancak farklı katmanlarda çalışırlar ve farklı özelliklere sahiptirler.
| Özellik | PROXY Protocol | X-Forwarded-For (XFF) başlığı |
|---|---|---|
| Çalışma katmanı | Taşıma katmanı (L4) | Uygulama katmanı (L7 — özellikle HTTP) |
| Protokol kapsamı | TCP/UDP tabanlı her protokol (HTTP, FTP, SSH, SMTP vb.) | Yalnızca HTTP/HTTPS |
| Mekanizma | Ham TCP/UDP akışının başına eklenen başlık | HTTP istek başlığı |
| İstemci kontrolü | İlk güvenilir proxy'den sonra kötü niyetli bir istemci tarafından taklit edilemez | İlk güvenilir proxy tarafından doğru işlenmezse kötü niyetli bir istemci tarafından taklit edilebilir |
| Bilgi | İstemci IP'si, istemci portu, proxy IP'si, proxy portu, (v2: TLV'ler) | İstemci IP'si (ve olası önceki proxy IP'leri) |
| Ek yük | Minimum, sabit boyutlu (v1) veya küçük ikili (v2) | HTTP başlıklarına eklenen küçük bir metin |
| Kullanım alanları | Gerçek istemci IP'sine ihtiyaç duyan her TCP/UDP servisi | Gerçek istemci IP'sine ihtiyaç duyan HTTP/HTTPS servisleri |
PROXY Protocol, istemci IP bilgisini aktarmak için özellikle HTTP dışı servislerde veya ağ katmanında istemci IP sahteciliğine karşı güçlü güvenceler gereken senaryolarda daha sağlam ve evrensel bir çözüm sunar.
PROXY Protocol'ü uygulama
PROXY Protocol'ü uygulamak, hem gönderen proxy/yük dengeleyicide hem de alan arka uç sunucusunda yapılandırma gerektirir.
Proxy/yük dengeleyici yapılandırması (PROXY Protocol gönderme)
HAProxy:
HAProxy, yük dengeleme için yaygın bir tercihtir ve PROXY Protocol'ü tam olarak destekler.
frontend http_in
bind *:80
mode tcp
default_backend web_servers
backend web_servers
mode tcp
server s1 192.168.1.10:80 send-proxy-v2 # PROXY Protocol v2 gönderir
server s2 192.168.1.11:80 send-proxy # PROXY Protocol v1 gönderir
AWS Network Load Balancer (NLB):
Bir NLB için Target Group yapılandırırken PROXY Protocol v2 desteğini etkinleştirebilirsiniz. Bu ayar tüm hedef grubuna uygulanır. Gruptaki tüm hedeflerin PROXY Protocol'ü kabul edecek şekilde yapılandırılması gerekir.
Cloudflare Spectrum:
Cloudflare Spectrum üzerinden geçen servisler için PROXY Protocol desteğini etkinleştirebilirsiniz. Cloudflare, origin sunucularınıza PROXY Protocol v2 başlıkları gönderir.
Nginx (Stream modülü — proxy olarak):
Nginx'in ngx_stream_proxy_module modülü, çoğunlukla ticari sürümünde veya belirli derlemelerinde PROXY Protocol gönderecek şekilde yapılandırılabilir.
stream {
upstream backend_servers {
server 192.168.1.10:80;
server 192.168.1.11:80;
}
server {
listen 12345;
proxy_pass backend_servers;
proxy_protocol on; # Nginx PROXY Protocol v1 gönderir
}
}
Arka uç sunucusu yapılandırması (PROXY Protocol'ü alma ve ayrıştırma)
Nginx (arka uç web sunucusu olarak):
Nginx, PROXY Protocol başlıklarını dinleyip ayrıştıracak şekilde yapılandırılabilir.
http {
server {
listen 80 proxy_protocol; # 80 numaralı portta PROXY Protocol v1/v2 dinler
listen 443 ssl proxy_protocol;
set_real_ip_from 10.0.0.0/8; # Proxy ağınızdaki IP'lere güvenir
real_ip_header proxy_protocol; # PROXY Protocol başlığındaki IP'yi kullanır
location / {
root /var/www/html;
index index.html;
# İstemcinin gerçek IP'si artık $remote_addr içinde bulunur
# ve $proxy_protocol_addr log ya da özel mantık için kullanılabilir
log_format custom_log '$proxy_protocol_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log custom_log;
}
}
}
Nginx'te $remote_addr proxy'nin IP'sine ayarlanır; ancak $proxy_protocol_addr ve $proxy_protocol_port değişkenleri istemcinin gerçek IP'sini ve portunu içerir. set_real_ip_from ve real_ip_header proxy_protocol yönergeleri, Nginx'in $remote_addr değerini istemcinin gerçek IP'siyle doğru şekilde doldurmasını sağlar.
Apache HTTP Server:
Apache, PROXY Protocol başlıklarını ayrıştırmak için mod_remoteip modülünü kullanabilir.
<IfModule mod_remoteip.c>
# PROXY Protocol ayrıştırmasını etkinleştir
RemoteIPProxyProtocol On
# Güvenilir proxy'leri tanımla
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 192.168.0.0/16
# Log biçimini gerçek istemci IP'sini kullanacak şekilde ayarla
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
</IfModule>
RemoteIPProxyProtocol On ile Apache, PROXY Protocol başlığını bekler. LogFormat içindeki %a değişkeni de böylece istemcinin gerçek IP'sini doğru şekilde yansıtır.
Özel uygulamalar:
Python, Node.js, Go veya Java gibi dillerde yazılmış özel uygulamalarda, uygulamanın kendisi gelen TCP akışını okumalı, PROXY Protocol başlığını kontrol etmeli, ayrıştırmalı ve ancak ondan sonra uygulamaya özgü protokolle devam etmelidir.
- Tespit: Uygulama önce soketten birkaç bayt (örneğin 100–200 bayt) okuyarak bunların PROXY Protocol v1 imzasıyla (
PROXY) veya v2 imzasıyla eşleşip eşleşmediğini kontrol etmelidir. - Ayrıştırma: Bir PROXY Protocol başlığı tespit edilirse uygulama, istemci IP'sini, portunu vb. çıkarmak için başlığı ayrıştırır.
- Devam: Ayrıştırmadan sonra uygulama, soketteki kalan veriyi kendi doğal protokolü olarak işler.
- Başlık yoksa: Hiçbir PROXY Protocol başlığı bulunmazsa uygulama, bağlantının doğrudan bir istemciden veya PROXY Protocol kullanmayan bir proxy'den geldiğini varsayar ve veriyi doğrudan işler.
Birçok ağ kütüphanesi ve framework'ü, PROXY Protocol ayrıştırması için ara katman (middleware) veya yerleşik destek sunar.
PROXY Protocol kullanmanın faydaları
- Doğru IP kaydı: Sunucu erişim loglarının, güvenlik duvarlarının ve izleme sistemlerinin gerçek istemci IP adresini kaydetmesini sağlar.
- Güçlenmiş güvenlik: Arka uç sunucularındaki güvenlik araçlarının (WAF, DDoS azaltma, hız sınırlayıcılar) politikaları istemcinin gerçek kimliğine göre uygulamasına imkân verir.
- Daha iyi analitik: Analitik, A/B testleri ve kişiselleştirme için doğru coğrafi ve demografik veri sağlar.
- Basitleşen ağ mimarisi: İstemci IP yönetimini taşıma katmanında toplar ve XFF gibi uygulamaya özgü başlıklara olan ihtiyacı azaltır.
- Geniş uyumluluk: Yalnızca HTTP ile değil, TCP/UDP tabanlı her uygulamayla çalışır.
Dikkat edilmesi gerekenler ve iyi uygulamalar
- Güven sınırları: PROXY Protocol'ü yalnızca kendi kontrolünüzdeki güvenilir proxy'ler veya yük dengeleyicilerden gelen bağlantılar için etkinleştirin. Güvenilmeyen bir taraf sahte bir PROXY Protocol başlığı gönderirse, arka uç sunucunuz istemcinin kaynağı konusunda yanıltılabilir.
- Uçtan uca uyumluluk: Hem proxy'nin hem de arka uç sunucusunun aynı PROXY Protocol sürümünü (v1 veya v2) gönderip alacak şekilde doğru yapılandırıldığından emin olun. Uyuşmazlıklar bağlantı hatalarına yol açar.
- Performans: PROXY Protocol başlığının getirdiği ek yük, özellikle v2'nin ikili biçiminde minimum düzeydedir. Yine de her bağlantıda yapılan ayrıştırma küçük ve ihmal edilebilir bir işlem maliyeti ekler.
- İzleme: İstemci IP'lerinin doğru şekilde belirlendiğini ve beklenmedik PROXY Protocol hatalarının oluşmadığını doğrulamak için arka uç sunucu loglarınızı ve ağ trafiğinizi izleyin.
