Tuneliai, kurie atsiranda tik po to, kai kas nors prisijungia, paprastai paleidžiami to žmogaus sesijos, o ne automatinės tarnybos. Dažniausias kaltininkas yra paleidimo nuoroda, kuri paleidžia openvpn-gui.exe, ir tai nėra sugadinta diegimo versija. Nuoroda paleidžia darbalaukio programą naudotojo sesijos viduje su to naudotojo profiliu, to naudotojo sertifikatų saugyklomis ir to naudotojo galimybe atsakyti į užklausą. Niekas iš to nepadaro ryšio nepriklausomo nuo prisijungusio žmogaus, o būtent to reikia tuneliui iki prisijungimo.

Simptomas paprastai turi tris priežastis

Trys modeliai iš išorės atrodo vienodai, bet turi skirtingus sprendimus. Pirmasis — vykdymo savininkas, kuris yra naudotojo sesija, o ne tarnyba, tai yra paleidimo nuorodos atvejis. Antrasis — profilis, esantis ten, kur tarnyba nežiūri, todėl tarnyba paleidžiama, nieko neranda ir švariai baigia darbą. Trečiasis — profilis, kurį tarnyba randa ir paleidžia, bet jo prisijungimo duomenims reikia sąveikos, kurios jokia tarnyba negali suteikti.

Norint nustatyti, kuris atvejis galioja, reikia dviejų skaitinių: ką tarnyba sukonfigūruota vykdyti ir kokius failus ji gali matyti. Abu yra po vieną komandą, ir nė vienas netrukdo veikiančiam ryšiui.

Ką automatinė tarnyba iš tikrųjų skaito

Community automatinė tarnyba yra apvalkalas, kuris nuskaito sukonfigūruotą automatinio paleidimo katalogą, paprastai config-auto diegimo aplanke, ir paleidžia OpenVPN procesą kiekvienam atitinkančiam rastam profiliui. Profilis, matomas naudotojo GUI meniu, yra vietoj to to naudotojo klajoklio profilio viduje, kataloge, kurio tarnybos paskyra neskaito. „Windows“ tarnybos vadovas aprašo tą paiešką, ir verta jį perskaityti prieš ką nors kopijuojant, nes tikslinis katalogas yra diegimo savybė, o ne nustatyta konvencija. Todėl failo kopijavimas į GUI aplanką tarnybai nieko nekeičia, o jo kopijavimas į kiekvieną aplanką, pavadintą config, sukuria dublikatus, o ne sprendimą.

Get-Service OpenVPNService | Select-Object Status, StartType
Get-CimInstance Win32_Service | Where-Object Name -eq 'OpenVPNService' | Select-Object PathName, StartName
gci 'C:\Program Files\OpenVPN\config-auto'

Paskutinė komanda išvardija, ką apvalkalas iš tikrųjų matys, tai greičiausias būdas patvirtinti, kad profilis yra netinkamoje vietoje. Antroji eilutė taip pat rodo paskyrą, kuria veikia tarnyba, ir ta paskyra nusprendžia, kurie failų keliai ir sertifikatų saugyklos apskritai pasiekiami.

Kodėl prisijungimas prie darbalaukio veikia, o paleidimas įkrovimo metu ne

Sėkmė darbalaukyje gali ilgai slėpti priklausomybę nuo įvesties. GUI gali surinkti rakto slaptafrazę, paskyros slaptažodį ar antrąjį veiksnį dialoge, nes ji veikia interaktyvioje sesijoje su matomu darbalaukiu. Tarnyba veikia sesijoje be darbalaukio, todėl užklausa įvesti neturi kur pasirodyti, o ryšys nutrūksta po laiko limito, kuris visiškai neprimena prisijungimo duomenų problemos.

Prieiga prie failų vadovaujasi ta pačia taisykle. Privatus raktas, saugomas naudotojo profilyje, arba sertifikatas naudotojo asmeninėje saugykloje, nėra prieinamas tarnybai, veikiančiai kaip kompiuteris. Palyginkite absoliučius kelius, leidimus ir kiekvienos pusės atliekamą sertifikato pasirinkimą, užuot darę prielaidą, kad tas pats profilio failas reiškia tą pačią aplinką.

Suplanuota užduotis, nustatyta vykdyti neatsižvelgiant į tai, ar naudotojas prisijungęs, paveldi panašų apribojimą. Ji gali sėkmingai paleisti GUI vykdomąjį failą ir vis tiek sukurti procesą, kuris niekada negauna prisijungimo duomenų, todėl proceso buvimas užduočių tvarkyklėje nėra veikiančio tunelio įrodymas.

Pasirinkite vieną savininką ir išbandykite tikrąjį gyvavimo ciklą

Ryšiui, priklausančiam prisijungusiam asmeniui, naudokite GUI palaikomą automatinio paleidimo elgseną ir palikite tarnybą nuošalyje. Tuneliui, kuris turi egzistuoti prieš kam nors prisijungiant, sukonfigūruokite tarnybą, įdėkite profilį ten, kur jį skaito apvalkalas, ir naudokite palaikomą be priežiūros prisijungimo duomenų mechanizmą, pavyzdžiui, raktą be interaktyvios slaptafrazės arba dokumentuotą prisijungimo duomenų failą.

Get-Content 'C:\Program Files\OpenVPN\log\openvpn.log' -Tail 40
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object ProviderName -like '*OpenVPN*'

Išbandykite gyvavimo ciklą, kuris svarbus: perkrovimą, kai niekas neprisijungia, tada pakartotinį prisijungimą po tinklo pakeitimo. Ryšiui laikykitės vieno savininko, nes du konkuruojantys paleidimo mechanizmai paprastai sukuria du egzempliorius, kovojančius dėl tų pačių maršrutų ir tos pačios serverio sesijos, o tai diagnozuoti sunkiau nei bet kurį mechanizmą atskirai.

Susiję straipsniai