Туннели, которые появляются только после чьего-либо входа в систему, обычно запускаются сеансом этого человека, а не автоматической службой. Обычный виновник — ярлык в автозагрузке, который запускает openvpn-gui.exe, и это не сломанная установка. Ярлык запускает настольное приложение внутри пользовательского сеанса, с профилем этого пользователя, хранилищами сертификатов этого пользователя и способностью этого пользователя ответить на запрос. Ничто из этого не делает подключение независимым от вошедшего человека, а именно это и требуется туннелю до входа в систему.

У симптома обычно три причины

Три шаблона выглядят снаружи одинаково и имеют разные исправления. Первый — владелец выполнения, которым является пользовательский сеанс, а не служба, то есть случай ярлыка в автозагрузке. Второй — профиль, который находится там, куда служба не смотрит, поэтому служба запускается, ничего не находит и чисто завершается. Третий — профиль, который служба находит и запускает, но его учётные данные требуют взаимодействия, которого не может обеспечить ни одна служба.

Чтобы определить, какой случай применим, нужны два чтения: что служба настроена запускать и какие файлы она видит. Каждое — одна команда, и ни одно не нарушает работающее подключение.

Что на самом деле читает автоматическая служба

Автоматическая служба Community — это обёртка, которая сканирует настроенный каталог автозапуска, обычно config-auto в установке, и запускает процесс OpenVPN для каждого найденного подходящего профиля. Профиль, видимый в меню GUI пользователя, находится вместо этого в перемещаемом профиле этого пользователя, в каталоге, который учётная запись службы не читает. Руководство по службе Windows описывает это обнаружение, и его стоит прочитать перед копированием чего-либо, потому что целевой каталог — свойство установки, а не фиксированное соглашение. Поэтому копирование файла в папку GUI ничего не меняет для службы, а копирование его в каждую папку с именем config создаёт дубликаты вместо исправления.

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'

Последняя команда перечисляет то, что обёртка действительно увидит, — это самый быстрый способ убедиться, что профиль находится не там. Вторая строка также показывает учётную запись, от которой работает служба, и эта учётная запись решает, какие пути к файлам и хранилища сертификатов вообще доступны.

Почему вход на рабочем столе работает, а запуск при загрузке нет

Успех на рабочем столе может долго скрывать зависимость от ввода. GUI может собрать парольную фразу ключа, пароль учётной записи или второй фактор в диалоговом окне, потому что он работает в интерактивном сеансе с видимым рабочим столом. Служба работает в сеансе без рабочего стола, поэтому запросу на ввод негде появиться, и подключение обрывается после тайм-аута, который совсем не похож на проблему с учётными данными.

Доступ к файлам подчиняется тому же правилу. Закрытый ключ, хранящийся в профиле пользователя, или сертификат в личном хранилище пользователя, недоступны службе, работающей от имени машины. Сравнивайте абсолютные пути, разрешения и выбор сертификата каждой стороной, а не предполагайте, что один и тот же файл профиля означает одну и ту же среду.

Запланированная задача, настроенная на запуск независимо от того, вошёл пользователь или нет, наследует похожее ограничение. Она может успешно запустить исполняемый файл GUI и всё равно создать процесс, который так и не получит учётные данные, поэтому наличие процесса в диспетчере задач не является доказательством работающего туннеля.

Выберите одного владельца и проверьте реальный жизненный цикл

Для подключения, принадлежащего вошедшему человеку, используйте поддерживаемое GUI поведение автозапуска и оставьте службу в стороне. Для туннеля, который должен существовать до чьего-либо входа, настройте службу, разместите профиль там, где его читает обёртка, и используйте поддерживаемый механизм учётных данных без участия человека, например ключ без интерактивной парольной фразы или документированный файл учётных данных.

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

Проверьте жизненный цикл, который имеет значение: перезагрузку, когда никто не входит, а затем повторное подключение после смены сети. Держите одного владельца подключения, потому что два конкурирующих механизма автозапуска обычно создают два экземпляра, сражающихся за одни и те же маршруты и один и тот же сеанс сервера, что диагностировать сложнее, чем любой из механизмов по отдельности.

Похожие статьи