Tyhjä $_ENV-taulukko koukkuskriptissä tuntuu todisteelta siitä, että OpenVPN ei välittänyt mitään. Yleensä se on todiste jostain aivan muusta: PHP oli asetettu olemaan täyttämättä sitä superglobaalia, ja arvot istuivat prosessin ympäristössä koko ajan. Toinen väärä johtopäätös on hienovaraisempi, koska yhteyskoukun kaksi osoitemuuttujaa tarkoittavat eri asioita ja niitä käytetään ristiin. Molemmat virheet maksavat iltapäivän, jos aloittaa väärästä.

Kaksi osoitetta, kaksi eri väitettä

Ulompi päätepiste on se, minkä palvelin havaitsi asiakkaan yhdistäessä, saatavilla muodossa trusted_ip IPv4:lle ja trusted_ip6 IPv6:lle. Virtuaaliosoite on se, minkä allas jakoi tälle istunnolle, saatavilla muodossa ifconfig_pool_remote_ip.

Ne vastaavat eri kysymyksiin, ja tietue tarvitsee yleensä toisen niistä eikä molempia. Ensimmäinen on se, mistä yhteys tuli, mikä voi olla jaettu NAT-osoite, jota sadat ihmiset käyttävät. Toinen on se, missä tämä istunto elää tunnelin sisällä, ja se voidaan myöhemmin jakaa toiselle istunnolle. Näiden kahden sekoittaminen tuottaa tietueita, jotka näyttävät uskottavilta ja ovat vääriä.

Minimaalinen luku näyttää tältä.

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

Kumpikaan arvoista ei tunnista henkilöä. Toinen on verkkohavainto, toinen vuokrasopimus, ja tietue, joka kohtelee kumpaakin pysyvänä laitetunnisteena, on väärä ensimmäisellä kerralla, kun asiakas yhdistää uudelleen toisesta verkosta tai saa toisen allasosoitteen. Valitse kenttä sen kysymyksen mukaan, johon tietueen on vastattava, ja kirjoita sitten se kysymys sarakkeen viereen.

Tarkista, miten PHP käynnistettiin, älä omaa kuortasi

Koukku toimii VPN-daemonin lapsena ympäristössä, jonka daemon rakentaa. Interaktiivisella kuorellasi on toinen, ja skriptin käsin ajaminen testaa kuoren ympäristöä eikä koukun.

Aloita vahvistamalla, että koukku todella laukesi siinä vaiheessa, jota odotit. Väärään vaiheeseen liitetty skripti tai sellainen, joka ei koskaan ajanut, koska direktiivi osoittaa toiseen polkuun, antaa täsmälleen saman oireen kuin puuttuva muuttuja. Lisää tarkoituksellinen merkintärivi skriptin alkuun ja vahvista, että se ilmestyy ennen kuin tarkistat mitään muuta. Yksi aikaleimattu rivi lokissa erottaa tapauksen, jossa skripti ei koskaan ajanut, tapauksesta, jossa se ajettiin ilman arvoa.

Vahvista sitten, mitä tulkkia ja mitä asetustiedostoa kyseinen kutsu käyttää. PHP-asetusten muokkaaminen verkkopalvelimelle ei muuta mitään OpenVPN:n käynnistämässä CLI-prosessissa, ja molemmat voivat ladata täysin eri php.ini-tiedostoja.

Miksi tyhjä $_ENV ei todista mitään

PHP:n getenv-viittaus dokumentoi prosessin ympäristön suoran luvun, joka palauttaa false, kun nimi puuttuu. Superglobaali $_ENV täytetään erikseen, ja direktiivi variables_order päättää, mitkä superglobaalit täytetään.

Jos tämä direktiivi jättää E pois, $_ENV jää tyhjäksi riippumatta siitä, mitä ympäristö sisältää. Sitä indeksoiva koodi ilmoittaa silloin puuttuvasta muuttujasta, joka todella on olemassa, ja tutkinta suuntautuu OpenVPN:ään, kun vastaus on tiedostossa php.ini. Tarkista direktiivi nimenomaan CLI-asetuksista, ei verkkopalvelimesta.

getenv-funktiolla lukeminen välttää koko tämän sekaannusluokan, ja kääreskripti, joka tyhjentää ympäristön ennen tulkin kutsumista, tuo sen takaisin eri muodossa.

Tallenna liitos, älä rivin päivitys

Päätä, mitä arvoa tietue tarvitsee, ennen kuin kirjoitat sen. Jos tavoitteena on merkitä, mistä istunto tuli, tallenna ulompi päätepiste ja merkitse se havainnoksi. Jos tavoitteena on liittää istunto tunneliosoitteeseen yhteyden ajaksi, tallenna altaan osoite ja avaa se istuntoon.

Päivitä todennetun identiteetin ja nykyisen istunnon mukaan, älä jokaisen tunneliosoitetta jakavan rivin mukaan, koska altaan osoitteita käytetään uudelleen ja myöhäinen katkaisutapahtuma voi muuten ylikirjoittaa uudemman yhteyden tiedot. Käsittele IPv6 selkeästi sen sijaan, että kirjoittaisit hiljaa vain IPv4-arvon. Rivi, jolla ulompi osoite on NULL, on parempi kuin rivi, jolla se on väärä, koska ensimmäinen on näkyvästi puutteellinen.

Avaa kirjoitus OpenVPN:n tarjoamaan istuntotunnisteeseen, jotta uudelleenyhdistäminen luo uuden tietueen eikä muokkaa vanhaa. Käytä parametroituja lauseita ja tiliä, jolla on vain toiminnon tarvitsemat oikeudet. Koukku toimii daemonin valtuuksin, joten huolimaton kysely on laajempi ongelma kuin väärä lokirivi.

Diagnosoi tulostamatta ympäristöä

Kirjaa, mitkä nimet olivat läsnä, mikä vaihe ajoi ja mitä tulkkia käytettiin. Älä tulosta koko ympäristöä, koska koukkprosessi voi periä asiaankuulumattomia arvoja, joiden ei pitäisi päätyä lokitiedostoon.

Vahvista yksi yhteys päästä päähän: lue ulompi päätepiste, lue jaettu osoite ja vahvista molemmat palvelimen omaa istuntokäsitystä vasten. Kun pari on vahvistettu yhdelle asiakkaalle, liitokseen voi luottaa muuallakin.

Aiheeseen liittyvät artikkelit