Ці дабярэцца скрыпт-хук да іншага боку тунеля, залежыць ад трох умоў: да якой падзеі ён прывязаны, ці 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, затым шукайце памылку правоў або кантэксту, а не тайм-аўт злучэння. Адключэнне пясочніцы павінна быць апошнім крокам, а не першым.

Збой жыццёвага цыкла выглядае інакш: хук стартуе, памочнік працуе, а сокета проста яшчэ няма. Запішыце радок з адзнакай часу з самога хука, адключыцеся і падключыцеся зноў, прачытайце падзеі па парадку. Калі памочніку сапраўды патрэбны тунель, няхай ён апытвае гатоўнасць, а не спіць фіксаваны час.

Тры палі робяць наступную справаздачу карыснай: які хук працаваў, які рахунак выкарыстоўваў і дзе спыніўся. Без іх кожнае наступнае расследаванне пачынаецца спачатку.

Падобныя артыкулы