मान लीजिए कि आपके पास एक ऐसी सेवा है जो आने वाले कनेक्शनों को स्वीकार करती है और लोड और / या गलती को सहन करने में संतुलन का कार्य उत्पन्न होता है।
सामान्य तौर पर, योजना इस तरह दिखती है:
----> ---> ()
विशिष्ट आवश्यकताओं के लिए कई तैयार किए गए बैलेंसर हैं। उदाहरण के लिए, nginx वेब एप्लिकेशन के लिए एक बेहतरीन बैलेंसर है, टीसीपी कनेक्शन के लिए
हाइप्रोक्सी ।
- आप आसान तरीकों की तलाश नहीं कर रहे हैं
- आप ऊब गए हैं और कुछ नया चाहते हैं
- केवल iptables, केवल कट्टर
वास्तव में, यह सब विशिष्ट स्थिति पर निर्भर करता है, इसलिए मुझे सिर्फ एक नुस्खा लिखना चाहिए और जिस तरह से आप अपने लिए तय करते हैं कि यह कहां काम आ सकता है।
विधि
संतुलन के लिए, हम आंकड़े, स्थिति और लेबलिंग मॉड्यूल का उपयोग करेंगे।
ये सभी मॉड्यूल डिफ़ॉल्ट रूप से नहीं हैं। Linux के पुराने संस्करणों में, आंकड़े के बजाय, nth की तलाश करें, और स्थिति
को परियोजना स्थल से हाथ से सेट करना पड़ सकता है
अब मान लें कि आपकी सेवा एक smtp सर्वर है।
बता दें कि बाहरी आईपी एड्रेस 10.0.0.1 है
सेवाओं के आंतरिक आईपी पते 192.168.0.1 और 192.168.0.2 होंगे
मैनगल तालिका में निम्नलिखित नियम बनाएं।
* मँगनी
: मेलमार्क - [0: 0]
-ए मल्लमर्क -j CONNMARK - छंटनी-चिह्न
-अभी MAILMARK -m निशान - 0x0 -m सांख्यिकीय --mode nth - हर 2 मी स्थिति! --condition mail1up -j MARK --set-mark १
-एक MAILMARK -m निशान - 0x0 -m कंडीशन! --condition mail2up -j MARK --सेट-मार्क 2
-एक MAILMARK -m निशान - 0x0 -m कंडीशन! --condition mail1up -j MARK --set-mark १
-मल्लमर्क -j CONNMARK -save-mark
-प्रमाणन -d 10.0.0.1 -p tcp --dport 25 -j MAILMARK
COMMIT
और नेट तालिका में निम्नलिखित हैं:
-प्रमाणन -d 10.0.0.1 -p tcp --dport 25 -i बंध0.204 -m चिह्न - चिह्न 1 -j DNAT - तक-गंतव्य 192.168.0.1
-प्रमाणन -d 10.0.0.1 -p tcp --dport 25 -i बंधन0.204 -m चिह्न - चिह्न 2 -j DNAT - तक-गंतव्य 192.168.0.2
बस, अब यह समझाना बाकी है कि यह कैसे काम करता है।
सबसे पहले, पोर्ट 25 पर बाहरी पते 10.0.0.1 पर आने वाले किसी भी पैकेट को मैनिंग टेबल और लेबलिंग नियम के माध्यम से जाना जाता है
-प्रमाणन -d 10.0.0.1 -p tcp --dport 25 -j MAILMARK
अंकन के लिए, एक अलग MAILMARK श्रृंखला बनाई गई है, जो निम्नानुसार काम करती है।
यदि कनेक्शन पहले ही चिह्नित किया गया है, तो कनेक्शन के समान मूल्य के साथ पैकेज को चिह्नित करें।
-ए मल्लमर्क -j CONNMARK - छंटनी-चिह्न
इस प्रकार, एक कनेक्शन के पैकेट बाद में एक सेवा बैकएंड पर समाप्त हो जाएंगे।
यदि पैकेज चिह्नित नहीं है, तो इसे निम्नलिखित नियम से चिह्नित करें।
-अभी MAILMARK -m निशान - 0x0 -m सांख्यिकीय --mode nth - हर 2 मी स्थिति! --condition mail1up -j MARK --set-mark १
-एम मार्क - मार्क 0x0
यह शर्त कि पैकेज अभी तक चिह्नित नहीं है
-एम सांख्यिकीय - एमओडीटी एनटी - 2
हर दूसरे पैकेट को चिह्नित करें। यानी हम भार को बहुत सरलता से 50/50 तक संतुलित करते हैं, लेकिन यह एकमात्र संभावना नहीं है (यादृच्छिक और आँकड़ा देखें)
-मेरी हालत! --condition mail1up
शर्त यह है कि बैकेंड जीवित है
-ज मार्क --set-mark १
पैकेज को 1 के मान से चिह्नित करें
यदि पैकेट अचिह्नित रहता है, तो उसे लेबल 2 के साथ चिह्नित करें, बशर्ते कि बैकेंड लाइव हो
-एक MAILMARK -m निशान - 0x0 -m कंडीशन! --condition mail2up -j MARK --सेट-मार्क 2
यदि पैकेट अभी भी अचिह्नित है, तो जाहिर तौर पर दूसरा बैकेंड मृत है, और पहला लेबल सेट नहीं किया गया था, क्योंकि हम 50/50 के साथ भाग्य से बाहर थे, या पहले बैकेंड की भी मृत्यु हो गई। यदि पहला बैकेंड अभी भी जीवित है, तो हम लेबल 1 के साथ पैकेज को चिह्नित करते हैं
-एक MAILMARK -m निशान - 0x0 -m कंडीशन! --condition mail1up -j MARK --set-mark १
वर्तमान कनेक्शन के लिए याद रखने वाला आखिरी नियम लेबल है
-मल्लमर्क -j CONNMARK -save-mark
पैकेज चिह्नित होने के बाद, इसे उन नियमों के अनुसार चयनित बैकएंड में अनुवादित किया जाएगा, जिन्हें एनएटी तालिका में जोड़ा गया था
यह एक और बिंदु से संबंधित है कि iptables कैसे समझेगा कि बैकेंड जीवित है।
कोई रास्ता नहीं है, आप इसे स्वयं करें और फ़ाइलों में रखें / proc / net / nf_condition / mail1up और / proc / net / nf_condition / mail2up 0 या 1, यह इस बात पर निर्भर करता है कि बैकेंड जीवित है या मृत।
डिफ़ॉल्ट रूप से, iptables शुरू करते समय, ये फाइलें 0 हो जाएंगी।
जो नियम दिए गए हैं उनका मतलब है कि 0 का अर्थ है कि बैकेंड जीवित है।
उदाहरण के लिए, smtp सर्वर की जांच करने के लिए, मैं निम्नलिखित बैश स्क्रिप्ट का उपयोग करता हूं
निष्कर्ष
एक तरफ, शायद ऐसा करने का कोई अच्छा कारण नहीं है, लेकिन दूसरी तरफ, आप उनके बारे में सोच सकते हैं।
- iptables कर्नेल स्तर पर चलता है और किसी भी अन्य बैलेंसर की तुलना में तेज़ होने की संभावना है
- iptables अधिक विश्वसनीय है। उदाहरण के लिए, यह एक तथ्य नहीं है कि जब बैलेंसरों के बीच फेलओवर होता है, तो वही हैप्रॉक्सी सफलतापूर्वक शुरू होगा, क्योंकि उसे शुरू करने के लिए और अधिक स्थितियों की आवश्यकता है। उदाहरण के लिए, आईपी पते 10.0.0.1 को इंटरसेप्ट किया जाना चाहिए और उसके बाद ही पोर्ट 25 पर हैप्रोक्सी चलाना संभव होगा। उदाहरण के लिए, इस दौरान किसी ने उसकी कॉन्फ़िगरेशन फ़ाइल को बर्बाद कर दिया और यह बिल्कुल भी शुरू नहीं हुआ।