Покрените задатке после VPN-а из диспечера, а не из if-up
Стара кука интерфејса неће видети VPN везу. Упарите vpn-up са UUID-ом профила, учините задатак поновљивим и планирајте прекид који се никад не догоди.
Скрипта која мора да се покрене након подизања VPN-а треба догађај од компоненте која поседује везу. Датотека стављена у стари директоријум мрежних кука није повратни позив за сваки VPN који NetworkManager, pppd или самостални процес OpenVPN могу да створе. Сваки од тих власника пријављује други догађај са другим окружењем, па се власник мора идентификовати пре него што се кука изабере. Иначе је скрипта исправна и једноставно се никад не покреће.
За VPN којим управља NetworkManager, диспечер је право место, а vpn-up је права радња.
Користите vpn-up, а не догађај интерфејса
Диспечер разликује up од vpn-up. Први пријављује активиран интерфејс; други пријављује активирану VPN везу. Подизање Wi-Fi мреже значи само да основни линк постоји; тунел можда још преговара или се можда никад не аутентификује.
Скрипта прима интерфејс и радњу, док детаљи везе долазе кроз окружење, укључујући UUID профила и VPN IP интерфејс. Читајте те променљиве уместо да идентитет закључујете из назива уређаја.
Ограничите подударање на једну везу
Упарите по UUID-у везе или другом идентитету који диспечер даје, а не по префиксу tun или ppp0. Називи интерфејса нису стабилни, истовремено може постојати више од једног тунела, а два профила могу носити исти приказани назив. Подударање по префиксу tun значи да ће се скрипта на крају покренути за везу коју нико није намеравао да дира. Може се покренути и двапут за један профил када поновно повезивање поново изгради уређај.
Учините задатак идемпотентним. Повратни позив који при сваком позиву додаје руту на крају напуни табелу дупликатима, а друга копија је она која квари рутирање.
Знајте шта активација не доказује
vpn-pre-up се извршава пре него што NetworkManager пријави да је VPN потпуно активиран, а менаџер чека те скрипте. Користите блокирајућу фазу само када задатак заиста припада тамо, јер спора провера одлаже активацију коју свака друга компонента чека да види.
Присуство рута не доказује да апликација слуша, да се приватно име разрешава или да постоји корисничка сесија. Проверите то одвојено са ограниченим временским роком и пријавите који слој је заказао уместо да понављате цео ланац.
Поштујте контекст у ком се скрипта извршава
Скрипте диспечера раде као root, изван сваке корисничке сесије. Не претпостављајте да су окружење пријављеног корисника, графичка сесија или откључани привезак с кључевима доступни. Нико не би требало на недостатак контекста радне површине да одговори тако што ће сваки акредитив учинити читљивим за сваки процес. Држите рад корисничке сесије у корисничкој услузи или помоћнику сесије коме повратни позив може да сигнализира без издавања за корисника.
Власништво и дозволе на скрипти су такође важни. Датотека коју извршава root и коју било који корисник може заменити је пут за ескалацију привилегија и налаз независан од тога да ли је VPN логика исправна.
Планирајте прекид који се никад не догоди
NetworkManager документује да се vpn-pre-down не емитује за присилне прекиде као што су неочекивани прекид рада или губитак везе. Зато је чишћење изграђено само око мирног pre-down-а по конструкцији непотпуно. Свако дељено стање које скрипта мења треба другог власника који га може обновити након пада, а тај пут опоравка мора се тестирати, а не претпоставити.
Тестирајте куку нормалним повезивањем, поновним повезивањем, намерним прекидом и извученим каблом. Забележите UUID, радњу и интерфејс који се покренуо, без бележења тајни. Тај запис је једини поуздан доказ да је кука радила за везу коју сте намеравали и он чини следећу промену безбедном.