OpenVPN PHP-konks: trusted_ip versus ifconfig_pool_remote_ip
Kaks aadressi kahe eri tähendusega, mida loeb protsess, mida te ise ei käivitanud. Mis on konksu muutujad ja miks tühi $_ENV ei tõesta midagi.
Tühi $_ENV massiiv konksuskriptis tundub tõendina, et OpenVPN ei edastanud midagi. Tavaliselt on see tõend hoopis millestki muust: PHP oli seadistatud seda superglobaali mitte täitma ja väärtused istusid kogu aeg protsessi keskkonnas. Teine vale järeldus on peenem, sest ühenduse konksu kaks aadressimuutujat tähendavad eri asju ja neid kasutatakse vaheldumisi. Mõlemad vead maksavad pool päeva, kui alustada valest.
Kaks aadressi, kaks erinevat väidet
Välimine lõpp-punkt on see, mida server kliendi ühendumisel jälgis, saadaval kui trusted_ip IPv4 jaoks ja trusted_ip6 IPv6 jaoks. Virtuaalne aadress on see, mille bassein sellele seansile määras, saadaval kui ifconfig_pool_remote_ip.
Need vastavad erinevatele küsimustele ja kirje vajab tavaliselt ühte neist, mitte mõlemat. Esimene on see, kust ühendus tuli, mis võib olla jagatud NAT-aadress, mida kasutavad sajad inimesed. Teine on see, kus see seanss tunnelis elab, ja selle võib hiljem teisele seansile üle anda. Nende kahe segamine annab kirjeid, mis näivad usutavad ja on valed.
Minimaalne lugemine näeb välja nii.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Kumbki väärtus ei identifitseeri inimest. Üks on võrguvaatlus, teine rendileping, ja kirje, mis kohtleb kumbagi neist püsiva seadme identifikaatorina, on vale esimesel korral, kui klient ühendub uuesti teisest võrgust või saab teise basseini aadressi. Valige väli küsimuse järgi, millele kirje peab vastama, ja kirjutage see küsimus veerise kõrvale.
Kontrollige, kuidas PHP käivitati, mitte oma shelli
Konks töötab VPN-deemonile lapseprotsessina keskkonnas, mille deemon loob. Sinu interaktiivsel shellil on teistsugune, ja skripti käsitsi käivitamine testib shelli keskkonda, mitte konksu oma.
Alustage kinnitusest, et konks tõesti käivitus ootuspärases etapis. Valesse etappi kinnitatud skript või selline, mis ei käivitunud kunagi, sest direktiiv osutab teisele teele, annab täpselt sama sümptomi nagu puuduv muutuja. Lisage skripti algusesse teadlik marker-rida ja kinnitage, et see ilmub, enne kui midagi muud uurite. Üks ajatempliga rida logis eristab kunagi ei käivitunud sellest, et käivitus ilma väärtuseta.
Seejärel kinnitage, millist interpretaatorit ja millist konfiguratsioonifaili see kutse kasutab. Veebiserveri PHP-konfiguratsiooni muutmine ei muuda OpenVPN-i käivitatud CLI-protsessi juures midagi ja mõlemad võivad laadida täiesti erinevaid php.ini faile.
Miks tühi $_ENV ei tõesta midagi
PHP getenv-i viide dokumenteerib protsessi keskkonna otselugemist, mis tagastab false, kui nimi puudub. Superglobaal $_ENV täidetakse eraldi ja direktiiv variables_order otsustab, millised superglobaalid täidetakse.
Kui see direktiiv jätab E välja, jääb $_ENV tühjaks olenemata sellest, mida keskkond sisaldab. Kood, mis seda indekseerib, teatab siis puuduvast muutujast, mis tegelikult on olemas, ja uurimine liigub OpenVPN-i suunas, samal ajal kui vastus on failis php.ini. Kontrollige direktiivi just CLI-konfiguratsiooni jaoks, mitte veebiserveri jaoks.
getenv abil lugemine väldib kogu seda segaduste klassi, ja ümbriskript, mis enne interpretaatori kutsumist keskkonna tühjendab, toob selle teisel kujul tagasi.
Salvestage seos, mitte rea uuendus
Otsustage, millist väärtust kirje vajab, enne kui selle kirjutate. Kui eesmärk on märkida, kust seanss tuli, salvestage välimine lõpp-punkt ja märgistage see vaatlusena. Kui eesmärk on siduda seanss ühenduse kestel tunneli aadressiga, salvestage basseini aadress ja siduge see seansiga.
Uuendage autenditud identiteedi ja praeguse seansi järgi, mitte iga rea järgi, mis jagab tunneli aadressi, sest basseini aadresse kasutatakse uuesti ja hilinenud katkestussündmus võib muidu uuema ühenduse andmed üle kirjutada. Käsitlege IPv6-t selgesõnaliselt, selle asemel et vaikselt kirjutada ainult IPv4 väärtust. Rida NULL-välise aadressiga on parem kui rida vale aadressiga, sest esimene on nähtavalt puudulik.
Siduge kirjutamine OpenVPN-i antud seansi identifikaatoriga, et taasühendumine looks uue kirje, mitte ei muudaks vana. Kasutage parameetrilisi lauseid ja kontot, millel on ainult toiminguks vajalikud õigused. Konks töötab deemoni volitusega, seega hooletu päring on laiem probleem kui vale logirida.
Diagnoosige keskkonda välja kirjutamata
Logige, millised nimed olid olemas, milline etapp töötas ja millist interpretaatorit kasutati. Ärge trükkige kogu keskkonda, sest konksu protsess võib pärida kõrvalisi väärtusi, mis ei peaks logifaili jõudma.
Kontrollige üks ühendus otsast lõpuni: lugege välimine lõpp-punkt, lugege määratud aadress ja kinnitage mõlemad serveri enda vaate vastu sellele seansile. Kui paar on ühe kliendi jaoks kinnitatud, võib seost mujal usaldada.