Кезде client-connect скрипті нөлден өзге кодпен шықса, OpenVPN клиентті қабылдамайды, ал операторлар әдетте сәйкес client-disconnect скрипті бәрін реттейді деп ойлайды. Көбінесе ол мүлдем іске қосылмайды, өйткені disconnect өңдеуі connect кезеңінің нені аяқтай алғанына тәуелді. Бас тарту мен қайтаруды бір механизм деп қарау — сәтсіз кіруді ағып кеткен firewall ережесіне немесе иесіз жазбаға айналдыратын нәрсе. Бұлар екі бөлек міндеттеме, және олардың тек біреуі ғана автоматты. Серверді күй қалдырды деп кінәламас бұрын hook-тың өз шығу жолын оқыңыз.

Нөлден өзге шығу клиентті қабылдамайды; ол сіздің жұмысыңызды қайтармайды

client-connect шығу мәртебесі — қабылдау шешімі. Нөл қабылдау дегенді білдіреді, қалғанының бәрі инстанцияны толық орнықпай тұрып бұзу дегенді білдіреді. Бұл шартта скриптің сыртқы әлемге не істеп қойғанын тексеретін ештеңе жоқ. Егер скрипт iptables ережесін қосса, жол жазса немесе санауышты көбейтсе, бұл өзгерістер бас тартудан кейін де сақталады.

Дәл осы асимметрия плагиндерге де қатысты, онда бір инстанция үшін бірнеше connect функциясы іске қосылуы мүмкін. Кейінгі сәтсіздік бұрынғы сәттілікті кері күшпен жоймайды, ал бұрынғы функцияның бауырлас функция сәтсіз аяқталғанын білуге жолы жоқ.

Бас тарту автоматты, тазалау олай емес

OpenVPN 2.6 нұсқаулығы client-disconnect өңдеуін алдыңғы connect өңдеуінің сәтті болуына байланыстырады. Құжатталған ерекшелік каскадты тізбектерді қамтиды: егер бір connect қадамы әлдеқашан сәттілік қайтарса, инстанция бұзылған кезде сәйкес disconnect қадамдары бәрібір орындалады, тіпті кейінгі connect қадамы сәтсіз болса да. Бұл ерекшелік тар және қанша callback конфигурацияланғанына тәуелді, сондықтан бір shell скриптін сынау тізбек туралы ештеңе айтпайды.

Дизайн жасамас бұрын нақты конфигурацияны картаға түсіріңіз: қай скрипт, қай плагин және қандай ретпен іске қосылады. Төмендегі кесте жартылай біткен орнатудың не қалдыратынын тізімдейді.

What the hook did before failingWhat the client seesWhat stays behind
Created a firewall entryA rejection, with no tunnelA rule matching an address nobody owns
Wrote a state rowA rejection, with no tunnelA record of a session that never started
Allocated a tunnel addressA rejection, with no tunnelAn address marked busy until something releases it

Әр жол клиент үшін бірдей және хост үшін өзгеше аяқталады. Клиент олардың қайсысы болғанын біле алмайды, сондықтан hook сәтсіздік мәртебесін қайтармас бұрын істегенін қайтаруы керек.

Сәтсіз болған скрипттің ішінде өтемақы жасаңыз

Ортақ күйге қол тигізбес бұрын мүмкіннің бәрін тексеріңіз: сертификат өрістерін, мекенжайдың қолжетімділігін, клиент жататын топты. Ең арзан бас тарту — кез келген бөлуге дейін болатын бас тарту. Орнату бірнеше сыртқы операцияны қамтығанда, қайсысы аяқталғанын жазып отырыңыз және сәтсіздік мәртебесін қайтармас бұрын оларды кері тәртіппен қайтарыңыз.

Нақты жағдай: скрипт әр клиент үшін firewall жазбасын жасайды, содан кейін оны сипаттайтын күй жолын жазуға сәтсіздік жасайды. Сәтсіз тармақ жаңа ғана жасаған жазбаны жоюы керек, содан кейін нөлден өзге кодпен шығуы керек. Ешқашан жоспарланбауы мүмкін disconnect оқиғасын күту — ереженің өзі арналған сеанстан ұзақ өмір сүруінің жолы.

Өтемақыны идемпотентті және иесі бар етіп жасаңыз

Тазалау екі рет іске қосуға қауіпсіз болуы және нені жоя алатыны туралы дәл болуы керек. Бұрынғы әрекеттің кеш оқиғасы жаңарақ сеанстың бөлінуін тек екеуінің ортақ аты немесе қайта өңделген туннель мекенжайы бар деген себеппен жоймауы керек. Нақты дескрипторды немесе операция идентификаторын ресурспен бірге жазып, атаумен емес, сол кілтпен жойыңыз. Дерекқор транзакциялары тек дерекқордың өз өзгерістерінде көмектеседі; сол шекарадан тыс firewall ережесі айқын өтемақы қадамын талап етеді.

Процесс өзгеріс пен тазалау арасында өлуі мүмкін деп есептеңіз және сыртқы күйді қабылданған клиенттер тізімімен кесте бойынша салыстыратын келістіруші қосыңыз.

Шынымен ерекшеленетін үш жолды сынаңыз

Үш жағдайды үйреніңіз: ештеңе бөлінбей тұрып бас тарту, ішінара бөлуден кейінгі бас тарту және кейін аяқталатын қалыпты қабылданған сеанс. Бұл үшеуі әртүрлі журнал жолдарын және әртүрлі қалдықтарды береді. Әрқайсысынан кейін сыртқы күйді тексеріңіз, тек клиенттің сәтсіздік хабарламасын ғана емес, өйткені үшеуінің екеуінде клиенттің сәтсіздігі күтілетін нәтиже.

hook кезеңін, шығу мәртебесін және не бөлінгенін немесе босатылғанын тіркеңіз, тіркелгі деректерінсіз. Өзі жасаған ресурсты атайтын hook журналы — ағып кеткен ережені алты айдан кейін табуға мүмкіндік беретін нәрсе.

Қатысты мақалалар