haproxy + stunnel + की-जीवित?


10

मैं HTTPS ट्रैफिक को संभालने के लिए haproxy 1.4 के सामने स्टनलाइन रखना चाहता हूं। एक्स-फॉरवर्ड-फॉर हेडर को जोड़ने के लिए भी मुझे स्टनलाइन की आवश्यकता है । यह haproxy वेबसाइट से "stunnel-4.xx-xforwarded-for.diff" पैच द्वारा प्राप्त किया जा सकता है ।

हालांकि, विवरण का उल्लेख है:

ध्यान रखें कि यह पैच जिंदा रहते हुए काम नहीं करता है, ...

मेरा प्रश्न है: मेरे लिए व्यवहार में इसका क्या अर्थ होगा? मैं अनिश्चित हूँ,

  1. यदि यह बीच में रखने के बारे में है
    • ग्राहक और stunnel
    • stunnel और haproxy
    • या haproxy और backend सर्वर?
  2. प्रदर्शन के लिए इसका क्या मतलब है: अगर मेरे पास वेब पेज पर 100 आइकन हैं, तो क्या ब्राउज़र को 100 पूर्ण एसएसएल कनेक्शनों के लिए बातचीत करनी होगी, या क्या यह एसएसएल कनेक्शन का फिर से उपयोग कर सकता है, बस नए टीसीपी कनेक्शन बना सकता है?

जवाबों:


12

यह HTTP कीप-सजीव के बारे में है, जो एकल टीसीपी सत्र (और, एसएसएल, एक एसएसएल सत्र के साथ) के माध्यम से कई संसाधन अनुरोधों के लिए अनुमति देता है। यह एसएसएल साइट के प्रदर्शन के लिए बहुत महत्व रखता है, क्योंकि बिना जीवित रखे, प्रत्येक अनुरोधित संसाधन के लिए एक एसएसएल हैंडशेक की आवश्यकता होगी।

तो, यहाँ चिंता क्लाइंट से बैकएंड सर्वर के लिए सभी तरह से एक बड़ा रख-रखाव सत्र है। यह प्रदर्शन के लिए एक महत्वपूर्ण बात है, और आधुनिक HTTP सर्वरों के लिए पाठ्यक्रम के रूप में लिया गया है, लेकिन यह पैच कहता है कि यह इसका समर्थन नहीं करता है। आइए देखें क्यों ..


एक जीवित सत्र केवल एक के बाद एक और अनुरोध हैं - एक बार जब सर्वर एक अनुरोध पर अपनी प्रतिक्रिया समाप्त करता है, तो सर्वर ने FINटीसीपी सत्र को समाप्त करने के लिए एक पैकेट नहीं भेजा है ; क्लाइंट केवल हेडर का एक और बैच भेज सकता है।

यह समझने के लिए कि यह पैच क्या कर रहा है, यहाँ एक जीवंत बातचीत का एक उदाहरण है:

ग्राहक:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...

सर्वर:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>

यहां एक गैर-जीवित-जीवित कनेक्शन बंद हो जाएगा। लेकिन, रखने के लिए जिंदा ग्राहक एक और आग बंद करने की अनुमति देता है:

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...

प्रॉक्सी में क्लाइंट आईडी के लिए, X-Forwarded-Forप्रत्येक क्लाइंट रिक्वेस्ट में हेडर में कुछ रिवर्स प्रॉक्सी जोड़ सकते हैं । यह अपस्ट्रीम सर्वर को बताता है कि लॉगिंग और अन्य एप्लिकेशन जरूरतों में पवित्रता के लिए अनुरोध कहां से आ रहा है (रिवर्स प्रॉक्सी के आईपी से शुरू होने वाले प्रत्येक अनुरोध के बजाय)।

X-Forwarded-Forहैडर प्रत्येक और, रखें जिंदा कनेक्शन के माध्यम से भेजा के रूप में पूर्ण हेडर हर बार भेजा जाता है हर ग्राहक संसाधन अनुरोध में इंजेक्ट किया जाना चाहिए; X-Forwarded-Forहेडर और अनुवाद को "वास्तविक" अनुरोध के रूप में संभालना आईपी ​​एक प्रति-अनुरोध पर किया जाता है, प्रति टीसीपी-कीप-लाइव-सेशन के आधार पर नहीं। और हे, शायद वहाँ कुछ भयानक रिवर्स प्रॉक्सी सॉफ्टवेयर है जो कई क्लाइंट से सेवा अनुरोधों के लिए एक एकल रखने-जीवित सत्र का उपयोग करता है।

यह वह जगह है जहाँ यह पैच विफल रहता है।


उस साइट का पैच स्ट्रीम में HTTP हेडर के पहले सेट के अंत में TCP सत्र के बफर को देखता है, और हेडर के उस पहले सेट के अंत के बाद नए हेडर को स्ट्रीम में इंजेक्ट करता है। ऐसा किए जाने के बाद, यह X-Forwarded-Forकाम पर विचार करता है, और हेडर के नए सेट की समाप्ति के लिए स्कैन करना बंद कर देता है। इस पद्धति में भविष्य के सभी शीर्षकों के बारे में कोई जागरूकता नहीं है जो बाद के अनुरोधों के माध्यम से आ रही है।

वास्तव में उन्हें दोष नहीं दे सकते; वास्तव में अपने स्ट्रीम की सामग्री का संचालन और अनुवाद करने के लिए स्टनलाइन का निर्माण नहीं किया गया था।

आपके सिस्टम पर इसका जो प्रभाव पड़ेगा वह यह है कि पहले से रखे गए स्ट्रीम के पहले अनुरोध को X-Forwarded-Forहेडर को ठीक से इंजेक्ट किया जाएगा , और बाद के सभी अनुरोध ठीक काम करेंगे - लेकिन उनके पास हेडर नहीं होगा।

जब तक कि एक और हेडर इंजेक्शन पैच नहीं है जो प्रति कनेक्शन कई ग्राहक अनुरोधों को संभाल सकता है (या स्टैक ओवरफ्लो पर हमारे दोस्तों की मदद से इसे प्राप्त किया जा सकता है), आपको अपने एसएसएल समाप्ति के लिए अन्य विकल्पों को देखने की आवश्यकता हो सकती है।


1
बहुत बढ़िया जवाब, धन्यवाद। मुझे याद दिलाता है, यहाँ सवाल पूछना एक अच्छा विचार क्यों है।
क्रिस लेचर

1
स्टनलाइन में हेडर-जीवित हेडर इंजेक्शन रखने की अनुमति देने के लिए, लगभग सभी HTTP बोलने में सक्षम होने की आवश्यकता होगी जो काम की एक बड़ी राशि होगी। उस ने कहा, आप HAproxy के PROXY प्रोटोकॉल का उपयोग कर सकते हैं (जिसे stunnel या वैकल्पिक रूप से स्टड के लिए पैच की आवश्यकता होती है ) HAproxy में हेडर को इंजेक्ट करें। अधिक जानकारी के लिए डॉक्स देखें (Google कैश से, जैसा कि HAproxy साइट आंशिक रूप से ATM से कम लगती है)
Holger Just

5

STunnel 4.45 HAProxy 1.15 के साथ आने वाली कुछ नई क्षमताओं (प्रॉक्सी प्रोटोकॉल) का उपयोग करके इसे ठीक करता है

यह पिछले पैच और कीप अलाइव के साथ मुद्दों को भी ठीक करता है


3

जैसा कि मैंने एक और सूत्र में पोस्ट किया है, वैसा ही 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
    reqadd X-Forwarded-Proto:\ https if { is_ssl }
    server srv1 1.1.1.1:80 check ...
    ...

यह पैचिंग स्टनलाइन की तुलना में बहुत आसान है और रखने वाले को जीवित रखने की तुलना में बहुत बेहतर है।


आप is_ssl के बजाय ssl_fc का उपयोग करना चाह सकते हैं
josch

2

शेन से उत्कृष्ट उत्तर का विस्तार करते हुए, आप HAproxy के सामने Nginx को SSL टर्मिनेटर के रूप में उपयोग कर सकते हैं। यह क्लाइंट और नग्नेक्स के बीच सही ढंग से रखे हुए को संभालता है जो कि सबसे अधिक विलंबता संवेदनशील पक्ष है और प्रत्येक क्लाइंट के अनुरोध के लिए एक्स-फॉरवर्ड-फॉर को हर एक में भेजने के लिए एक नया कनेक्शन बनाता है।


1
हालांकि, अगर आपको वेबसोकेट्स की जरूरत है तो निग्नेक्स काम नहीं करेगा।
w00t

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