OpenVPN PHP हुक: trusted_ip विरुद्ध ifconfig_pool_remote_ip
दोन वेगळे अर्थ असलेले दोन पत्ते, तुम्ही सुरू न केलेल्या प्रक्रियेने वाचलेले. हुक व्हेरिएबल्स काय आहेत आणि रिकामा $_ENV काहीच का सिद्ध करत नाही.
हुक स्क्रिप्टमधील रिकामा $_ENV ॲरे म्हणजे OpenVPN ने काहीच दिले नाही याचा पुरावा वाटतो. सामान्यतः तो पूर्णपणे वेगळी गोष्ट सिद्ध करतो: ती सुपरग्लोबल भरू नये अशी PHP ची संरचना केलेली होती, आणि मूल्ये संपूर्ण वेळ प्रक्रियेच्या पर्यावरणात होती. दुसरा चुकीचा निष्कर्ष अधिक सूक्ष्म आहे, कारण कनेक्शन हुकमधील दोन पत्ता व्हेरिएबल्स वेगळ्या गोष्टी दर्शवतात आणि परस्पर बदलून वापरली जातात. चुकीच्यापासून सुरुवात केल्यास दोन्ही चुका दुपारचा वेळ घेतात.
दोन पत्ते, दोन वेगळे दावे
बाह्य टोक म्हणजे क्लायंट जोडला गेला तेव्हा सर्व्हरने पाहिलेले, IPv4 साठी trusted_ip आणि IPv6 साठी trusted_ip6 म्हणून उपलब्ध. आभासी पत्ता म्हणजे या सत्रासाठी पूलने दिलेला, ifconfig_pool_remote_ip म्हणून उपलब्ध.
ते वेगळ्या प्रश्नांची उत्तरे देतात, आणि नोंदीला सामान्यतः दोन्ही नाही तर त्यापैकी एक आवश्यक असते. पहिला सांगतो की कनेक्शन कुठून आले, जो शेकडो लोक वापरत असलेला सामायिक NAT पत्ता असू शकतो. दुसरा सांगतो की हे सत्र बोगद्यात कुठे आहे, आणि तो नंतर दुसऱ्या सत्रास दिला जाऊ शकतो. दोन्ही गोंधळल्यास विश्वासार्ह वाटणाऱ्या पण चुकीच्या नोंदी तयार होतात.
किमान वाचन असे दिसते.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;कोणतेही मूल्य व्यक्ती ओळखत नाही. एक नेटवर्क निरीक्षण आहे, दुसरा भाडेपट्टा आहे, आणि यापैकी कोणत्याही मूल्याला स्थिर उपकरण ओळखणी म्हणून घेणारी नोंद, क्लायंट वेगळ्या नेटवर्कवरून पुन्हा जोडला जाईल किंवा वेगळा पूल पत्ता मिळेल त्या पहिल्या वेळी चुकीची ठरेल. नोंदीने उत्तर देऊ पाहिजे त्या प्रश्नानुसार फील्ड निवडा, मग तो प्रश्न स्तंभाच्या शेजारी लिहा.
PHP कसे सुरू झाले ते तपासा, तुमचा शेल नाही
हुक VPN डेमनचे मूल म्हणून, डेमनने तयार केलेल्या पर्यावरणात चालतो. तुमच्या परस्परसंवादी शेलचे पर्यावरण वेगळे असते, आणि स्क्रिप्ट हाताने चालवणे हुकच्या नव्हे तर शेलच्या पर्यावरणाची चाचणी करते.
आधी हुक तुम्ही अपेक्षित असलेल्या टप्प्यावर प्रत्यक्षात चालला याची खात्री करा. चुकीच्या टप्प्याला जोडलेली स्क्रिप्ट, किंवा डायरेक्टिव्ह दुसऱ्या मार्गाकडे निर्देश करत असल्याने कधीच न चाललेली स्क्रिप्ट, गहाळ व्हेरिएबलसारखीच लक्षणे निर्माण करते. स्क्रिप्टच्या वर जाणीवपूर्वक खूण ओळ जोडा आणि दुसरे काहीही तपासण्यापूर्वी ती दिसते याची खात्री करा. लॉगमधील वेळेची नोंद असलेली एकच ओळ "कधीच चालली नाही" आणि "मूल्याशिवाय चालली" यात फरक करते.
नंतर ते आवाहन कोणता इंटरप्रिटर आणि कोणती संरचना फाइल वापरते याची खात्री करा. वेब सर्व्हरसाठी PHP संरचना बदलल्याने OpenVPN ने सुरू केलेल्या CLI प्रक्रियेवर काहीच परिणाम होत नाही, आणि दोन्ही पूर्णपणे वेगळ्या php.ini फाइल्स लोड करू शकतात.
रिकामा $_ENV काहीच का सिद्ध करत नाही
PHP चा getenv संदर्भ प्रक्रियेच्या पर्यावरणाचे थेट वाचन वर्णन करतो, जे नाव नसल्यास false परत करते. $_ENV सुपरग्लोबल स्वतंत्रपणे भरला जातो, आणि variables_order डायरेक्टिव्ह कोणते सुपरग्लोबल भरले जातील हे ठरवते.
तो डायरेक्टिव्ह E वगळत असल्यास, पर्यावरणात काहीही असले तरी $_ENV रिकामा राहतो. त्याला अनुक्रमित करणारा कोड मग प्रत्यक्षात असलेले व्हेरिएबल गहाळ असल्याचे नोंदवतो, आणि उत्तर php.ini मध्ये असताना तपासणी OpenVPN कडे वळते. डायरेक्टिव्ह CLI संरचनेसाठीच तपासा, वेब सर्व्हरसाठी नाही.
getenv ने वाचन केल्यास हा सर्व गोंधळ टळतो, आणि इंटरप्रिटरला बोलावण्यापूर्वी पर्यावरण साफ करणारी आवरण स्क्रिप्ट तो वेगळ्या स्वरूपात पुन्हा आणते.
ओळ अद्ययावत नाही, संबंध साठवा
लिहिण्यापूर्वी नोंदीला कोणते मूल्य आवश्यक आहे ते ठरवा. सत्र कुठून आले हे नोंदवणे हे ध्येय असल्यास, बाह्य टोक साठवा आणि त्याला निरीक्षण म्हणून लेबल करा. कनेक्शनच्या कालावधीसाठी सत्राला बोगदा पत्त्याशी जोडणे हे ध्येय असल्यास, पूल पत्ता साठवा आणि तो सत्राशी जोडा.
एकच बोगदा पत्ता सामायिक करणाऱ्या प्रत्येक ओळीऐवजी प्रमाणित ओळख आणि चालू सत्रानुसार अद्ययावत करा, कारण पूल पत्ते पुन्हा वापरले जातात आणि उशिरा आलेली डिस्कनेक्ट घटना नवीन कनेक्शनची माहिती पुसू शकते. IPv6 स्पष्टपणे हाताळा, केवळ IPv4 मूल्य गुपचूप लिहू नका. NULL बाह्य पत्ता असलेली ओळ चुकीच्या पत्त्याच्या ओळीपेक्षा बरी आहे, कारण पहिली स्पष्टपणे अपूर्ण आहे.
पुन्हा जोडणी केल्यास जुनी नोंद संपादित न होता नवीन नोंद तयार व्हावी यासाठी लेखन OpenVPN पुरवतो त्या सत्र ओळखणीशी जोडा. पॅरामीटरयुक्त विधाने आणि क्रियेस आवश्यक त्या केवळ परवानग्या असलेले खाते वापरा. हुक डेमनच्या अधिकाराने चालतो, म्हणून निष्काळजी क्वेरी चुकीच्या लॉग ओळीपेक्षा मोठी समस्या आहे.
पर्यावरण ओतून न देता निदान करा
कोणती नावे होती, कोणता टप्पा चालला आणि कोणता इंटरप्रिटर वापरला गेला हे लॉग करा. संपूर्ण पर्यावरण छापू नका, कारण हुक प्रक्रिया लॉग फाइलमध्ये न जाणारी असंबद्ध मूल्ये वारसाने घेऊ शकते.
एक कनेक्शन सुरुवातीपासून शेवटपर्यंत तपासा: बाह्य टोक वाचा, दिलेला पत्ता वाचा, आणि त्या सत्राबद्दल सर्व्हरच्या स्वतःच्या दृष्टिकोनाशी दोन्ही पडताळा. एका क्लायंटसाठी जोडी निश्चित झाल्यावर, संबंधावर इतरत्रही विश्वास ठेवता येतो.