C# OpenVPN күй бақылаушысы: сессияны қадағалаңыз, желілік картаны емес
NetworkAvailabilityChanged — VPN оқиғасы емес. Туннельге ие клиенттің күй ағынын оқып, ескірген тексерулерден қорғаныңыз және әр қосылым бойынша дайындықты жариялаңыз.
Туннель өліп жатқанда да қолданбаңыз жұмысын жалғастырады. Wi-Fi әлі қосулы, интернет әлі жауап береді, ал қолданба тәуелді жеке API қолжетімсіз болды. Адамдар мұнда әдетте жүгінетін .NET оқиғасы, NetworkAvailabilityChanged, бұл жағдайды мүлдем сипаттамайды. Ол машинаның жиынтық күйінің өзгеруін хабарлайды және бұл күй VPN ажыратылып, қайта қосылған кезде де шын болып қала алады. Бақылаушы туннельге ие клиентті қадағалауы керек, желілік стектің ол туралы қорытындысын емес.
Қолжетімділік — жиынтық шама, сіздің туннеліңіз емес
NetworkAvailabilityChanged машинаның жиынтық қолжетімділік жауабы өзгергенде іске қосылады және ол жауап loopback немесе туннельден басқа кез келген белсенді интерфейсті санайды.
Wi-Fi қосулы кезде VPN құлауы ол өлшейтін нәрсенің ешбірін өзгертпейді, сондықтан оқиға сізді алаңдататын дәл сол ақау кезінде үнсіз қала алады.
Күй ағыны туннельге ие клиентке тиесілі
Қайсы компонент қосылымға ие екенін анықтаңыз: OpenVPN GUI немесе қызметі, OpenVPN Connect, немесе қолданбаңыз іске қосып, басқаратын процесс. Бұлар — қолдау көрсетілетін интерфейстері әртүрлі түрлі иелер, және бақылаушы орналастыруға сәйкес келетінін пайдалануы керек. Сізге интеграциялауға рұқсат етілген OpenVPN процесі үшін басқару интерфейсі ағымдағы күйді, тарихты және нақты уақыт хабарламаларын хабарлайды. Локализацияланған GUI жазуынан connected сөзін іздеудің орнына құжатталған құрылымдық хабарламаларды талдаңыз.
Басқару арнасы — артықшылықты басқару беті, сондықтан жаңа тыңдаушы ашпаңыз және GUI-мен ол қазірдің өзінде ұстаған арна үшін таласпаңыз.
Буын қорғаушылары ескірген нәтижелерді тоқтатады
Әр байқау белгілі бір қосылым әрекетіне жатады. Жаңа әрекет басталғанда, арна жоғалғанда және клиент шығуды хабарлағанда буын санауышын арттырыңыз.
A қосылымы кезінде басталған тексеруді қарастырайық. Туннель құлайды, B қосылымы басталады, содан кейін A-ның кешіктірілген HTTP сәттілігі келеді. Қорғаушысыз сол ескі нәтиже B әлі аутентификациядан өтіп жатқанда дисплейді жасыл етеді. Болдырмау бос жұмысты азайтады, ал буын тексерісі ескірген аяқталудың ағымдағы күйге айналуына жол бермейтін нәрсе:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
UI жіберілісінің айналасында да сол ережені қолданыңыз, өйткені маршалданған жаңарту буын ілгерілегеннен кейін келуі мүмкін.
Инициализация мен қайта қосылу — бір өмірлік цикл
Алғашқы қосылуды, қайта қосылуды және арнаның жоғалуын бір ережелер жиынтығымен бір өмірлік цикл ретінде қарастырыңыз:
- Интерфейс рұқсат ететін жерде ағымдағы күйді оқып, хабарламаларға бір қадамда жазылыңыз.
- Әр байқауды қосылым сәйкестігімен және буынмен белгілеңіз.
- Қайта қосылуда, шығуда немесе жоғалған байқау арнасында дайындықты жарамсыз етіңіз.
- Жеке ресурсты тек иесі инициализацияның аяқталғанын хабарлағаннан кейін тексеріңіз.
- Тек ағымдағы буынға әлі тиесілі нәтижелерді жариялаңыз.
Жоғалған арна — белгісіз, ажыратылған емес. Белгісізді хабарлау дәлелдей алмайтын ажыратуды хабарлаудан адалдау және қайта әрекет логикасының болжамға сүйенуіне жол бермейді.
Дәлелдерді хабарлаңыз, логикалық мәнді емес
Аталған сессия күйі мен ресурс дайындығын жеке мәндер ретінде қайтарыңыз, әрқайсысы жасымен. Бірдеңе шешуі керек тұтынушы соңғы сәтті тексерудің қырық секунд жаста екенін көре алады, бұл жаңа ақпараттан өзгеше ақпарат.
Ашық IP іздеу жеке API қажетті маршрутты пайдаланғанының дәлелі емес, сондықтан оны солай етіп ұсынбаңыз.
Орындауды бақылаушының сыртында ұстаңыз
Кері шақыру фактіден кейін орындалады. Ол оқиға мен өңдеуші арасында машинадан бірде-бір пакет шықпағанына кепілдік бере алмайды. Егер дизайн блоктауды талап етсе, оны желілік саясат қамтамасыз етуі керек, ал бақылаушының міндеті — дәлелдерді шақырушыға түсіндіру. Екеуін араластыру логикалық мән ұстағаны үшін өзін фаервол деп санайтын код тудырады. Орындау қабатын зеріктіретін және тексерілетін күйде ұстаңыз, ал бақылаушы оқырман болып қалсын.
Сонда UI сұрағы қарапайым болады: белгілі нәрсені жасымен көрсетіңіз және белгісіз болса, белгісіз деп айтыңыз.