OpenVPN uruchamia się przy logowaniu, ale nie przy starcie systemu Windows?
Skrót w folderze autostartu uruchamia aplikację pulpitu, a nie usługę automatyczną. Sprawdź, który profil czyta właściciel, zanim przeniesiesz pliki.
Tunele, które pojawiają się dopiero po zalogowaniu się kogoś, są zwykle uruchamiane przez sesję tej osoby, a nie przez usługę automatyczną. Zwykłym winowajcą jest skrót autostartu, który uruchamia openvpn-gui.exe, i nie jest to zepsuta instalacja. Skrót uruchamia aplikację pulpitu w sesji użytkownika, z profilem tego użytkownika, magazynami certyfikatów tego użytkownika i zdolnością tego użytkownika do odpowiedzi na monit. Nic z tego nie czyni połączenia niezależnym od zalogowanego człowieka, a właśnie tego wymaga tunel przed logowaniem.
Objaw ma zwykle trzy przyczyny
Trzy wzorce wyglądają z zewnątrz tak samo i mają różne rozwiązania. Pierwszy to właściciel wykonania będący sesją użytkownika, a nie usługą, czyli przypadek skrótu autostartu. Drugi to profil, który znajduje się tam, gdzie usługa nie zagląda, więc usługa startuje, nic nie znajduje i czysto kończy pracę. Trzeci to profil, który usługa znajduje i uruchamia, ale którego dane logowania wymagają interakcji, jakiej żadna usługa nie może zapewnić.
Ustalenie, który przypadek zachodzi, wymaga dwóch odczytów: co usługa jest skonfigurowana uruchamiać i jakie pliki może widzieć. Oba to po jednym poleceniu i żadne nie zakłóca działającego połączenia.
Co usługa automatyczna faktycznie czyta
Usługa automatyczna Community to nakładka, która skanuje skonfigurowany katalog autostartu, zwykle config-auto w instalacji, i uruchamia proces OpenVPN dla każdego pasującego profilu, który znajdzie. Profil widoczny w menu GUI użytkownika znajduje się natomiast pod profilem roamingowym tego użytkownika, w katalogu, którego konto usługi nie czyta. Przewodnik po usłudze Windows opisuje to wykrywanie i warto go przeczytać przed czymkolwiek kopiowaniem, ponieważ katalog docelowy jest właściwością instalacji, a nie stałą konwencją. Dlatego skopiowanie pliku do folderu GUI niczego nie zmienia dla usługi, a skopiowanie go do każdego folderu o nazwie config tworzy duplikaty zamiast rozwiązania.
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'
Ostatnie polecenie wylicza, co nakładka faktycznie zobaczy, co jest najszybszym sposobem potwierdzenia, że profil jest w złym miejscu. Druga linia pokazuje też konto, na którym działa usługa, a to konto decyduje, które ścieżki plików i magazyny certyfikatów są w ogóle osiągalne.
Dlaczego logowanie na pulpicie działa, a start przy rozruchu nie
Sukces na pulpicie może długo ukrywać zależność od danych wejściowych. GUI może zebrać frazę hasła klucza, hasło konta lub drugi czynnik w oknie dialogowym, ponieważ działa w sesji interaktywnej z widocznym pulpitem. Usługa działa w sesji bez pulpitu, więc prośba o dane wejściowe nie ma gdzie się pojawić, a połączenie zawodzi po przekroczeniu limitu czasu, który zupełnie nie przypomina problemu z danymi logowania.
Dostęp do plików podlega tej samej zasadzie. Klucz prywatny przechowywany w profilu użytkownika lub certyfikat w osobistym magazynie użytkownika nie jest dostępny dla usługi działającej jako maszyna. Porównaj ścieżki bezwzględne, uprawnienia i wybór certyfikatu dokonywany przez każdą stronę, zamiast zakładać, że ten sam plik profilu oznacza to samo środowisko.
Zaplanowane zadanie ustawione do uruchamiania niezależnie od tego, czy użytkownik jest zalogowany, dziedziczy podobne ograniczenie. Może z powodzeniem uruchomić plik wykonywalny GUI i mimo to utworzyć proces, który nigdy nie uzyska danych logowania, więc obecność procesu w menedżerze zadań nie jest dowodem działającego tunelu.
Wybierz jednego właściciela i przetestuj rzeczywisty cykl życia
W przypadku połączenia należącego do zalogowanej osoby użyj obsługiwanego przez GUI zachowania autostartu i pozostaw usługę poza nim. W przypadku tunelu, który musi istnieć przed zalogowaniem się kogokolwiek, skonfiguruj usługę, umieść profil tam, gdzie czyta go nakładka, i użyj obsługiwanego mechanizmu danych logowania bez nadzoru, takiego jak klucz bez interaktywnej frazy hasła lub udokumentowany plik danych logowania.
Get-Content 'C:\Program Files\OpenVPN\log\openvpn.log' -Tail 40
Get-WinEvent -LogName Application -MaxEvents 20 | Where-Object ProviderName -like '*OpenVPN*'
Przetestuj cykl życia, który ma znaczenie: ponowny rozruch, gdy nikt się nie loguje, a następnie ponowne połączenie po zmianie sieci. Utrzymuj jednego właściciela połączenia, ponieważ dwa konkurujące mechanizmy autostartu zwykle tworzą dwie instancje walczące o te same trasy i tę samą sesję serwera, co jest trudniejsze do zdiagnozowania niż każdy mechanizm osobno.