OpenVPN ілмек скрипті жаңа ғана құрған туннельді пайдалана ала ма?
OpenVPN ілмектерді өз іске қосылуының ішінде орындайды, сондықтан туннель қажет скрипт өзін күтіп тұрған туннельді күтеді. Жұмысты бөліп, ілмекті оқиға бойынша таңдаңыз.
Ілмек скрипті туннельдің арғы жағына жете ме, ол үш шартқа байланысты: ол қай оқиғаға байланған, скрипт орындалып жатқанда 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-ты өшіру бірінші емес, соңғы қадам болуы керек.
Өмірлік цикл ақауы басқаша көрінеді: ілмек басталады, көмекші орындалады, ал сокет әлі жоқ. Ілмектің өзінен уақыт белгісі бар жол жазыңыз, ажыратып қайта қосылыңыз және оқиғаларды ретімен оқыңыз. Көмекшіге туннель шынымен қажет болса, белгіленген уақыт ұйықтаудың орнына дайындықты сұрасын.
Үш өріс келесі есепті пайдалы етеді: қай ілмек орындалды, қай тіркелгіні пайдаланды және қайда тоқтады. Оларсыз әрбір кейінгі тергеу қайтадан басталады.