Да ли скрипта куке стиже на другу страну тунела зависи од три услова: на који догађај је везана, да ли је OpenVPN још унутар свог низа покретања када се скрипта извршава и да ли је посао одвојен од тог низа. Већина скрипти не успева на трећем. Додавање спавања третира проблем животног циклуса као проблем времена и ради тачно толико често да заведе.

Прво одлучите догађај, затим механизам одлагања посла, затим место на ком се одложени посао извршава. Те три одлуке су независне, а њихово мешање је разлог зашто од куке од два реда настане цело поподне.

Зашто кука чека тунел који чека њу

OpenVPN позива своје куке синхроно, унутар истог процеса који помера пакете. up се активира када уређај tun или tap постоји, али пре него што се дода било која рута, а route-up након рута; ниједан од тих тренутака не обећава да ће супротна страна одговорити. Док се скрипта било које куке још извршава, демон не прослеђује, па команда која очекује да саобраћај пређе тунел чека тунел који чека ту команду. То кружно чекање је разлог зашто ручно покретање пролази, а кука истекне.

Очигледна закрпа, спавање неколико секунди, понекад ради зато што се удаљена страна сама подигла, а не зато што је спавање нешто поправило. Помоћник који пита за спремност је други одговор: кука се враћа, прослеђивање почиње и помоћник добија оно што му треба када то заиста постоји.

Изаберите куку по догађају, не по удобности

Повежите up са послом ком треба само уређај, route-up са послом ком требају руте, а client-connect и client-disconnect сачувајте за задатке по клијенту на страни сервера. Чишћење при прекиду везе мора да поднесе двоструко извршавање, јер поновна повезивања преко трајног интерфејса не следе исти низ као потпуни рестарт. На серверу се client-connect активира када се клијент аутентификује, а не када демон стартује, што вреди потврдити пре него што се логика премести тамо. Ако посао припада животном циклусу услуге, а не једном споју, systemd јединица је бољи дом од било које куке.

Команде куке демон извршава директно, без љуске између, па ifconfig_remote у линији up стиже као дослован текст. Замотајте команду у експлицитну љуску или држите логику у скрипти која чита окружење. ipchange је једна директива која додаје сопствене аргументе: предаје команди адресу и порт, па скрипта написана ни за једну види два неочекивана.

Три начина да одвојите посао

Прва опција је да пошаљете помоћника у позадину из саме куке: покрените га са setsid или systemd-run --scope, затворите наследне дескрипторе и изађите одмах са нулом. Друга је да кука запише малу датотеку стања и да systemd тајмер или путна јединица делују на њу, што куку држи тривијалном и ставља политику понављања тамо где има дневника. Трећа је да потпуно напустите куку и преместите посао у јединицу поређану после VPN услуге, што је тачан одговор када посао уопште није по вези. Све три деле једно правило: кука мора да се врати пре него што јој затреба тунел.

Шта год изабрали, учините помоћника идемпотентним и видљивим. Два преклопљена позива не смеју исти неповратни поступак извршити двапут, а помоћник који падне мора да остави нешто што човек може да прочита.

Одвојте отказе пешчаника од отказа животног циклуса

Када се скрипта извршава из root позива и откаже као услуга, узрок је обично пешчаник, а не мрежа. Ограничавајући ProtectHome, само за читање ProtectSystem или радни директоријум који не постоји могу да оставе скрипту или њене податке недоступнима, а на SELinux домаћину датотеци треба и контекст који дозвољава извршавање. Прочитајте јединицу са systemctl cat openvpn-server@server и дневник са journalctl -u openvpn-server@server -n 80, затим тражите грешку дозволе или контекста, а не тајмаут везе. Искључивање пешчаника треба да буде последњи потез, не први.

Отказ животног циклуса изгледа другачије: кука почиње, помоћник ради, а сокет једноставно још није тамо. Запишите линију са временском ознаком из саме куке, прекините и поново се повежите, и читајте догађаје по реду. Када помоћнику заиста треба тунел, нека пита за спремност уместо да спава фиксни период.

Три поља чине следећи извештај корисним: која кука је радила, који налог је користила и где се зауставила. Без њих свака каснија истрага почиње испочетка.

Повезани чланци