Илмек скрипти туннелдин аркы тарабына жетеби, ал үч шартка байланыштуу: ал кайсы окуяга байланган, скрипт аткарылып жатканда OpenVPN дагы өзүнүн ишке кирүү тартибинин ичиндеби, жана жумуш ошол тартиптен бөлүнгөнбү. Скрипттердин көбү үчүнчүсүндө ишке ашпайт. Уйку кошуу жашоо циклинин маселесин убакыт маселеси катары карайт жана адаштырууга жеткидей көп иштейт.

Алгач окуяны, анан жумушту кийинкиге калтыруу механизмин, анан кийинкиге калтырылган жумуш аткарылуучу жерди чечиңиз. Бул үч чечим көз карандысыз, жана аларды аралаштыруу эки саптуу илмекти бүт түшкө айландырат.

Эмне үчүн илмек өзүн күтүп турган туннелди күтөт

OpenVPN илмектерин пакеттерди жылдырган ошол эле процесстин ичинде синхрондуу түрдө чакырат. up tun же tap түзмөгү бар болгондо, бирок эч кандай маршрут кошулганга чейин ишке кирет, ал эми route-up маршруттардан кийин ишке кирет; бул учурлардын экөө тең каршы тарап жооп берет деп убада кылбайт. Кайсы бир илмектин скрипти дагы аткарылып жатканда, демон жөнөтпөйт, ошондуктан трафиктин туннелден өтүшүн күткөн буйрук өзүн күтүп турган туннелди күтөт. Ушул айлампа күтүү кол менен ишке киргизүү өтүп, илмектин убактысы бүтүшүнүн себеби.

Ачык жамаа, башкача айтканда бир нече секунд уйку, кээде иштейт, анткени алыскы тарап өзү көтөрүлдү, уйку бир нерсени оңдогондуктан эмес. Даярдыкты сураган жардамчы башка жооп: илмек кайтат, жөнөтүү башталат, жана жардамчы керектүү нерсени ал чын эле бар болгондо алат.

Илмекти ыңгайлуулук боюнча эмес, окуя боюнча тандаңыз

up-ни эч нерсе түзмөк керек жумушка, route-up-ти маршруттар керек жумушка байланыштырып, client-connect менен client-disconnect-ти сервер тарабындагы ар бир кардар үчүн тапшырмаларга калтырыңыз. Ажыратуу учурундагы тазалоо эки жолу аткарылууга чыдашы керек, анткени туруктуу интерфейс аркылуу кайра кошулуу толук кайра ишке киргизүүнүн тартибин аткарбайт. Серверде client-connect демон ишке киргенде эмес, кардар аутентификацияланганда ишке кирет, аны логиканы ошол жакка өткөрүүдөн мурун ырастоо керек. Эгер жумуш жалгыз байланышка эмес, кызматтын жашоо циклине таандык болсо, systemd бирдиги кайсы болбосун илмектен жакшыраак жай.

Илмек буйруктарын демон түздөн-түз аткарат, ортосунда кабык жок, ошондуктан up сабындагы ifconfig_remote сөзмө-сөз текст катары келет. Буйрукту ачык кабыкка ороп коюңуз, же логиканы чөйрөнү окуган скриптте кармаңыз. ipchange өзүнүн аргументтерин кошкон бир директива: ал буйрукка даректи жана портту берет, ошондуктан эч бирине жазылбаган скрипт эки күтүлбөгөн аргументти көрөт.

Жумушту бөлүүнүн үч жолу

Биринчи вариант — жардамчыны илмектин ичинен фонго жөнөтүү: аны setsid же systemd-run --scope аркылуу ишке киргизип, мурасталган дескрипторлерди жабып, дароо нөл менен чыгыңыз. Экинчиси — илмек кичине күй файлын жазып, systemd таймери же жол бирдиги ага аракет кылсын, бул илмекти жөнөкөй кармап, кайталоо саясатын журналдары бар жерге коёт. Үчүнчүсү — илмектен толук баш тартып, жумушту VPN кызматынан кийин реттелген бирдикке өткөрүү; жумуш такыр байланышка тиешеси жок болсо, туура жооп ушул. Үчөө тең бир эрежени бөлүшөт: илмек туннел керек болоордон мурун кайтышы керек.

Кайсынын тандасаңыз да, жардамчыны идемпотенттик жана байкалуучу кылыңыз. Эки кабатташкан чакыруу бир кайтарылбас аракетти эки жолу аткарбашы керек, ал эми ишке ашпаган жардамчы адам окуй алган нерсени калтырышы керек.

Sandbox каталарын жашоо циклинин каталарынан ажыратыңыз

Скрипт root чакыруусунан аткарылып, кызмат катары ишке ашпаса, себеби адатта тармак эмес, sandbox. Чектөөчү ProtectHome, текстти окууга гана арналган ProtectSystem же жок болгон жумуш каталогу скриптти же анын дайындарын жеткиликсиз кылып коюшу мүмкүн, ал эми SELinux хостунда файлга аткарууга уруксат берген контекст да керек. Бирдикти systemctl cat openvpn-server@server аркылуу, журналды journalctl -u openvpn-server@server -n 80 аркылуу окуңуз, анан туташуу тайм-аутын эмес, уруксат же контекст катасын издеңиз. Sandbox-ту өчүрүү биринчи эмес, акыркы кадам болушу керек.

Жашоо циклинин катасы башкача көрүнөт: илмек башталат, жардамчы аткарылат, ал эми сокет дагы жок. Илмектин өзүнөн убакыт белгиси бар сап жазыңыз, ажыратып кайра кошулуңуз жана окуяларды тартиби менен окуңуз. Жардамчыга туннел чын эле керек болсо, белгиленген убакыт укташтын ордуна даярдыкты сурасын.

Үч талаа кийинки отчётту пайдалуу кылат: кайсы илмек аткарылды, кайсы эсепти колдонду жана кайда токтоду. Аларсыз ар бир кийинки тергөө кайрадан башталат.

Тектеш макалалар