Ang walang laman na $_ENV array sa isang hook script ay parang patunay na wala ipinasa ang OpenVPN. Kadalasan ito ay patunay ng isang bagay na lubos na naiiba: ang PHP ay naka-configure na huwag punan ang superglobal na iyon, at ang mga halaga ay nasa kapaligiran ng proseso sa buong panahon. Ang ikalawang maling konklusyon ay mas banayad, dahil ang dalawang address na variable sa isang hook ng koneksyon ay may magkaibang kahulugan at ginagamit nang palitan. Ang dalawang pagkakamali ay kumakain ng isang hapon kung magsisimula ka sa mali.

Dalawang address, dalawang magkaibang pahayag

Ang panlabas na dulo ay ang naobserbahan ng server nang kumonekta ang kliyente, makukuha bilang trusted_ip para sa IPv4 at trusted_ip6 para sa IPv6. Ang virtual na address ay ang itinalaga ng pool para sa session na ito, makukuha bilang ifconfig_pool_remote_ip.

Sinasagot nila ang magkaibang tanong, at ang isang tala ay kadalasang nangangailangan ng isa sa kanila, hindi ang dalawa. Ang una ay kung saan nanggaling ang koneksyon, na maaaring isang pinagsasaluhang NAT address na ginagamit ng daan-daang tao. Ang ikalawa ay kung saan nakatira ang session na ito sa loob ng tunnel, at maaari itong italaga sa ibang session mamaya. Ang paghalo sa dalawa ay gumagawa ng mga talang mukhang makatwiran at mali.

Ganito ang hitsura ng pinakamababang pagbasa.

$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner  = getenv('ifconfig_pool_remote_ip');
$outer  = $outer4 !== false ? $outer4 : $outer6;

Walang halaga ang tumutukoy sa isang tao. Ang isa ay obserbasyon sa network, ang isa ay pag-upa, at ang isang tala na tinatrato ang alinman sa mga ito bilang matatag na pagkakakilanlan ng device ay mali sa unang pagkakataon na muling kumonekta ang kliyente mula sa ibang network o makatanggap ng ibang pool address. Piliin ang field ayon sa tanong na dapat sagutin ng tala, pagkatapos ay isulat ang tanong na iyon sa tabi ng column.

Suriin kung paano inilunsad ang PHP, hindi ang iyong shell

Tumatakbo ang hook bilang anak ng VPN daemon na may kapaligirang binubuo ng daemon. Ang iyong interactive na shell ay may iba, at ang pagpapatakbo ng script sa kamay ay sinusuri ang kapaligiran ng shell, hindi ng hook.

Magsimula sa pagtiyak na talagang nag-apoy ang hook sa yugtong inaasahan mo. Ang script na nakakabit sa maling yugto, o isa na hindi kailanman tumakbo dahil ang direktiba ay tumuturo sa ibang landas, ay nagbibigay ng eksaktong parehong sintomas tulad ng nawawalang variable. Magdagdag ng sadyang marker line sa itaas ng script at tiyakin na lumilitaw ito bago mo suriin ang anumang iba pa. Ang isang linyang may timestamp sa log ay naghihiwalay ng «hindi kailanman tumakbo» sa «tumakbo nang walang halaga».

Pagkatapos ay tiyakin kung aling interpreter at aling configuration file ang ginagamit ng invocation na iyon. Ang pag-edit ng configuration ng PHP para sa isang web server ay walang binabago sa isang CLI process na inilunsad ng OpenVPN, at ang dalawa ay maaaring mag-load ng lubos na magkaibang php.ini file.

Bakit walang pinapatunayan ang walang laman na $_ENV

Ang PHP getenv reference ay nagdodokumento ng direktang pagbasa sa kapaligiran ng proseso, na nagbabalik ng false kapag wala ang pangalan. Ang $_ENV superglobal ay pinupuno nang hiwalay, at ang variables_order directive ang nagpapasya kung aling mga superglobal ang pupunuin.

Kung laktawan ng direktibang iyon ang E, mananatiling walang laman ang $_ENV anuman ang nilalaman ng kapaligiran. Ang code na nag-index dito ay mag-uulat ng nawawalang variable na sa katunayan ay naroroon, at ang pagsisiyasat ay pupunta sa OpenVPN habang ang sagot ay nasa php.ini. Suriin ang direktiba partikular para sa CLI configuration, hindi para sa web server.

Ang pagbasa gamit ang getenv ay umiiwas sa buong kalituhan, at ang wrapper script na naglilinis ng kapaligiran bago tawagin ang interpreter ay muling nagpapakilala nito sa ibang anyo.

Mag-imbak ng ugnayan, hindi update ng row

Magpasya kung aling halaga ang kailangan ng tala bago ito isulat. Kung layunin na itala kung saan nanggaling ang session, iimbak ang panlabas na dulo at lagyan ito ng label bilang obserbasyon. Kung layunin na iugnay ang session sa isang tunnel address sa tagal ng koneksyon, iimbak ang pool address at iugnay ito sa session.

I-update ayon sa authenticated na pagkakakilanlan at kasalukuyang session, hindi ayon sa bawat row na nagbabahagi ng tunnel address, dahil ang mga pool address ay ginagamit muli at ang isang huling kaganapan ng disconnect ay maaaring mag-overwrite sa data ng mas bagong koneksyon. Pangasiwaan ang IPv6 nang tahasan sa halip na tahimik na isulat lamang ang halaga ng IPv4. Ang isang row na may NULL panlabas na address ay mas mabuti kaysa sa row na may maling address, dahil ang una ay kitang hindi kumpleto.

Iugnay ang pagsulat sa session identifier na ibinibigay ng OpenVPN upang ang muling pagkonekta ay lumikha ng bagong tala sa halip na i-edit ang luma. Gumamit ng parameterized na pahayag at account na may lamang mga pahintulot na kailangan ng operasyon. Tumatakbo ang hook sa awtoridad ng daemon, kaya ang walang ingat na query ay mas malawak na problema kaysa sa maling linya ng log.

Mag-diagnose nang hindi itinatapon ang kapaligiran

I-log kung aling mga pangalan ang naroroon, aling yugto ang tumakbo at aling interpreter ang ginamit. Huwag i-print ang buong kapaligiran, dahil ang isang hook process ay maaaring magmana ng walang kaugnayang halaga na hindi dapat mapunta sa isang log file.

I-verify ang isang koneksyon mula simula hanggang dulo: basahin ang panlabas na dulo, basahin ang itinalagang address, at tiyakin ang dalawa laban sa sariling pananaw ng server sa session na iyon. Kapag nakumpirma ang pares para sa isang kliyente, mapagkakatiwalaan na ang ugnayan sa iba pang lugar.

Kaugnay na mga artikulo