OpenVPN PHP кука: trusted_ip наспрам ifconfig_pool_remote_ip
Две адресе са два различита значења, које чита процес који нисте покренули. Шта су променљиве куке и зашто празан $_ENV ништа не доказује.
Празан низ $_ENV у скрипти куке изгледа као доказ да OpenVPN није ништа пренео. Обично доказује нешто сасвим друго: PHP је био подешен да не попуњава ту суперглобалну променљиву, а вредности су све време стајале у окружењу процеса. Други погрешан закључак је суптилнији, јер две променљиве адресе у куки везе значе различите ствари и користе се као заменљиве. Обе грешке коштају једно поподне ако се почне са погрешном.
Две адресе, две различите тврдње
Спољна крајња тачка је оно што је сервер приметио кад се клијент повезао, доступна као trusted_ip за IPv4 и trusted_ip6 за IPv6. Виртуелна адреса је оно што је базен доделио овој сесији, доступна као ifconfig_pool_remote_ip.
Оне одговарају на различита питања, а запису обично треба једна од њих, не обе. Прва говори одакле је веза дошла, што може бити дељена NAT адреса коју користе стотине људи. Друга говори где ова сесија живи унутар тунела, и може се касније доделити другој сесији. Мешање двеју даје записе који изгледају уверљиво и погрешни су.
Минимално читање изгледа овако.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Ниједна вредност не идентификује особу. Једна је мрежно посматрање, друга је закуп, а запис који било коју од њих третира као стабилан идентификатор уређаја биће погрешан први пут кад се клијент поново повеже из друге мреже или добије другу адресу базена. Изаберите поље према питању на које запис мора да одговори, па то питање упишите поред колоне.
Проверите како је PHP покренут, а не своју љуску
Кука ради као дете VPN демона са окружењем које демон гради. Ваша интерактивна љуска има друго, а ручно покретање скрипте проверава окружење љуске, а не куке.
Почните тако што ћете потврдити да се кука заиста активирала у фази коју сте очекивали. Скрипта прикачена на погрешну фазу, или она која никада није покренута јер директива показује на другу путању, даје тачно исти симптом као променљива која недостаје. Додајте намерну линију ознаке на врх скрипте и потврдите да се појављује пре него што проверите било шта друго. Једна линија са временском ознаком у дневнику раздваја „никад није покренута“ од „покренута без вредности“.
Затим потврдите који интерпретатор и коју конфигурациону датотеку тај позив користи. Мењање PHP конфигурације за веб сервер не мења ништа код CLI процеса који покрене OpenVPN, и оба могу да учитају сасвим различите php.ini датотеке.
Зашто празан $_ENV ништа не доказује
PHP референца за getenv описује директно читање окружења процеса, које враћа false када имена нема. Суперглобална $_ENV се попуњава одвојено, а директива variables_order одлучује које ће се суперглобалне попунити.
Ако та директива изостави E, $_ENV остаје празна без обзира на то шта окружење садржи. Код који је индексира тада пријављује променљиву која недостаје, а која је заправо присутна, и истрага иде према OpenVPN-у док је одговор у php.ini. Проверите директиву посебно за CLI конфигурацију, не за веб сервер.
Читање помоћу getenv избегава целу ову забуну, а омотна скрипта која чисти окружење пре позивања интерпретатора враћа је у другом облику.
Чувајте повезаност, а не ажурирање реда
Одлучите која вредност треба запису пре него што га упишете. Ако је циљ да се забележи одакле је сесија дошла, сачувајте спољну крајњу тачку и означите је као посматрање. Ако је циљ да се сесија повеже с адресом тунела за време трајања везе, сачувајте адресу базена и вежите је за сесију.
Ажурирајте по аутентификованом идентитету и тренутној сесији, а не по сваком реду који дели адресу тунела, јер се адресе базена користе поново и касни догађај прекида може иначе да препише податке новије везе. Обрађујте IPv6 експлицитно уместо да тихо уписујете само IPv4 вредност. Ред са NULL спољном адресом бољи је од реда са погрешном, јер је први видљиво непотпун.
Вежите упис за идентификатор сесије који OpenVPN даје, тако да поновно повезивање створи нови запис уместо да уређује стари. Користите параметризоване наредбе и налог са само оним дозволама које операција тражи. Кука ради са овлашћењима демона, па је непажљив упит шири проблем од погрешне линије дневника.
Дијагностикујте без избацивања окружења
Бележите која су имена била присутна, која фаза се извршила и који је интерпретатор коришћен. Не штампајте цело окружење, јер процес куке може да наследи неповезане вредности које не би требало да заврше у датотеци дневника.
Проверите једну везу од почетка до краја: прочитајте спољну крајњу тачку, прочитајте додељену адресу и потврдите обе према сопственом виђењу те сесије на серверу. Кад је пар потврђен за једног клијента, повезаности се може веровати и другде.