HAproxy'yi SSL ile nasıl kullanabilirim ve X-Forwarded-For üstbilgilerini nasıl alabilirim ve PHP'ye SSL'nin kullanıldığını söyleyebilirim?


20

Aşağıdaki kurulum var:

(internet) ---> [  pfSense Box  ]    /-> [ Apache / PHP server ]
                [running HAproxy] --+--> [ Apache / PHP server ]
                                    +--> [ Apache / PHP server ]
                                     \-> [ Apache / PHP server ]

HTTP istekleri için bu harika çalışıyor , istekler Apache sunucularıma dağıtılıyor. SSL istekleri için, TCP yük dengeleme kullanarak istekleri dağıtan HAproxy vardı ve ancak çalıştı, ancak HAproxy bir proxy gibi davranmadığından, X-Forwarded-ForHTTP üstbilgisini eklemedi ve Apache / PHP sunucuları istemcinin gerçek IP adresi.

Bu yüzden, stunnelHAproxy'nin önüne ekledim, stunnel'in X-Forwarded-ForHTTP başlığını ekleyebileceğini okudum . Ancak, pfSense içine yükleyebileceğim paket bu başlığı eklemiyor ... Ayrıca, bu görünüşe göre gerçekten tutmak istediğim KeepAlive isteklerini kullanma yeteneğimi öldürüyor . Ancak bu fikri öldüren en büyük sorun, stunnel'in HTTPS isteklerini düz HTTP isteklerine dönüştürmesiydi, bu yüzden PHP SSL'nin etkinleştirildiğini ve SSL sitesine yönlendirmeye çalıştığını bilmiyordu.

Nasıl istemci IP adresini hem bu sunucular sağlayan SSL sunucularının sayısı arasında yük dengesi HAProxy biliyoruz kullanabilir ve SSL kullanımda olduğunu biliyor musunuz? Mümkünse pfSense sunucumda nasıl yapabilirim?

Yoksa tüm bunları bırakmalı ve sadece nginx kullanmalı mıyım?


3
Re: stunnel ve burayaX-Forwarded-For bakın .
Shane Madden

@Shane: Teşekkürler. KeepAlive kaybettiğimi tam olarak burada okudum :-)
Josh

2
Mükemmel ASCII diyagramı için +1. :-)
KyleFarris

@AlanHamlett, bağlantınız 404.
luckydonald

@luckydonald teşekkürler, işte güncellenmiş bir bağlantı. Proxy Protokolünü haproxy yapılandırmanıza send-proxy anahtar sözcüğünü ekleyerek kullanabilirsiniz. Burada örneklerle bir blog yazısı yazdım: wakatime.com/blog/23-how-to-scale-ssl-with-haproxy-and-nginx
Alan Hamlett

Yanıtlar:


17

Hepsini bırakmanıza gerek yok, SSL desteği için haproxy'nin önünde nginx'i kullanabilirsiniz ve tüm yük dengeleme yapılandırmanızı koruyabilirsiniz. İstemiyorsanız HTTP için nginx kullanmanıza bile gerek yoktur. Nginx hem X-Forwarded-For hem de SSL'nin kullanıldığını belirten özel bir üstbilgi (ve isterseniz istemci sertifikası bilgilerini) geçirebilir. Gerekli bilgileri gönderen Nginx yapılandırma snippet'i:

proxy_set_header SCHEME $scheme;      # http/https
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header CLIENT_CERT $ssl_client_raw_cert;

37

Sadece kayıt için, bu iş parçacığı genellikle HAProxy + SSL ile ilgili olarak adlandırıldığı için, HAProxy 1.5-dev12'den beri her iki tarafta yerel SSL'yi destekliyor. Bu nedenle, X-Forwarded-For, HTTP canlı tutma ve sunucuya bağlantının SSL üzerinden yapıldığını söyleyen bir üstbilgiye sahip olmak aşağıdakiler kadar basittir:

listen front
    bind :80
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    option http-server-close
    option forwardfor
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    server srv1 1.1.1.1:80 check ...
    ...

Eminim farklı bir şey bulduğunuzda, ama en azından yeni ziyaretçiler şimdi kolay çözümü alacak :-)


Teşekkürler, bu iyi bir genel bilgi ... sorum şu pfSense üzerinde çalışan HAproxy hakkındaydı, bu yüzden şimdilik pfSense HAProxy'nin (henüz) bu sürümünü desteklemediğinden, hala HAproxy'nin önünde nginx kullanmam gerekiyor
Josh

Üzgünüm Josh, pfSense üzerinde bileşenleri güncelleyip güncelleyemeyeceğinizi bilmiyorum ve bir paket kurma hakkında konuştuğunuzdan, bunun böyle olduğuna inanıyordum. En son denediğimde yaklaşık 5 yıl önceydi, bu yüzden tüm detayları hatırlamıyorum.
Willy Tarreau

1
Şimdilik haproxy yapılandırması hakkında fazla bir şey anlamıyorum, ancak en son sürümle birlikte bir acl eklemek zorunda kaldım: acl is-ssl dst_port 443ve bir satırı yeniden yazdım: reqadd X-Forwarded-Proto:\ https if is-sslNginx bu üstbilgiyi oldukça iyi ele alıyor gibi görünüyor
greg0ire

Bu bir cazibe gibi çalıştı. Nginx gerekmez.
Jay Taylor

1
@ greg0ire çünkü son haproxy ile is_ssl ama ssl_fc yok
josch

12

Bu soruyu bulan diğer herkes için Ochoto'nun tavsiyelerine uydum ve nginx kullandım. İşte pfSense yönlendiricimde bu işlemi yapmak için kullandığım özel adımlar :

  1. Pfsense web arabirimini kullanarak pfsense PfJailctl paketini ve "jail_template" paketini Sistem> Paketler altına yükledim, böylece altında pginense sistemine nginx derlemek ve yüklemek için bir FreeBSD hapishane oluşturabilirim.

  2. Hizmetler> Hapishaneler altında nginx sunucum için bir hapishane yapılandırdım , yeni hapishaneye HAproxy üzerinde çalıştığım sanal IP diğer adının aynı ana bilgisayar adını ve IP adresini verdim. Hapishaneyi WAN arayüzüne bağladım. Varsayılan hapishane şablonunu kullandım ve nullfs yerine unionfs'yi etkinleştirdim.

  3. Hapishane başlatıldıktan sonra, pfsense kutusuna SSHed girdim ve jlshapishanenin numarasını bulmak için koştum . Sonra jexec 1 shhapishanenin içine bir kabuk sokmak için koştum . Oradan kullanarak BSD portları kurdum ve nginx'i kurdum:

    portsnap extract
    portsnap fetch update
    cd /usr/ports/www/nginx
    make install clean
    
  4. Daha sonra nginx'i 443 numaralı bağlantı noktasını dinleyecek ve HTTP üstbilgileri içindeki gerçek IP ve SSL durumu da dahil olmak üzere 80 numaralı bağlantı noktasındaki tüm istekleri HAproxy'ye ileteceğim. Benim usr/local/etc/nginx/nginx.confgibi görünüyor:

    worker_processes  1;
    
    events {
        worker_connections  2048;
    }
    
    http {
        upstream haproxy {
            server 209.59.186.35:80;
        }
    
        server {
            listen       443;
            server_name  my.host.name default_server;
            ssl                  on;
            ssl_certificate      my.crt;
            ssl_certificate_key  my.key;
            ssl_session_timeout  5m;
    
            ssl_protocols  SSLv3 TLSv1;
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers   on;
    
            location / {
                proxy_pass http://haproxy;
    
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
                proxy_set_header X-Forwarded-Proto https;
            }
        }
    
    }
    
  5. Daha sonra X-Forwarded-ProtoHTTP başlığını algılamak için PHP uygulamamı değiştirdim :

    function usingSSL()
    {
        return (
           (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' )
            || (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
                   && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' ));
    }
    

Yani son kurulum:

(internet) ---> [ -> nginx -> haproxy -]--> (pool of apache servers)
                [    (pfSense server)  ]

2
Gerçekten ihtiyacınız yoksa SSLv2'yi devre dışı bırakmalısınız. gnu.org/software/gnutls/manual/html_node/… Nginx'in varsayılan yapılandırmasında neden hala desteklediğini bilmiyorum.
Ochoto

Ayrıca 1024 çalışan bağlantısıyla en fazla 512 eşzamanlı istemciyi destekleyeceğinizi unutmayın.
Ochoto

@Ochoto: Her iki ipucu için de teşekkürler! HAproxy'de yeniyim ama nignx'e daha az aşinayım ...
Josh

7

1.5-dev-17 haproxy sürümü için yapılandırmam:

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        user haproxy
        group haproxy
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option  http-server-close
        retries 3
        option redispatch
        fullconn 1000        
        maxconn 1000
        timeout queue 600s
        timeout connect 5s
        timeout client 600s
        timeout server 600s

frontend http-in
        bind *:80
        bind *:443 ssl crt /usr/local/etc/ssl/certs
        reqadd X-Forwarded-Proto:\ https if { ssl_fc }
        default_backend varnish-ha
        option forwardfor
backend varnish-ha
  server hafront1 10.1.69.1:6081  minconn 100 maxqueue 10000

ssl_fcACL kullanır . Parçanın option http-server-closeçok önemli olduğunu lütfen unutmayın .


Teşekkürler! HAProxy v1.4 kullanıyorum, bu yüzden bunu yapabileceğimi sanmıyorum, ama başkalarına yardımcı olabilir.
Josh

Evet ve 1.5 yakında çıkacak.
greg0ire

5

HAProxy, ham TCP modunu kullanmadan kaybetmeden bir SSL arka ucuna vuramaz X-Forwarded-For, ancak trafiği arka uç geçişi için bir dinleme stunneliyle yeniden şifreleyebilirsiniz. Çirkin, yine de.

Ochoto'nun yaklaşımını bir uyarı ile daha çok seviyorum: nginx mükemmel bir yük dengeleyicisidir; Eğer kullanıyorsanız, her şey için kullanın diyebilirim. Dengeli HTTPS arka uçlarını yüklemek için gelen HTTPS'nizi proxy'ye alın ve bu şekilde SSL bilgileri için özel başlıklara gerek yoktur (istemci sertifikasına ihtiyacınız yoksa).


HAproxy'ye neden bağlı olduğumdan emin değilim. Bence pfSense'in bir paketi var ve SOIS bunu kullanıyor. İkisi de büyük bir sebep değil. :-)
Josh

Nginx bee'den yetenekli bir yük dengeleyici kazıyorum, upstream_fair standart dışı modül kullanmıyorsanız, hedef arka ucun zaten isteklerle meşgul olup olmadığını ve dolayısıyla bu arka uçta sıraya girmeyi dikkate almadan basit bir yuvarlak robin (veya istemci ip hash) yapmazsanız ücretsiz ve iş bekleyen başka arka uçları var. HAProxy ayrıca arka uçları güzel bir şekilde izler ve bunlarla ilgili istatistikleri görüntüler.
Ochoto

Aşağıdakilerden sadece biri gerçekleşirse a) Nginx iyi durum takibi ve adil yük dengeleme alır b) HAProxy iyi SSL desteği alır Sadece umut edebilirsin
Yavor Shahpasov

SSL için nginx -> haproxy -> nginx -> arka ucunu kullanarak bir kurulum dağıttım, bunun nedeni burada tartışıldığı gibi haprokside HTTPS desteğinin olmaması, aynı zamanda nginx http sağlık kontrolü komut dosyalarını desteklememesi nedeniyle.
Geoffrey

2

Geçen yıl HAProxy'yi pfSense ile HAProxy'nin tüm özelliklerini kullanacak ve pfSense ile iyi bir şekilde koruyacak şekilde entegre etmek için bir çözüm uyguladım. Böylece üretim ortamları için uygun bir seçenektir . SSL, HAProxy'de sonlandırıldı . HAProxy'yi ezjail ve Ports Collection kullanarak pfSense'teki bir hapishaneye kurdum . Bu şekilde her iki bileşenin bağımsız olarak bakımı çok kolaydır. İstediğiniz sürümü yükleyebilirsiniz. 1.5-dev13 ile başladım. Ve o zamandan beri benim için mükemmel çalışıyor. Burada her şeyi belgeledim.

PfSense'e HAProxy Kurulumu

BTW Willy, mükemmel bir ürün için çok teşekkürler.

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.