पोर्ट फ़ॉरवर्डिंग के बिना ESP8266 नियंत्रण: MQTT का बाहर जाता मार्ग
इंटरनेट से पहुँचने योग्य ब्रोकर घर के उपकरण को उसी द्वारा खोले गए कनेक्शन पर नियंत्रित करने देता है। यह TLS मेमोरी, विषयों और पुनरावृत्ति के लिए क्या बदलता है।
उपकरण घर के राउटर के पीछे है, न कोई पोर्ट फ़ॉरवर्डिंग है और न कोई सार्वजनिक पता, फिर भी उसे कुछ सेकंड में कॉन्फ़िगरेशन मिलना चाहिए। तरकीब फ़ायरवॉल में कोई छेद नहीं है। यह एक कनेक्शन है जिसे उपकरण बाहर की ओर ऐसे ब्रोकर तक खोलता है जहाँ वह पहुँच सकता है, और वह ब्रोकर फिर उसी स्थापित मार्ग से संदेश वापस भेजता है। इस डिज़ाइन में लोगों को पसंद आने वाला हर गुण और इसमें मौजूद हर जाल इसी उलटफेर से आता है।
NAT से वास्तव में क्या गुज़रता है
जब उपकरण ब्रोकर से TCP कनेक्शन खोलता है, घर का राउटर एक मैपिंग बनाता है और प्रवाह के जीवनकाल तक उसे जीवित रखता है। उस प्रवाह पर आए उत्तर उपकरण तक लौटते हैं क्योंकि मैपिंग पहले से मौजूद है। ब्रोकर कभी घर की ओर कुछ शुरू नहीं करता, इसलिए राउटर के अस्वीकार करने के लिए कोई बिना माँगा आने वाला पैकेट नहीं है। पूरा नेटवर्किंग तर्क यही है, और इसीलिए यह दृष्टिकोण उन नेटवर्क पर काम करता है जिन्हें आप नियंत्रित नहीं करते।
उपकरण को कनेक्शन जीवित रखना होगा या उसे फिर से स्थापित करना होगा, और वास्तुकला तय होने के बाद यही विश्वसनीयता का प्रश्न बन जाता है।
ब्रोकर विषयों को रूट करता है, HTTP को प्रॉक्सी नहीं करता
MQTT प्रकाशन और सदस्यता के आदान-प्रदान को परिभाषित करता है: उपकरण ऐसे विषय फ़िल्टर की सदस्यता लेता है जिसे पढ़ने की उसे अनुमति है, और एक अधिकृत नियंत्रक मेल खाते विषय पर प्रकाशित करता है। ब्रोकर प्रकाशनों को सदस्यताओं से मिलाता है और प्रतियाँ पहुँचाता है। वह नहीं जानता कि ब्राउज़र अनुरोध क्या है, और वह उपकरण के वेब सर्वर पर HTTP GET नहीं भेजेगा। यदि मौजूदा फ़र्मवेयर केवल HTTP बोलता है, तो ब्रोकर डिज़ाइन को एप्लिकेशन बदलाव या जानबूझकर बनाया गया अनुवाद घटक चाहिए।
विषयों के नाम भी अधिकृति नहीं हैं। अधिकांश ब्रोकर प्रति-क्लाइंट पहुँच नियंत्रण सूचियों का समर्थन करते हैं, और उपकरणों को एक वैश्विक नाम स्थान साझा करने के बजाय अपने ही प्रकाशन और सदस्यता वृक्षों तक सीमित रखना चाहिए।
उपकरण के संसाधन TLS का स्वरूप तय करते हैं
ESP8266 में सीमित RAM है, और TLS हैंडशेक उसका सबसे महँगा काम है। Arduino कोर ठीक इसी सीमा के लिए BearSSL देता है, और CA सत्यापित करने तथा फ़िंगरप्रिंट पिन करने के बीच का चुनाव मेमोरी पदचिह्न और यह दोनों बदल देता है कि किसी अन्य नाम के लिए वैध प्रमाणपत्र रखने वाला हमलावर क्या कर सकता है। जब हीप अनुमति दे तो ब्रोकर का CA सत्यापित करना अधिक मज़बूत विकल्प है। पेलोड का आकार भी मायने रखता है: MQTT क्लाइंट एक बफ़र रखता है, और उससे बड़े संदेश चुपचाप काट दिए जाते हैं जब तक बफ़र जानबूझकर न बढ़ाया जाए।
कीपअलाइव और सॉकेट समय-सीमाएँ उसी बजट का हिस्सा हैं, क्योंकि जो क्लाइंट मृत कनेक्शन को कभी नहीं पहचानता वह त्रुटि बताए बिना आदेश प्राप्त करना बंद कर देता है।
वह संदेश-अर्थ जो काटता है
रखा गया संदेश ब्रोकर द्वारा संग्रहीत होता है और बाद के मेल खाते सदस्यों को दिया जाता है, जो वर्तमान स्थिति के लिए उत्कृष्ट है और एक-बार के आदेशों के लिए खतरनाक है: फिर से जुड़ने वाला उपकरण कल का आदेश नया मानकर प्राप्त कर सकता है। QoS 1 कम से कम एक बार डिलीवरी की गारंटी देता है, इसलिए प्रतियाँ सामान्य हैं और एप्लिकेशन को पुनरावृत्ति-सुरक्षित होना चाहिए, आदर्श रूप से ऐसे पहचानकर्ता या समय-चिह्न के साथ जिसे वह अस्वीकार कर सके। अंतिम इच्छा उपकरण के गिरने पर आपको स्थिति संकेत देती है, लेकिन तभी जब कनेक्शन वास्तव में विफल हो, लटका न रहे।
स्वच्छ सत्र का व्यवहार तय करता है कि ब्रोकर आपकी अनुपस्थिति में आपकी सदस्यताएँ रखता है या नहीं, और इसमें गलती करना ही कारण है कि कुछ उपकरण हर पुनःकनेक्शन के बाद पहला संदेश चूक जाते हैं।
TLS ब्रोकर तक के हिस्से की रक्षा करता है। यह ब्रोकर संचालक के विरुद्ध पेलोड का एंड-टू-एंड एन्क्रिप्शन नहीं है, जो आपके द्वारा उसके माध्यम से प्रकाशित सब कुछ पढ़ सकता है।
जीवनचक्र सीमित करें और इसे हानिरहित डेटा से परखें
कसकर दोहराए जाने वाले लूप के बजाय बैकऑफ़ के साथ पुनःकनेक्शन की योजना बनाएँ, यदि सत्र स्थायी नहीं है तो स्पष्ट रूप से फिर से सदस्यता लें, और कनेक्शन का परिणाम लॉग करें ताकि चुपचाप ऑफ़लाइन उपकरण सबूत छोड़े। पुनःकनेक्शन पथ को ऐसे नमूना पेलोड से जाँचें जो कुछ नहीं करते, क्योंकि आदेश चैनल का पहला उत्पादन परीक्षण असली आदेश नहीं होना चाहिए। फिर पुष्टि करें कि पुराना रखा गया संदेश पुनःकनेक्शन पर क्या करता है, और तय करें कि वह व्यवहार हर विषय के लिए स्वीकार्य है या नहीं।
इस तरह करने पर डिज़ाइन एक आवक नेटवर्क आवश्यकता हटा देता है और उपकरण सॉफ़्टवेयर, ब्रोकर नीति तथा संदेश-अर्थ को छिपी धारणाओं के बजाय दृश्य काम के रूप में छोड़ देता है।