HAProxy'li uzak IP'ler


19

Birkaç sorunu olan yeni bir web sunucusu kurulumunu test ediyorum. Esasen, kodun ilginç bazı şeyler için uzak IP'yi kullandığı bir web sunucumuz ve ayrıca bazı belirli IP'lere (ofisimiz vb.) Sabitlenmiş bazı apache dizinleri var.

Ancak, bunu daha fazla uygulama sunucusu eklemeye bakabilmek için ha_proxy'nin arkasına yerleştirdik, ancak şimdi uzak IP her zaman gerçek uzak kullanıcı değil, proxy ip olarak geliyor. Bu, bazı konumlara ulaşamayacağımız anlamına gelir ve uygulamamız, kullanıcı IP'sinin önemli olduğu yerlerde biraz garip davranıyor demektir.

Bizim yapılandırma aşağıdaki gibidir:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check

Yanıtlar:


31

Haproxy.1wt.eu adresindeki HAProxy belgesinden alıntılanmıştır .

- uygulamanın orijinal istemcinin IP'sini günlüğe kaydetmesi gerekiyorsa,
  ile "X-Forwarded-For" üstbilgisi ekleyecek "forwardfor" seçeneği
  orijinal istemcinin IP adresi. Ayrıca "httpclose"
  sadece her birinin ilkini değil, her isteği yeniden yazacağınızı
  oturum, toplantı, celse:
        seçenek httpclose
        ileri için seçenek

Uygulamanın, istemci IP adresini tanımak için X-Forwarded-For HTTP Üstbilgisine işlem yapması gerektiği belirtilir. Davanýza girmenin tek yolu gibi görünüyor.

HAProxy 1.4 için güncellendi

Haproxy 1.4 "seçenek http-server-close" ile yeni bir mod tanıttı. Sunucu bağlantısı hala kapalı, ancak mümkünse ve kullanıldığında istemciye karşı canlı kalmasını sağlıyor. Çoğu kurulumda, bağlantınızın tek yüksek gecikmeli kısmında (Haproxy ile istemci arasında) gecikmeye yardımcı olduğu için bunu muhtemelen kullanmak istersiniz.

   option http-server-close
   option forwardfor

2
Daha iyi kullanım option forwardfor header X-Real-IPve reqidel ^X-Real-IP:bu, günlüklerinizde IP'leri taklit etmeyi durdurur. FYI: 'seçeneği X-Real-IPiçin varsayılan üstbilgidir . NginXset_real_ip_from
Tino

Soru nginx'ten bahsetmiyor. X-Real-IP çalışmaz.
Rick Fletcher

1. bu iki seçeneğin ön uç veya arka uç yapılandırma bölümünde ayarlanması gerekiyor mu? (Çünkü burada çalışmıyor gibi görünüyorlar) 2. Tomcat düzeyinde de herhangi bir konfigürasyon gerekli mi?
yglodt

6

HAproxy'yi kaynak adresin iletilmesine izin verecek Tproxy'yi içerecek şekilde yeniden derlemenin bir yolu vardır.

Burada bir blog yazısı var: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Birkaç not:

En son linux çekirdeği (2.6.28-11-server) TProxy desteği içerir, bu nedenle çekirdeğin yeniden derlenmesi gerekli değildir.

Web grubunuzdaki sunucuları, HAProxy sunucusunu işaret eden varsayılan bir ağ geçidi adresiyle yapılandırdığınızdan emin olun.


2

Rpaf apache modülünü kullanın http://stderr.net/apache/rpaf/ Bunun eski ve eski bir yazı olduğunu biliyorum ama bunu bulmam günlerimi aldı. Bu, herhangi bir uygulamaya x-forwarded-for ip'i sunacaktır.


1

Apache üstbilgilerini değiştirdiğim uygulamanın gördüklerini geçersiz kılabileceğinizi unutmayın:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

Ancak bu, "İzin ver" vb. Aracılığıyla Apache erişimi için çalışmaz.


İstemci varolan bir X-Forwarded-Forüstbilgiyi, yeni virgül ve virgülle ayırarak varolan listenin sonuna eklendikçe, öngörülemeyen sonuçlara neden olabilir . Değişim (.*)için ([^ ]*)$sadece son IP'yi ... ya kullanımını kapmak için mod_rpafveya mod_remoteipApache 2.4 veya üzeri.
Ladadadada

1

HAProxy, tasarım gereği, orijinal IP adresini diğer sunuculara benzer şekilde gerçek sunucuya iletemez.

Çözümlerden biri, bir web sunucusuyla ilgili tek sorununuz varsa, istemcinin adresini içermesi gereken X iletilen HTTP üstbilgisine bakmak olabilir. Şimdi, bu uygulama / dile özgü, ancak php bu örneğe bir göz atın:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

Orijinal adresi günlüğe kaydetmek istiyorsanız, httpd.conf dosyasında LogFormat'ı aşağıdaki gibi görünecek şekilde değiştirebilirsiniz:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common


yanlış, "forwardfor" seçeneği ile yapabilirsiniz
wittwerch

Evet ve bu seçenek varsayılan olarak açıktır, ancak yaptığı şey X-Forwarded-For HTTP üstbilgisini ayarlamaktır.
Söylediklerim


0

Http://www.openinfo.co.uk/apache/ adresinden mod_extract_forwarded komutunu deneyin.

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

-1

Tcp ve nginx modunda haproxy ile kolay yol:

sunucu olarak send-proxy'yi ekle seçeneği:

haproxy.conf:

.

.

ssl dinle 0.0.0.0:443

mod tcp

en düşük bakiye

seçenek httpchk GET / ping

seçenek günlük-sağlık kontrolleri

sunucu w1 192.168.1.1:443 proxy gönderme denetimi check-ssl doğrulama yok

sunucu w2 192.168.1.1:443 proxy gönderme denetimi check-ssl doğrulama yok

.

.

Nginx'in proxy protokolünü desteklemesi gerekiyor

nginx.conf:

.

.

dinle 192.168.1.1:443 ssl proxy_protocol;

.

.

192.168.1.0/24 tarihinden itibaren set_real_ip_;

real_ip_header proxy_protocol;

.

.

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.