मैं SSL के साथ HAproxy का उपयोग कैसे कर सकता हूं और X- फॉरवर्ड-फॉर हेडर प्राप्त कर सकता हूं और PHP को बता सकता हूं कि SSL उपयोग में है?


20

मेरे पास निम्न सेटअप है:

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

HTTP अनुरोधों के लिए यह बहुत अच्छा काम करता है , अनुरोध मेरे Apache सर्वरों को ठीक वितरित किए जाते हैं। एसएसएल अनुरोधों के लिए, मैंने टीसीपी लोड बैलेंसिंग का उपयोग करते हुए अनुरोधों को वितरित करने के लिए HAproxy का वितरण किया था, और यह तब भी काम किया था क्योंकि HAproxy ने प्रॉक्सी के रूप में कार्य नहीं किया था, इसमें X-Forwarded-ForHTTP हेडर नहीं जोड़ा गया था , और Apache / PHP सर्वरों को क्लाइंट का पता नहीं था असली आईपी पता।

इसलिए, मैंने stunnelHAproxy के सामने जोड़ा , यह पढ़कर कि stunnel X-Forwarded-ForHTTP हेडर जोड़ सकता है । हालाँकि, पैकेज जिसे मैं pfSense में स्थापित कर सकता था, इस हेडर को नहीं जोड़ता है ... साथ ही, यह जाहिरा तौर पर KeepAlive अनुरोधों का उपयोग करने की मेरी क्षमता को मारता है , जिसे मैं वास्तव में रखना चाहूंगा। लेकिन सबसे बड़ा मुद्दा जिसने उस विचार को मार दिया, वह यह था कि stunnel ने HTTPS अनुरोधों को सादे HTTP अनुरोधों में बदल दिया, इसलिए PHP को पता नहीं था कि SSL सक्षम था और SSL साइट पर पुनर्निर्देशित करने का प्रयास किया गया था।

मैं कई एसएसएल सर्वरों में शेष राशि लोड करने के लिए HAproxy का उपयोग कैसे कर सकता हूं, जिससे उन सर्वरों को क्लाइंट के आईपी पते का पता चल सके और पता चल सके कि एसएसएल उपयोग में है? और यदि संभव हो तो, मैं इसे अपने pfSense सर्वर पर कैसे कर सकता हूं?

या मुझे यह सब छोड़ देना चाहिए और सिर्फ नगनेक्स का उपयोग करना चाहिए?


3
पुन: stunnel और X-Forwarded-For, यहाँ देखें ।
शेन झुंझलाना

@ शने: धन्यवाद। ठीक यही वह जगह है जहां मैंने पढ़ा कि मैं KeepAlive :-) खो देता हूं
जोश

2
उत्कृष्ट ASCII आरेख के लिए +1। :-)
काइलफ़ारिस

@Alan Hamlett, आपका लिंक 404 है।
luckydonald

@luckydonald धन्यवाद, यहाँ एक अद्यतन लिंक है। आप अपने प्रॉक्सी सर्वर को सेंड-प्रॉक्सी कीवर्ड जोड़कर प्रॉक्सी प्रोटोकॉल का उपयोग कर सकते हैं। मैंने यहाँ उदाहरणों के साथ एक ब्लॉग पोस्ट लिखी है: wakatime.com/blog/23-how-to-scale-ssl-with-haproxy-and-nginx
एलन हैमलेट

जवाबों:


17

आपको यह सब छोड़ने की जरूरत नहीं है, आप अपने सभी लोड बैलेंसिंग कॉन्फिगरेशन को ध्यान में रखते हुए SSL सपोर्ट के लिए haproxy के सामने nginx का उपयोग कर सकते हैं। यदि आप नहीं चाहते हैं तो भी आपको HTTP के लिए nginx का उपयोग करने की आवश्यकता नहीं है। Nginx X- फ़ॉर्वर्ड-फॉर दोनों को पास कर सकता है और SSL का संकेत देने वाला एक कस्टम हेडर उपयोग में है (और यदि आप चाहें तो क्लाइंट सर्टिफ़िकेट जानकारी)। Nginx कॉन्फ़िगर स्निपेट जो आवश्यक जानकारी भेजता है:

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

केवल रिकॉर्ड के लिए, क्योंकि यह धागा अक्सर HAProxy + SSL से संबंधित होता है, HAProxy 1.5-dev12 के बाद से दोनों ओर से देशी SSL का समर्थन करता है। तो X- फॉरवर्डेड-फॉर, HTTP रखना-साथ ही एक हेडर जो सर्वर को बता रहा है कि एसएसएल पर कनेक्शन बनाया गया था, निम्न के रूप में सरल है:

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 ...
    ...

मुझे यकीन है कि तब तक आप कुछ अलग करके आए थे, लेकिन कम से कम नए आगंतुकों को अब आसान समाधान मिल जाएगा :-)


धन्यवाद, यह अच्छी सामान्य जानकारी है ... मेरा सवाल HAproxy के बारे में था pfSense पर चल रहा है इसलिए अभी मैं अभी भी HAProxy के सामने nginx उपयोग करने के लिए, pfSense HAProxy के इस संस्करण का समर्थन नहीं करता के रूप में (अभी तक) की आवश्यकता
जोश

क्षमा करें, जोश, मुझे यह जानने के लिए pfSense के बारे में पर्याप्त नहीं पता है कि क्या आप इस पर घटकों को अपडेट कर सकते हैं या नहीं, और जब से आप पैकेज स्थापित करने के बारे में बोल रहे थे, तो मुझे विश्वास था कि यह मामला था। पिछली बार मैंने कोशिश की थी कि यह लगभग 5 साल पहले हो, इसलिए मुझे सभी विवरण याद नहीं हैं।
विली तरारेउ

1
मैं अब के लिए haproxy विन्यास के बारे में बहुत कुछ नहीं समझता, लेकिन नवीनतम संस्करण के साथ, मुझे एक acl जोड़ना था: acl is-ssl dst_port 443और एक पंक्ति को फिर से लिखना: reqadd X-Forwarded-Proto:\ https if is-sslNginx इस हेडर को काफी अच्छी तरह से हैंडल करता है
greg0ire

इसने एकदम जादू की तरह काम किया। कोई नगीनक्स की आवश्यकता नहीं है।
जे टेलर

1
@ greg0ire ऐसा इसलिए है क्योंकि नवीनतम haproxy के साथ इसमें is_ssl नहीं बल्कि ssl_fc है
josch

12

किसी और के लिए जो इस सवाल का पता लगाता है, मैंने ओचोटो की सलाह का पालन किया और नगनेक्स का इस्तेमाल किया। यहाँ मैं अपने pfSense राउटर पर इस काम को करने के लिए उपयोग किए गए विशिष्ट कदम हैं :

  1. Pfsense वेब इंटरफ़ेस का उपयोग करते हुए, मैंने सिस्टम> संकुल के अंतर्गत pfsense PfJailctl पैकेज और "जेल_टेमप्लेट" पैकेज स्थापित किया ताकि मैं एक FreeBSD जेल बना सकूं जिसके तहत pfsense प्रणाली पर nginx को संकलित और स्थापित करने के लिए।

  2. मैंने सेवाओं> जेलों के तहत अपने nginx सर्वर के लिए एक जेल को कॉन्फ़िगर किया , नई जेल को उसी वर्चुअल होस्ट नाम का एक ही होस्टनाम और आईपी पता दिया, जिस पर मैं HAproxy चल रहा था। मैंने जेल को WAN इंटरफ़ेस के लिए बाध्य किया। मैंने डिफ़ॉल्ट जेल टेम्पलेट का उपयोग किया और nullfs के बजाय यूनियनफ़ेस को सक्षम किया।

  3. एक बार जेल शुरू होने के बाद, मैं SSHed के लिए pfsense बॉक्स में गया और jlsजेल का नंबर खोजने के लिए भागा । मैं तब jexec 1 shजेल के अंदर एक खोल पाने के लिए भागा । वहाँ से मैंने BSD पोर्ट स्थापित किए और nginx का उपयोग कर स्थापित किया:

    portsnap extract
    portsnap fetch update
    cd /usr/ports/www/nginx
    make install clean
    
  4. मैंने पोर्ट 443 पर सुनने के लिए nginx को कॉन्फ़िगर किया था, और HTTP हेडर के अंदर वास्तविक आईपी और एसएसएल स्थिति सहित पोर्ट 80 पर HAproxy के सभी अनुरोधों को पास किया। मेरी usr/local/etc/nginx/nginx.confतरह दिखता है:

    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. मैंने तब पता लगाने के लिए अपने PHP एप्लिकेशन को संशोधित किया X-Forwarded-Proto HTTP हैडर :

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

तो अंतिम सेटअप है:

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

2
आपको SSLv2 को अक्षम करना चाहिए जब तक कि आपको वास्तव में इसकी आवश्यकता न हो। gnu.org/software/gnutls/manual/html_node/… मुझे नहीं पता कि Nginx अभी भी अपने डिफ़ॉल्ट कॉन्फ़िगरेशन में इसका समर्थन क्यों करता है।
ओचोटो

यह भी महसूस करें कि 1024 कार्यकर्ता कनेक्शन के साथ आप अधिकांश 512 समवर्ती ग्राहकों का समर्थन करेंगे।
ओचोटो

@Ochoto: उन दोनों युक्तियों के लिए धन्यवाद! मैं HAproxy में नया हूँ, लेकिन nignx से कम परिचित हूँ ...
जोश

7

मेरा विन्यास 1.5-dev-17 संस्करण के लिए haproxy:

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 का उपयोग करता है । कृपया ध्यान दें कि option http-server-closeभाग बहुत महत्वपूर्ण है।


धन्यवाद! मैं HAProxy v1.4 चला रहा हूं इसलिए मुझे नहीं लगता कि मैं ऐसा कर सकता हूं, लेकिन यह दूसरों की मदद कर सकता है।
जोश

हां, और 1.5 जल्द ही बाहर हो जाना चाहिए।
greg0ire

5

कच्चे टीसीपी मोड का उपयोग किए बिना HAProxy एक एसएसएल बैकएंड को नहीं मार सकता है, खो सकता है X-Forwarded-For कर सकता है, लेकिन, आप बैकएंड ट्रांजिट के लिए एक सुन स्टनलाइन के साथ ट्रैफ़िक को संभावित रूप से पुनः एन्क्रिप्ट कर सकते हैं। बदसूरत, हालांकि।

मुझे ओचोटो का दृष्टिकोण पसंद है, एक चेतावनी के साथ: निग्नेक्स एक पूरी तरह से सक्षम लोड बैलेंसर है; यदि आप इसका उपयोग कर रहे हैं, तो मैं कहूंगा कि इसका उपयोग हर चीज के लिए किया जाएगा। संतुलित HTTPS बैकेंड को लोड करने के लिए अपने आने वाले HTTPS को प्रॉक्सी करें - और इस तरह, SSL जानकारी के लिए कस्टम हेडर की कोई आवश्यकता नहीं है (जब तक कि आपको क्लाइंट प्रमाणपत्र की आवश्यकता न हो)।


मुझे यकीन नहीं है कि मैं HAproxy पर क्यों चिपकी हूं। मुझे लगता है कि यह इसलिए है क्योंकि pfSense के पास इसके लिए एक पैकेज है, और SOIS इसका उपयोग करता है। न ही एक महान कारण है। :-)
जोश

मैं एक सक्षम लोड बैलेंसर के निगनेक्स से डिग्रेस करता हूं, जब तक कि आप गैर मानक मॉड्यूल अपस्ट्रीम_फेयर का उपयोग नहीं करते हैं, यह एक साधारण राउंड रॉबिन (या क्लाइंट आईपी हैश) को ध्यान में रखे बिना होता है यदि गंतव्य बैकएंड पहले से ही अनुरोधों के साथ व्यस्त है और इस तरह उस बैकएंड में बढ़ती कतार। अन्य बैकएंड मुफ्त हैं और नौकरी की प्रतीक्षा कर रहे हैं। HAProxy भी अच्छी तरह से बैकएंड की निगरानी करता है और उनके बारे में आंकड़े प्रदर्शित करता है।
ओचोटो

यदि निम्न में से केवल एक ही सत्य हो जाता है तो) नग्नेक्स को सभ्य राज्य पर नज़र रखने और उचित लोड संतुलन बी) HAProxy को सभ्य एसएसएल समर्थन मिलता है, एक ही उम्मीद कर सकता है
यवेर शाहपसोव

मैंने सिर्फ nginx -> haproxy -> nginx -> SSL के लिए बैकएंड का उपयोग करके एक सेटअप तैनात किया है, यह यहाँ चर्चा की गई haproxy में HTTPS समर्थन की कमी के कारण है, लेकिन यह भी क्योंकि nginx http: //www.Chp का समर्थन नहीं करता है।
जेफ्री

2

मैंने पिछले साल HAProxy को pfSense के साथ एकीकृत करने के लिए एक समाधान लागू किया था कि यह HAProxy की सभी विशेषताओं का उपयोग करता है और pfSense के साथ एक अच्छा अलगाव बनाए रखता है। ताकि यह उत्पादन वातावरण के लिए एक व्यवहार्य विकल्प हो । SSL को HAProxy पर समाप्त किया गया है । मैंने Ejjail और Ports Collection का उपयोग करते हुए pfSense में एक जेल के अंदर HAProxy स्थापित किया है । इस तरह दोनों घटकों को स्वतंत्र रूप से बनाए रखना बहुत आसान है। और आप जो भी संस्करण चाहें स्थापित कर सकते हैं। मैंने 1.5-dev13 से शुरुआत की। और तब से यह मेरे लिए पूरी तरह से काम कर रहा है। मैंने यहां पूरी बात का दस्तावेजीकरण किया है।

PfSense पर HAProxy स्थापित करना

BTW विली, इस तरह के एक उत्कृष्ट उत्पाद के लिए बहुत बहुत धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.