Bachyn PHP OpenVPN: trusted_ip yn erbyn ifconfig_pool_remote_ip
Dau gyfeiriad â dau ystyr wahanol, yn cael eu darllen gan broses na wnaethoch chi ei lansio. Beth yw newidynnau'r bachyn, a pham nad yw $_ENV gwag yn profi dim.
Mae arae $_ENV gwag mewn sgript bachyn yn teimlo fel prawf nad oedd OpenVPN wedi pasio dim. Fel arfer mae'n brawf o rywbeth hollol wahanol: roedd PHP wedi'i ffurfweddu i beidio â llenwi'r uwchglobynnau hwnnw, ac roedd y gwerthoedd yn eistedd yn amgylchedd y broses drwy'r amser. Mae'r ail gasgliad ffug yn fwy cynnil, oherwydd mae dau newidyn cyfeiriad mewn bachyn cysylltiad yn golygu pethau gwahanol ac yn cael eu defnyddio'n gyfnewidiol. Mae'r ddau gamgymeriad yn costio prynhawn os dechreuwch o'r un anghywir.
Dau gyfeiriad, dau honiad gwahanol
Y diweddbwynt allanol yw'r hyn a sylwodd y gweinydd pan gysylltodd y cleient, ar gael fel trusted_ip ar gyfer IPv4 a trusted_ip6 ar gyfer IPv6. Y cyfeiriad rhithwir yw'r hyn a neilltuodd y pwll ar gyfer y sesiwn hon, ar gael fel ifconfig_pool_remote_ip.
Maen nhw'n ateb cwestiynau gwahanol, ac mae cofnod fel arfer angen un ohonynt yn hytrach na'r ddau. Yr un cyntaf yw o ble y daeth y cysylltiad, a allai fod yn gyfeiriad NAT a rennir gan gannoedd o bobl. Yr ail yw ble mae'r sesiwn hon yn byw y tu mewn i'r tiwnel, ac mae modd ei hailbennu i sesiwn arall yn ddiweddarach. Mae cymysgu'r ddau yn cynhyrchu cofnodion sy'n edrych yn gredadwy ac yn anghywir.
Mae darlleniad lleiaf yn edrych fel hyn.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Nid yw'r un o'r ddau werth yn nodi person. Sylwad rhwydwaith yw un, prydles yw'r llall, ac mae cofnod sy'n trin y naill neu'r llall fel dynodwr dyfais sefydlog yn mynd i fod yn anghywir y tro cyntaf y bydd cleient yn ailgysylltu o rwydwaith gwahanol neu'n cael cyfeiriad pwll gwahanol. Dewiswch y maes yn ôl y cwestiwn y mae'n rhaid i'r cofnod ei ateb, ac yna ysgrifennwch y cwestiwn hwnnw wrth ymyl y golofn.
Gwiriwch sut y lansiwyd PHP, nid eich plisgyn
Mae'r bachyn yn rhedeg fel plentyn i daemon VPN ag amgylchedd y mae'r daemon yn ei adeiladu. Mae gan eich plisgyn rhyngweithiol un gwahanol, ac mae rhedeg y sgript â llaw yn profi amgylchedd y plisgyn yn hytrach nag un y bachyn.
Dechreuwch drwy gadarnhau bod y bachyn wedi tanio go iawn ar y cam roeddech yn ei ddisgwyl. Mae sgript wedi'i chysylltu â'r cam anghywir, neu un na redodd erioed oherwydd bod y cyfarwyddeb yn pwyntio at lwybr arall, yn rhoi'r un symptom yn union â newidyn coll. Ychwanegwch linell farciwr fwriadol ar frig y sgript a chadarnhewch ei bod yn ymddangos cyn i chi archwilio unrhyw beth arall. Mae un llinell â stamp amser yn y log yn gwahanu «na redodd erioed» oddi wrth «rhedodd heb y gwerth».
Yna cadarnhewch pa ddehonglydd a pha ffeil ffurfweddu y mae'r alwad honno'n ei defnyddio. Nid yw golygu ffurfwedd PHP ar gyfer gweinydd gwe yn newid dim am broses CLI a ddechreuwyd gan OpenVPN, ac mae'r ddau yn gallu llwytho ffeiliau php.ini hollol wahanol.
Pam nad yw $_ENV gwag yn profi dim
Mae cyfeirlyfr getenv PHP yn dogfennu darlleniad uniongyrchol o amgylchedd y broses, sy'n dychwelyd false pan fydd yr enw ar goll. Mae'r uwchglobynnau $_ENV yn cael ei lenwi ar wahân, a'r gyfarwyddeb variables_order sy'n penderfynu pa uwchglobynnau a lenwir.
Os yw'r gyfarwyddeb honno'n hepgor E, mae $_ENV yn aros yn wag waeth beth sydd yn yr amgylchedd. Mae cod sy'n ei fynegai wedyn yn adrodd am newidyn coll sydd mewn gwirionedd yn bresennol, ac mae'r ymchwiliad yn mynd tuag at OpenVPN pan fo'r ateb yn php.ini. Gwiriwch y gyfarwyddeb yn benodol ar gyfer ffurfwedd CLI, nid ar gyfer y gweinydd gwe.
Mae darllen gyda getenv yn osgoi'r dosbarth cyfan hwn o ddryswch, ac mae sgript lapio sy'n clirio'r amgylchedd cyn galw'r dehonglydd yn ei ailgyflwyno ar ffurf wahanol.
Storiwch gysylltiad, nid diweddariad rhes
Penderfynwch pa werth sydd ei angen ar y cofnod cyn ei ysgrifennu. Os mai'r nod yw nodi o ble y daeth sesiwn, storiwch y diweddbwynt allanol a'i labelu fel sylwad. Os mai'r nod yw mapio sesiwn i gyfeiriad tiwnel am gyfnod cysylltiad, storiwch gyfeiriad y pwll a'i gysylltu â'r sesiwn.
Diweddarwch yn ôl yr hunaniaeth ddilysedig a'r sesiwn gyfredol yn hytrach nag yn ôl pob rhes sy'n rhannu cyfeiriad tiwnel, oherwydd mae cyfeiriadau'r pwll yn cael eu hailddefnyddio ac fel arall gall digwyddiad datgysylltu hwyr drosysgrifennu data cysylltiad mwy newydd. Trinwch IPv6 yn eglur yn hytrach nag ysgrifennu gwerth IPv4 yn unig yn dawel. Mae rhes â chyfeiriad allanol NULL yn well na rhes â'r un anghywir, oherwydd mae'r gyntaf yn amlwg yn anghyflawn.
Cysylltwch yr ysgrif â dynodwr y sesiwn a ddarperir gan OpenVPN fel bod ailgysylltiad yn creu cofnod newydd yn hytrach nag olygu yr hen un. Defnyddiwch ddatganiadau paramedredig a chyfrifyn gyda dim ond y caniatadau sydd eu hangen ar y gweithrediad. Mae bachyn yn rhedeg ag awdurdod y daemon, felly mae ymholiad diofal yn broblem ehangach na llinell log anghywir.
Diagnoswch heb daflu'r amgylchedd
Cofnodwch pa enwau oedd yn bresennol, pa gam a redodd a pha ddehonglydd a ddefnyddiwyd. Peidiwch â phrintio'r amgylchedd cyfan, oherwydd gall proses bachyn etifeddu gwerthoedd diberthyn na ddylent fod yn y ffeil log.
Gwiriwch un cysylltiad o'r dechrau i'r diwedd: darllenwch y diweddbwynt allanol, darllenwch y cyfeiriad a neilltuwyd, a chadarnhewch y ddau yn erbyn golwg y gweinydd ei hun ar y sesiwn honno. Unwaith y bydd y pâr wedi'i gadarnhau ar gyfer un cleient, gellir ymddiried yn y cysylltiad yn rhywle arall.