आपका टनल उठता है और क्लाइंट जुड़ता है, लेकिन स्थिर पता और उस एक उपयोगकर्ता के लिए आपने जो पुश किए गए रूट परिभाषित किए थे, वे गायब हैं। लॉग में “file not found” नहीं लिखा है, और यही लोगों को प्रमाणपत्र फिर से बनाने भेजता है। इनमें से अधिकतर मामलों में डेमॉन उस शेल से अलग निर्देशिका से चलता है जिसमें आपने परीक्षण किया था, और client-config-dir कभी वैसे हल नहीं हुआ जैसा आपने माना था। सुधार पथ का सुधार है, क्रेडेंशियल रीसेट नहीं।

कॉन्फ़िगरेशन छूने से पहले यूनिट पढ़ें

उस प्रक्रिया से शुरू करें जो वास्तव में चलती है, उस फ़ाइल से नहीं जिसे आपने संपादित किया। systemd से निष्पादन पंक्ति, कार्यशील निर्देशिका और वह खाता पूछें जिसमें यह उतरता है। वे तीन उत्तर इस वर्ग की अधिकतर विफलताएँ समझा देते हैं:

systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectory

खाली WorkingDirectory का अर्थ है कि यूनिट / में शुरू होती है, इसलिए सापेक्ष client-config-dir ccd /ccd में खोजा जाता है। वह निर्देशिका लगभग कभी नहीं होती, और डेमॉन उसके अभाव को घातक नहीं मानता।

इसकी तुलना परीक्षण के दौरान उपयोग किए गए इंटरैक्टिव लॉन्च से करें, जहाँ आपके शेल की वर्तमान निर्देशिका संभवतः कॉन्फ़िगरेशन निर्देशिका थी। वही फ़ाइल, वही कीवर्ड, दो अलग परिणाम।

सापेक्ष पथ किसके सापेक्ष हल होता है

कीवर्ड उस क्षण प्रक्रिया की कार्यशील निर्देशिका के सापेक्ष हल होता है जब विकल्प का उपयोग होता है। इसका अर्थ “उस कॉन्फ़िग फ़ाइल के बगल में जो मैंने --config के साथ पास की” नहीं है। OpenVPN पूर्ण पथ से कॉन्फ़िगरेशन खुशी से पढ़ेगा और फिर भी सापेक्ष मान कहीं और हल करेगा, और यही यहाँ जाल है। OpenVPN 2.6 मैनुअल नियम को --client-config-dir के अंतर्गत और फिर --cd के अंतर्गत बताता है।

cd कीवर्ड अन्य फ़ाइलें पढ़े जाने से पहले उस संदर्भ को बदल देता है, इसलिए जो यूनिट cd /etc/openvpn/server सेट करती है और फिर client-config-dir ccd, वह /etc/openvpn/server/ccd में हल होती है। यदि आप cd जोड़ते हैं, तो निर्देशों का क्रम जाँचें और याद रखें कि यह उसी फ़ाइल के हर अन्य सापेक्ष संदर्भ को प्रभावित करता है।

डेमॉन के खाते के रूप में पथ पर चलें

पथ सही हो सकता है और फिर भी अपठनीय हो। विशेषाधिकार गिरने के बाद डेमॉन अब root नहीं है, इसलिए हर मूल निर्देशिका को उस खाते के लिए खोज अनुमति चाहिए, और क्लाइंट फ़ाइल को स्वयं पढ़ने की अनुमति चाहिए। किसी मूल पर एक निष्पादन बिट की कमी फ़ाइल छिपाने के लिए पर्याप्त है, और त्रुटि केवल ऐसे क्लाइंट के रूप में दिखती है जिसे चुपचाप डिफ़ॉल्ट पूल मिल जाता है।

namei प्रत्येक घटक की अनुमति क्रम में छापता है, जो निर्देशिकाओं को एक-एक करके जाँचने से तेज़ है:

namei -l /etc/openvpn/server/ccd/client1

फिर पढ़ना स्वयं के बजाय सेवा खाते के रूप में जाँचें:

runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readable

यदि यूनिट chroot का उपयोग करती है, तो निर्देशिका जेल के भीतर मौजूद होनी चाहिए, और कॉन्फ़िगरेशन का पथ chroot लागू होने के बाद व्याख्यायित होता है। जेल के बाहर होस्ट पर मौजूद फ़ाइल भीतर से अदृश्य है।

अनुमान के बजाय खोज की पुष्टि करें

एक रीस्टार्ट के लिए लॉग स्तर बढ़ाएँ और पढ़ें कि सर्वर क्लाइंट-विशिष्ट विकल्पों के बारे में क्या कहता है। verb 4 पर डेमॉन आयातित प्रति-क्लाइंट कॉन्फ़िगरेशन बताता है, इसलिए अनुपस्थित पंक्ति सीधा प्रमाण है कि उस कनेक्शन के लिए कोई फ़ाइल नहीं पढ़ी गई।

openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccd

इसे किसी अतिरिक्त पोर्ट पर फोरग्राउंड में चलाएँ और एक क्लाइंट जोड़ें। यह systemd को तस्वीर से पूरी तरह हटा देता है: यदि ओवरराइड यहाँ दिखते हैं और सेवा के अंतर्गत नहीं, तो अंतर यूनिट के संदर्भ में है, फ़ाइल में नहीं।

तय करें कि जब कोई फ़ाइल मेल न खाए तो क्या होना चाहिए। ccd-exclusive के बिना क्लाइंट केवल वैश्विक पूल सेटिंग्स के साथ स्वीकार किया जाता है, और यही ऊपर वर्णित मौन विफलता है। इसके साथ अनुपस्थित फ़ाइल अस्वीकृत कनेक्शन बन जाती है, और वह अस्वीकृति देखना आसान है पर भार के नीचे डिबग करना कठिन।

सुधारें, रीस्टार्ट करें, सत्यापित करें

कॉन्फ़िगरेशन में निर्देशिका को पूर्ण बनाएँ और उसे ऐसा ही रखें। सापेक्ष पथ तभी सुरक्षित हैं जब यूनिट कार्यशील निर्देशिका को पिन करे, और पिन करना एक अतिरिक्त चलता हुआ हिस्सा है जिसे कोई बाद में हटा देगा।

client-config-dir /etc/openvpn/server/ccd
ccd-exclusive

इंस्टेंस को रीस्टार्ट करें, एक ज्ञात क्लाइंट फिर से जोड़ें और उसे मिला पता उसकी ओर पुश किए गए रूट के साथ पढ़ें। यदि पता उस क्लाइंट की फ़ाइल में ifconfig-push पंक्ति से मेल खाता है, तो खोज काम कर गई। यदि क्लाइंट अभी भी सामान्य पूल में गिरता है, तो लॉग पंक्तियों की गिनती पर लौटें: शून्य आयात का अर्थ है पथ या पहचान गलत है, गलत सामग्री वाला एक आयात का अर्थ है कि आप उससे अलग फ़ाइल संपादित कर रहे हैं जिसे डेमॉन पढ़ता है।

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

संबंधित लेख