OpenVPN-ի PHP-կեռիկ՝ trusted_ip ընդդեմ ifconfig_pool_remote_ip-ի
Երկու հասցե՝ երկու տարբեր իմաստով, որոնք կարդում է մի պրոցես, որը դուք չեք գործարկել։ Ինչ են կեռիկի փոփոխականները և ինչու դատարկ $_ENV-ը ոչինչ չի ապացուցում։
Դատարկ $_ENV զանգվածը կեռիկի սկրիպտում թվում է ապացույց, որ OpenVPN ոչինչ չի փոխանցել։ Սովորաբար դա բոլորովին այլ բանի ապացույց է՝ PHP-ն այնպես էր կարգավորված, որ այդ գերգլոբալը չլցվեր, և արժեքները ամբողջ ընթացքում նստած էին պրոցեսի միջավայրում։ Երկրորդ սխալ եզրակացությունն ավելի նուրբ է, որովհետև կապակցման կեռիկի երկու հասցե փոփոխականները տարբեր բաներ են նշանակում և օգտագործվում են միմյանց փոխարեն։ Երկու սխալներն էլ արժեն մեկ կեսօր, եթե սկսեք սխալից։
Երկու հասցե, երկու տարբեր պնդում
Արտաքին ծայրակետն այն է, ինչ սերվերը դիտել է, երբ հաճախորդը միացել է՝ հասանելի որպես trusted_ip IPv4-ի համար և trusted_ip6 IPv6-ի համար։ Վիրտուալ հասցեն այն է, ինչ լողավազանը հատկացրել է այս նստաշրջանին՝ հասանելի որպես 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-ն, ոչ թե ձեր shell-ը
Կեռիկը աշխատում է որպես VPN դեմոնի զավակ՝ դեմոնի կառուցած միջավայրով։ Ձեր ինտերակտիվ shell-ն ունի այլ միջավայր, և սկրիպտը ձեռքով գործարկելը ստուգում է shell-ի միջավայրը, ոչ թե կեռիկինը։
Սկսեք հաստատելով, որ կեռիկն իսկապես գործարկվել է ձեր սպասած փուլում։ Սխալ փուլին կցված սկրիպտը, կամ այն, որը երբեք չի աշխատել, որովհետև հրահանգը ցույց է տալիս այլ ուղի, տալիս է ճիշտ նույն ախտանիշը, ինչ բացակայող փոփոխականը։ Ավելացրեք դիտավորյալ նշիչ տող սկրիպտի սկզբում և հաստատեք, որ այն երևում է, նախքան որևէ այլ բան ստուգելը։ Մեկ ժամանակադրված տող մատյանում բաժանում է «երբեք չի աշխատել»-ը «աշխատել է առանց արժեքի»-ից։
Ապա հաստատեք, թե որ ինտերպրետատորն ու որ կոնֆիգուրացիայի ֆայլն է օգտագործում այդ կանչը։ Վեբ սերվերի PHP կոնֆիգուրացիան խմբագրելը ոչինչ չի փոխում OpenVPN-ի գործարկած CLI պրոցեսում, և երկուսը կարող են բեռնել բոլորովին տարբեր php.ini ֆայլեր։
Ինչու դատարկ $_ENV-ը ոչինչ չի ապացուցում
PHP-ի getenv-ի հղումը նկարագրում է պրոցեսի միջավայրի ուղիղ ընթերցում, որը վերադարձնում է false, երբ անունը բացակայում է։ $_ENV գերգլոբալը լրացվում է առանձին, և variables_order հրահանգը որոշում է, թե որ գերգլոբալներն են լցվելու։
Եթե այդ հրահանգը բաց թողնի E-ը, $_ENV-ը դատարկ կմնա անկախ նրանից, թե ինչ կա միջավայրում։ Այն ինդեքսավորող կոդն այդ ժամանակ հաղորդում է բացակայող փոփոխականի մասին, որը իրականում առկա է, և հետաքննությունը գնում է OpenVPN-ի ուղղությամբ, մինչ պատասխանը php.ini-ում է։ Ստուգեք հրահանգը հատուկ CLI կոնֆիգուրացիայի համար, ոչ վեբ սերվերի։
getenv-ով կարդալը խուսափում է այս ամբողջ շփոթության դասից, և ինտերպրետատորը կանչելուց առաջ միջավայրը մաքրող փաթաթող սկրիպտը այն վերադարձնում է այլ ձևով։
Պահեք կապակցում, ոչ թե տողի թարմացում
Որոշեք, թե գրառմանն ինչ արժեք է պետք, նախքան այն գրելը։ Եթե նպատակն է նշել, թե որտեղից է եկել նստաշրջանը, պահեք արտաքին ծայրակետը և պիտակեք այն որպես դիտարկում։ Եթե նպատակն է նստաշրջանը կապել թունելի հասցեի հետ կապի տևողության ընթացքում, պահեք լողավազանի հասցեն և կապեք այն նստաշրջանին։
Թարմացրեք ըստ նույնականացված ինքնության և ընթացիկ նստաշրջանի, այլ ոչ թե յուրաքանչյուր տողի, որը կիսում է թունելի հասցեն, որովհետև լողավազանի հասցեները վերաօգտագործվում են, և ուշ անջատման իրադարձությունը կարող է հակառակ դեպքում վերագրել ավելի նոր կապի տվյալները։ Կառավարեք IPv6-ը բացահայտորեն՝ անշշուկ միայն IPv4 արժեքը գրելու փոխարեն։ NULL արտաքին հասցեով տողն ավելի լավ է, քան սխալ հասցեով տողը, որովհետև առաջինը տեսանելիորեն թերի է։
Կապեք գրառումը OpenVPN-ի տրամադրած նստաշրջանի նույնացուցիչին, որպեսզի վերամիացումը ստեղծի նոր գրառում՝ հինը խմբագրելու փոխարեն։ Օգտագործեք պարամետրացված հայտարարություններ և հաշիվ, որն ունի միայն գործողությանը պետք եկող թույլտվությունները։ Կեռիկը աշխատում է դեմոնի լիազորությամբ, ուստի անփույթ հարցումն ավելի լայն խնդիր է, քան սխալ մատյանի տողը։
Ախտորոշեք առանց միջավայրը թափելու
Գրանցեք, թե որ անուններն էին առկա, որ փուլն աշխատեց և որ ինտերպրետատորն օգտագործվեց։ Չտպեք ամբողջ միջավայրը, որովհետև կեռիկի պրոցեսը կարող է ժառանգել անառնչություն արժեքներ, որոնք չպետք է հայտնվեն մատյանի ֆայլում։
Ստուգեք մեկ կապը սկզբից մինչև վերջ՝ կարդացեք արտաքին ծայրակետը, կարդացեք հատկացված հասցեն և հաստատեք երկուսն էլ սերվերի սեփական տեսակետի դեմ այդ նստաշրջանի վերաբերյալ։ Երբ զույգը հաստատված է մեկ հաճախորդի համար, կապակցմանը կարելի է վստահել այլուր։