Дали скриптата-кука ќе стигне до другата страна на тунелот зависи од три услови: на кој настан е прикачена, дали 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, потоа барајте грешка во дозвола или контекст, а не тајмаут на врската. Исклучувањето на песочникот треба да биде последниот чекор, не првиот.

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

Три полиња ја прават следната извештај корисен: која кука се изврши, кој профил го користеше и каде запре. Без нив секое подоцнежно истражување започнува од почеток.

Поврзани статии