ഒരു ഹുക്ക് സ്ക്രിപ്റ്റിലെ ശൂന്യമായ $_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 നൽകുന്ന സെഷൻ ഐഡന്റിഫയറിലേക്ക് എഴുത്ത് കീ ചെയ്യുക. പാരാമീറ്റർ ചെയ്ത സ്റ്റേറ്റ്മെന്റുകളും ഓപ്പറേഷന് ആവശ്യമായ അനുമതികൾ മാത്രമുള്ള ഒരു അക്കൗണ്ടും ഉപയോഗിക്കുക. ഹുക്ക് ഡീമണിന്റെ അധികാരത്തോടെ പ്രവർത്തിക്കുന്നു, അതിനാൽ അശ്രദ്ധമായ ഒരു ക്വറി തെറ്റായ ലോഗ് വരിയേക്കാൾ വലിയ പ്രശ്നമാണ്.

പരിസ്ഥിതി കളയാതെ രോഗനിർണ്ണയം ചെയ്യുക

ഏതൊക്കെ പേരുകൾ ഉണ്ടായിരുന്നു, ഏത് ഘട്ടം പ്രവർത്തിച്ചു, ഏത് ഇന്റർപ്രെട്ടർ ഉപയോഗിച്ചു എന്ന് ലോഗ് ചെയ്യുക. മുഴുവൻ പരിസ്ഥിതിയും പ്രിന്റ് ചെയ്യരുത്, കാരണം ഒരു ഹുക്ക് പ്രോസസ് ലോഗ് ഫയലിൽ അവസാനിക്കരുതാത്ത അനുബന്ധമല്ലാത്ത മൂല്യങ്ങൾ പാരമ്പര്യമായി സ്വീകരിക്കാം.

ഒരു കണക്ഷൻ പൂർണ്ണമായി പരിശോധിക്കുക: പുറം എൻഡ്പോയിന്റ് വായിക്കുക, അനുവദിച്ച വിലാസം വായിക്കുക, ആ സെഷനെക്കുറിച്ചുള്ള സെർവറിന്റെ സ്വന്തം കാഴ്ചപ്പാടിനെതിരെ രണ്ടും ഉറപ്പാക്കുക. ഒരു ക്ലയന്റിനായി ജോടി ഉറപ്പിച്ചാൽ, ബന്ധത്തിൽ മറ്റിടങ്ങളിലും വിശ്വസിക്കാം.

അനുബന്ധ ലേഖനങ്ങൾ