OpenVPN PHP-krok: trusted_ip mot ifconfig_pool_remote_ip
To adresser med to ulike tydingar, lesne av ein prosess du ikkje starta. Kva krokvariablane er, og kvifor eit tomt $_ENV ikkje provar noko.
Eit tomt $_ENV-array i eit krokskript kjennest som prov på at OpenVPN ikkje sende noko. Vanlegvis er det prov på noko heilt anna: PHP var konfigurert til ikkje å fylla den superglobale variabelen, og verdiane låg i prosessmiljøet heile tida. Den andre feilaktige slutninga er meir subtil, fordi dei to adressevariablane i ein tilkoplingskrok tyder ulike ting og vert brukte om einannan. Begge feila kostar ein ettermiddag om du startar med den gale.
To adresser, to ulike påstandar
Det ytre endepunktet er det serveren observerte då klienten kopla til, tilgjengeleg som trusted_ip for IPv4 og trusted_ip6 for IPv6. Den virtuelle adressa er det utvalet tildelte for denne økta, tilgjengeleg som ifconfig_pool_remote_ip.
Dei svarar på ulike spørsmål, og ein post treng vanlegvis éin av dei, ikkje begge. Den fyrste er kvar tilkoplinga kom frå, som kan vera ei delt NAT-adresse brukt av hundrevis av menneske. Den andre er kvar denne økta bur inne i tunnelen, og ho kan tildelast ei anna økt seinare. Å blanda dei to gjev postar som ser rimelege ut og er gale.
Ei minimal lesing ser slik ut.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Ingen av verdiane identifiserer ein person. Den eine er ein nettverksobservasjon, den andre ein leige, og ein post som handsamar nokon av dei som ein stabil einingidentifikator vil vera gal fyrste gong ein klient koplar til på nytt frå eit anna nettverk eller får ei anna utvalsadresse. Vel feltet etter spørsmålet posten må svara på, og skriv det spørsmålet ved sida av kolonnen.
Sjekk korleis PHP vart starta, ikkje skalet ditt
Kroken køyrer som eit barn av VPN-demonen med eit miljø demonen byggjer. Det interaktive skalet ditt har eit anna, og å køyra skriptet for hand testar skalets miljø, ikkje krokens.
Byrja med å stadfesta at kroken faktisk utløyste på stadiet du venta. Eit skript fest til feil stadium, eller eit som aldri køyrde fordi direktivet peikar på ein annan stig, gjev nøyaktig same symptom som ein manglande variabel. Legg inn ei medviten markørline øvst i skriptet og stadfest at ho viser seg før du granskar noko anna. Éi tidsstempla line i loggen skil «køyrde aldri» frå «køyrde utan verdien».
Stadfest deretter kva tolk og kva konfigurasjonsfil den køyringa brukar. Å endra PHP-konfigurasjonen for ein webserver endrar ingenting for ein CLI-prosess starta av OpenVPN, og dei to kan lasta heilt ulike php.ini-filer.
Kvifor eit tomt $_ENV ikkje provar noko
PHPs getenv-referanse dokumenterer ei direkte lesing av prosessmiljøet, som returnerer false når namnet manglar. Superglobalen $_ENV vert fylla separat, og direktivet variables_order avgjer kva superglobalar som vert fylte.
Viss det direktivet utelèt E, vert $_ENV ståande tom uansett kva miljøet inneheld. Kode som indekserer han rapporterer då ein manglande variabel som faktisk finst, og granskinga går mot OpenVPN medan svaret ligg i php.ini. Sjekk direktivet spesielt for CLI-konfigurasjonen, ikkje for webserveren.
Lesing med getenv unngår heile denne forvirringa, og eit innpakkingsskript som tømmer miljøet før det kallar tolken, gjeninnfører ho i ei anna form.
Lagre ei tilknyting, ikkje ein radoppdatering
Avgjer kva verdi posten treng før du skriv han. Viss målet er å notera kvar ei økt kom frå, lagre det ytre endepunktet og merk det som ein observasjon. Viss målet er å knyta ei økt til ei tunneladresse for varigheita av ei tilkopling, lagre utvalsadressa og nøkle ho til økta.
Oppdater etter den autentiserte identiteten og den gjeldande økta, ikkje etter kvar rad som deler ei tunneladresse, fordi utvalsadresser vert brukte om att og ei sein fråkoplingshending elles kan skriva over dataa til ei nyare tilkopling. Handsak IPv6 eksplisitt i staden for å skriva berre IPv4-verdien i det stille. Ei rad med NULL ytre adresse er betre enn ei rad med feil, fordi den fyrste er synleg ufullstendig.
Nøkle skrivinga til øktidentifikatoren OpenVPN gjev, slik at ei ny tilkopling lagar ein ny post i staden for å redigera den gamle. Bruk parameteriserte utsegner og ein konto med berre løyva operasjonen treng. Ein krok køyrer med myndet til demonen, så ein uforsiktig spørjing er eit større problem enn ei feil loggline.
Diagnostiser utan å dumpa miljøet
Logg kva namn som var til stades, kva stadium som køyrde og kva tolk som vart brukt. Ikkje skriv ut heile miljøet, fordi ein krokprosess kan arva urelaterte verdiar som ikkje bør hamna i ei loggfil.
Stadfest éi tilkopling frå ende til annan: les det ytre endepunktet, les den tildelte adressa, og stadfest begge mot serveren sitt eige syn på den økta. Når paret er stadfesta for éin klient, kan tilknytinga stolast på andre stader.