Як вымераць час працы кліента OpenVPN з дапамогай хукаў up і down
У OpenVPN няма лічыльніка часу працы. Захавайце адбітак эпохі з хука up, ачысціце яго на down, адніміце і трымайце дакладным паміж перазапускамі і асобнікамі.
Панэль кіравання запытвае лік, колькі доўжыцца злучэнне, а OpenVPN яго не дае. Кліент ведае, калі яго тунель падняўся, але толькі калі нешта запіша гэты момант да страты стану сеанса. Падтрыманае месца — хук up, а значэнне, якое варта захоўваць, — сырая секунда эпохі, а не адфарматаваны радок. Усё далейшае — арыфметыка, плюс некалькі правілаў парадку, якія вырашаюць, ці застанецца лік дакладным.
Пераканайцеся, што хукі сапраўды запускаюцца
Дакажыце, што хук спрацоўвае, перш чым нешта на ім будаваць. Мінімальная канфігурацыя кліента патрабуе script-security 2 разам з відавочнымі up і down шляхамі; без радка бяспекі OpenVPN адмаўляецца выконваць скрыпт і ясна пра гэта гаворыць. Дадайце up-restart і down-pre адначасова, каб шляхі перазапуску і сыходу паводзілі сябе перадбачна.
Зрабіце першую версію хука такой, каб ён дапісваў сваё асяроддзе ў файл і больш нічога не рабіў. Так вы ўбачыце імёны зменных, якія ваш збор фактычна экспартуе, напрыклад dev і script_type, замест тых, што вы памятаеце з іншай версіі. Запусціце адно злучэнне і адключэнне, потым прачытайце файл. Калі нічога не з'явілася, спыніцеся тут, бо схема з адбіткам часу на хуку, які ніколі не запускаецца, будзе выглядаць як збой маніторынгу тыднямі.
Праверце, ад імя якога карыстальніка працуе хук. Калі user і group зададзеныя, OpenVPN скідвае правы перад запускам скрыптоў, таму каталог, у які можа пісаць root, можа быць зачынены для хука. Выбірайце шлях з пункту гледжання службы, а не вашай абалонкі.
Запішыце адно значэнне эпохі і ачысціце яго свядома
Хуку up патрэбен адзін радок, date +%s > /run/openvpn-client.started, з шляхам, змененым для кожнага асобніка. Значэнне эпохі пазбаўляе ад пытанняў мовы, часавага пояса і фармату пазней, і гэта той самы лік, які агент маніторынгу можа параўнаць са сваім гадзіннікам.
Ачыстка важная не менш за запіс. Хук down павінен ачысціць або выдаліць файл, а down-pre робіць гэта да закрыцця інтэрфейса, што прыбірае акно, калі файл апісвае тунель, якога ўжо няма. up-restart затым абнаўляе адбітак пры ўнутраным перазапуску, а не пакідае зыходнае значэнне на месцы. Без гэтай пары перазапуск пасля тайм-аўту ping дае лік, які ўвесь час расце, пакуль тунель пераўсталёўваецца.
Выберыце месца з правільным тэрмінам жыцця. Файл у /run знікае пры перазагрузцы, што адпавядае рэчаіснасці, а файл у /tmp можа быць неспадзявана ачышчаны, і файл у каталогу канфігурацыі застаецца так, што ўводзіць у зман. Наладзьце правы так, каб чытаць яго маглі толькі карыстальнік службы і чытач маніторынгу.
Вылічвайце час працы, не давяраючы радкам журнала
Прачытайце захаваную секунду, прачытайце бягучую секунду, адніміце. Калі файл адсутнічае або пусты, сумленны адказ — актыўнага тунеля няма, а не тое, што час працы роўны нулю, бо гэтыя два станы павінны выклікаць розныя апавяшчэнні. Трымайце сырыя секунды ў нагрузцы маніторынгу, а дні і гадзіны фарматуйце на ўзроўні адлюстравання. Фарматавальнік, які акругляе ўнутры экспарцёра, выкідвае дакладнасць, якую нехта захоча падчас інцыдэнту.
Разбор адбіткаў часу журнала — спакуслівы кароткі шлях, і ён правальваецца трыма спосабамі: фармат залежыць ад зададзеных опцый, ратацыя выдаляе гісторыю, а перападлучэнні выглядаюць як асобныя сеансы, а не адзін безупынны тунель. Хук запісвае падзею адзін раз, у момант, калі яна адбываецца.
Калі праверка ідзе на іншым хосце, перадавайце адбітак часу, а не працягласць, каб чытач ужыў свой гадзіннік. Тады невялікі адмоўны вынік чытаецца як зрух гадзінніка, а не як зламаны хук.
Пакрыйце перападлучэнні, перазапускі і некалькі асобнікаў
Два тунелі на адным хосце патрабуюць двух файлаў, ключаваных па імені асобніка, якое служба ўжо выкарыстоўвае. Агульны шлях азначае, што найноўшае злучэнне перазапісвае час старту кожнага профілю, і сімптом — лік, які скача назад, калі стартуе другі тунель.
Паводзіны пры перападлучэнні вартыя асобнага тэсту, бо менавіта там праўдападобная схема ціха паведамляе няправільнае. Прымусьце перазапуск, скінуўшы партнёра або паслаўшы сігнал працэсу, потым параўнайце стан інтэрфейса з файлам. Адбітак часу павінен ссунуцца наперад у момант вяртання тунеля.
На баку сервера файл стану нясе значэнне connected-since для кожнага кліента, і яно адказвае на іншае пытанне: калі сервер апошні раз бачыў гэтага партнёра. Выкарыстоўвайце яго для перакрыжаванай праверкі, а не як замену, бо яно знікае разам з сеансам, які апісвае. Ні адно з вымярэнняў нічога не кажа пра здароўе праграмы за тунелем.
Правядзіце тры праверкі, якія ловяць памылкі парадку
Праверце звычайнае злучэнне, прымусовае перападлучэнне і чыстае спыненне, чытаючы спіс інтэрфейсаў і файл разам пасля кожнага. Адбітак, які застаўся пасля чыстага спынення, або файл, што сцвярджае тунель, якога няма ў спісе інтэрфейсаў, паказвае прама на парадак хукаў. Выконвайце праверкі ад імя карыстальніка службы і з шляхамі службы, бо абалонка root можа бачыць іншы файл і даць упэўнены няправільны адказ. Затым пакіньце павольны апытальнік чытаць файл і пераканайцеся, што ён ніколі ў яго не піша.
Апытанне кожныя шэсцьдзясят секунд пакрывае апавяшчэнні, і ніводзін хук не павінен разлічваць на тое, што гэты апытальнік жывы. Трымайце гэтыя дзве адказнасці асобна, і лік застанецца надзейным, калі любы бок пераразгорнуць.