haproxy ve istemci IP adresini sunuculara iletme


15

HAproxy ile ilgili bir sorunum var.

HAproxy'yi, gelen http isteklerini 5 web sunucusuna dağıtan yük dengeleyici olarak kullanıyorum. normalde bir istemci isteği yük dengeleyicisinin IP'si olan web sunucularına iletilir. Ancak istemcilerin IP'lerine veya web sunucularından bir şey isteyen gerçek IP'lere ihtiyacım var. Çünkü gerçek müşterinin IP'lerini kaydetmemiz gerekiyor.

Web sunucularında müşterinin IP'lerini almaya çalışıyorum ama şimdiye kadar başarılı olamıyorum. Her zaman yük dengeleyicinin IP'sini görüyorum.

X-forward-for seçeneğini kullanıyorum ancak problem çözülmedi. Bundan sonra başka bir seçenek " kaynak 0.0.0.0:80 usesrc clientip " bulundu ama HAproxy USE_TPROXY seçeneği ile derleme ihtiyaçları hakkında olan HAproxy çalıştırmak çalışırken eror var. Yaptım, HAproxy'yi USE_TPROXY seçeneğiyle yeniden derledim, ancak hiçbir şey değiştirmiyor. gerçek müşterinin IP'lerini öğrenmek için ne yapabilirim?

Linux çekirdeğimin sürümü 2.6.32-34 Yani çekirdek şeffaf proxy'yi destekliyor. ve UBUNTU 10.4 LTS kullanıyorum

benim yapılandırma dosyam burada

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    (1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
        (2)source 0.0.0.0:80 usesrc clientip
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor header X-Client
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:xXx

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

(1) (2) HAproxy'yi test ederken bu iki çizgiden birini kullandım.

Birisi sunucularımızdan talepte bulunan istemcilerin gerçek IP'lerini öğrenmeme yardımcı oluyor mu?


Aradığınız şeye 'şeffaf proxy' denir. iptables bir şekilde dahil, ama tam olarak nasıl emin değilim.
sysadmin1138

şeffaf vekil diyerek, gelen bağlantıları dağıtırken http üstbilgilerini değiştirmeyen vekillerden söz ediyorum. böylece gerçek web sayfası talep eden müşterinin IP'si web sunucusuna gönderilebilir. Şeffaf vekilden anladığım bu.
Sistem

Yanıtlar:


15

Bu sorunu çözdüm. Belki başından beri bir sorun değildi. Bu sorunla karşılaştığımda google arama yaptım ve gördüm

option forwardfor

haproxy.cfg dosyasında ve diğer seçeneklerde kullanmak için satır. Ben haproxy yeniden derleme dahil bu seçenekleri denedim ... Ama gerçek istemcilerin IP sunucuları web sunucularında öğrenme ile ilgili gerçek sorun HAproxy kaynaklı değil, bu senaryo dili PHP bizim durumumuzda, sunucu komut dosyaları ile başlıkları okumak ile ilgilidir.

Bu komutlarla müşterinin IP'lerini öğrenmeye çalışıyorum

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

ve bu komutlar yük dengeleyicisinin IP'sini görüntüler. Bu doğru ama beklediğim bu değil. Forwardfor seçeneğine rağmen bu komutlar bana yük dengeleyicinin IP'sini verdi

Forwardfor seçeneğini kullanarak HAproxy'nin x-forwarded-for başlığını web sunucularımıza gönderilen istemcilerin isteklerine eklemesini sağlıyoruz. HAproxy bu alanı başlığa koydu ama ben bunu görmezden geldim. Bugün bunun bir başlık alanı olduğunu fark ettim ve bu başlığı bu şekilde okumalıyım

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

Bu komutla istemcinin IP adresini loadbalancer'ın IP adresi almadım.

Ama benim teklifim başlık veri almak için diğer bilgileri PHP için getallheaders () işlevi araştırmaktır.

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

Son haproxy.cfg dosyamın sonu aşağıdaki gibidir.

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:passwd

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

Yine de HAproxy hakkında uid veya gid anlamı gibi birçok eksik şeyim var.


2

Apache günlüğünde istemci IP adresine ihtiyacınız varsa, X-forwarded-for'u orijinal kaynağında (5h) oturum açmak için apache conf'inizi değiştirebilirsiniz.

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Cevabınız için teşekkürler Marcelo, ancak Apache günlüğünde müşterinin IP adresine ihtiyacımız yok. php scriptlerimizle öğrenmeye çalışıyoruz.
Sistem

1

Sadece Sistemin çözümü @ çalıştı ve başlığı adı değiştirildi görünüyor HTTP_X_FORWARDED_FORiçin x-forwarded-for. Muhtemelen HAproxy versiyonu ile ilgilidir, çünkü cevap 5 yıl önce yazılmıştır ...?

Örnek olarak, bu üretim üzerinde çalışıyor:

String requestIp = httpRequest.getHeader("x-forwarded-for");

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.