Egy üres $_ENV tömb egy hook szkriptben úgy tűnik, mintha bizonyíték lenne arra, hogy OpenVPN nem adott át semmit. Általában valami egészen más bizonyítéka: a PHP úgy volt beállítva, hogy ne töltse ki azt a szuperglobálist, és az értékek végig a folyamat környezetében ültek. A második téves következtetés finomabb, mert a kapcsolati hook két címváltozója különböző dolgokat jelent, és felcserélve használják őket. Mindkét hiba egy délutánba kerül, ha a rosszal kezded.

Két cím, két különböző állítás

A külső végpont az, amit a szerver a kliens csatlakozásakor megfigyelt, trusted_ip néven érhető el IPv4-hez és trusted_ip6 néven IPv6-hoz. A virtuális cím az, amelyet a pool ehhez a munkamenethez kiosztott, ifconfig_pool_remote_ip néven érhető el.

Különböző kérdésekre válaszolnak, és egy rekordnak általában az egyikre van szüksége, nem mindkettőre. Az első az, hogy honnan érkezett a kapcsolat, ami lehet egy megosztott NAT-cím, amelyet több száz ember használ. A második az, hogy hol él ez a munkamenet az alagúton belül, és később egy másik munkamenethez rendelhető. A kettő összekeverése hihetőnek tűnő és hibás rekordokat eredményez.

Egy minimális olvasás így néz ki.

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

Egyik érték sem azonosít egy személyt. Az egyik hálózati megfigyelés, a másik bérlet, és egy rekord, amely bármelyiket stabil eszközazonosítóként kezeli, hibás lesz, amikor egy kliens először kapcsolódik újra más hálózatról, vagy más pool-címet kap. A mezőt aszerint válaszd ki, milyen kérdésre kell a rekordnak válaszolnia, majd írd oda ezt a kérdést az oszlop mellé.

Ellenőrizd, hogyan indult a PHP, ne a shelled

A hook a VPN-démon gyermekeként fut, a démon által épített környezettel. Az interaktív shell-ednek más a környezete, és a szkript kézi futtatása a shell környezetét teszteli, nem a hookét.

Kezdd annak megerősítésével, hogy a hook valóban a várt szakaszban futott le. Egy rossz szakaszhoz kapcsolt szkript, vagy olyan, amely soha nem futott, mert az utasítás másik útvonalra mutat, pontosan ugyanazt a tünetet adja, mint egy hiányzó változó. Tegyél szándékos jelölős sort a szkript elejére, és erősítsd meg, hogy megjelenik, mielőtt bármi mást vizsgálnál. Egyetlen időbélyeges sor a naplóban elválasztja a soha nem futott esetet a futott, de érték nélkül esettől.

Ezután erősítsd meg, melyik értelmezőt és melyik konfigurációs fájlt használja az a hívás. A webszerver PHP-konfigurációjának szerkesztése semmit nem változtat az OpenVPN által indított CLI-folyamaton, és a kettő teljesen eltérő php.ini fájlokat tölthet be.

Miért nem bizonyít semmit egy üres $_ENV

A PHP getenv-referenciája a folyamat környezetének közvetlen olvasását dokumentálja, amely false értéket ad vissza, ha a név hiányzik. A $_ENV szuperglobálist külön töltik ki, és a variables_order utasítás dönti el, mely szuperglobálisok töltődnek ki.

Ha ez az utasítás kihagyja a E elemet, a $_ENV üres marad, bármit tartalmaz is a környezet. Az őt indexelő kód ekkor hiányzó változót jelent, amely valójában jelen van, és a vizsgálat az OpenVPN felé indul, miközben a válasz a php.ini fájlban van. Ellenőrizd az utasítást kifejezetten a CLI-konfigurációnál, ne a webszerverénél.

A getenv segítségével olvasás elkerüli ezt az egész zavarosztályt, és az értelmező hívása előtt a környezetet tisztító burkolószkript más formában hozza vissza.

Társítást tárolj, ne sorfeltöltést

Döntsd el, milyen értékre van szüksége a rekordnak, mielőtt megírod. Ha a cél annak rögzítése, honnan érkezett egy munkamenet, tárold a külső végpontot, és címkézd megfigyelésként. Ha a cél egy munkamenet hozzárendelése egy alagútcímhez a kapcsolat idejére, tárold a pool-címet, és kösd a munkamenethez.

A hitelesített identitás és az aktuális munkamenet szerint frissíts, ne minden sor szerint, amely osztozik egy alagútcímen, mert a pool-címek újra felhasználhatók, és egy késői bontási esemény különben felülírhatja egy újabb kapcsolat adatait. Kezeld az IPv6-ot kifejezetten, ahelyett hogy csendben csak az IPv4 értéket írnád. Egy NULL külső címmel rendelkező sor jobb, mint egy hibás című, mert az első láthatóan hiányos.

Kösd az írást az OpenVPN által adott munkamenet-azonosítóhoz, hogy az újracsatlakozás új rekordot hozzon létre a régi szerkesztése helyett. Használj paraméterezett utasításokat és olyan fiókot, amelynek csak a művelethez szükséges jogosultságai vannak. A hook a démon felhatalmazásával fut, ezért egy gondatlan lekérdezés nagyobb probléma egy hibás naplósornál.

Diagnosztizálj a környezet kiírása nélkül

Naplózd, mely nevek voltak jelen, melyik szakasz futott és melyik értelmezőt használták. Ne nyomtasd ki a teljes környezetet, mert egy hook-folyamat örökölhet olyan ide nem tartozó értékeket, amelyeknek nem lenne szabad naplófájlba kerülniük.

Ellenőrizz egy kapcsolatot elejétől a végéig: olvasd ki a külső végpontot, olvasd ki a kiosztott címet, és igazold mindkettőt a szerver saját nézete ellenében ugyanarra a munkamenetre. Ha a pár egy ügyfélnél megerősítést nyert, a társítás máshol is megbízható.

Kapcsolódó cikkek