Привет. Я Саша Басун — системный администратор в «Петрович-Тех». Я уже писал на Хабре о пользовательских проблемах, и мне нравится автоматизировать такие задачи. В их решении есть своя магия.

Статья будет о возможностях донастройки FortiClient VPN под пользователя. Эту информацию также можно вытащить из документации — но парадокс в том, что для её чтения нужен работающий VPN.

Мы устанавливаем VPN-клиент в автоматическом режиме с нужными настройками. Через несколько секунд после подключения к серверу на рабочей станции должен запускаться определённый процесс. Ключевое слово — «должен»: он не всегда срабатывает как должно. Мне нужно было понять, в чём проблема, и найти решение для стабильного запуска.

Что из себя представляет FortiVPN Client

FortiClient VPN написан на фреймворке Electron, предназначенном для разработки настольных приложений с использованием HTML, CSS и JavaScript.

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

Если взглянуть на список настроек при создании подключения, то интерфейс там весьма минималистичен. А их на самом деле больше, просто перед этим придётся их включить или добавить руками.

Окно настроек подключения FortiClient VPN
Окно настроек подключения FortiClient VPN

Чтение документации и любопытство показали: остальные настройки для клиента прописаны в конфигурационном файле подключения. Во время импорта они конвертируются в ключи реестра со значениями:

  • DWORD — 32-х разрядное число

  • REG_SZ — строка

Часть этих ключей, например такие, как имя пользователя, шифруются.

Редактируем конфигурационный файл

При экспорте конфигурации подключения FortiClient предлагает сохранить файл с расширением .conf. Открываем его — и становится понятно, что это обыкновенный xml файл.

Файл конфигурации разбит по блокам и секциями, где есть:

  • Системные настройки

  • Настройки логов

  • Настройки поведения программы

  • Настройки подключения

  • Пользовательские настройки

Опций хватает, можно подкрутить многое, чего попросту нет в графической оболочке. Во время тестирования выяснилось, что на некоторых мобильных операторах при включенном ipv6 соединение не устанавливается. И здесь нам поможет параметр block_ipv6. Можно отключить этот протокол руками и в параметрах сетевой карты. И если надо даже задействовать скрипты, когда нужно это применить к десяткам и сотням пользователей. Но зачем мучиться, если в ПО и так есть готовое решение?

Также в FortiClient VPN можно исключить приложения: их трафик не будет перенаправляться в VPN-туннель. Или же прописать путь к прокси-серверу.

Все настройки я не тестировал, так как мне нужно было произвести настройки под определенную задачу. Могу только добавить, что какие-то из них будут работать только в платной версии. Да, у FortiClient VPN есть платная и бесплатная версия.

Что же мы можем сделать полезного, отредактировав файл конфигурации подключения? Давайте посмотрим.

Обновляем групповые политики, подключаем сетевой диск

Погружаемся в задачу. У нас есть пользователь, который удалённо работает на доменной рабочей станции. Ему нужно добавить VPN-подключение, чтобы после успешного соединения с сервером на его ПК обновились групповые политики и появился сетевой диск.

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

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

При подключении VPN служба «Диспетчер подключений удаленного доступа» (rasman) добавляла в журнал событий Windows записи с определённым ID:

  • 20267 — соединение установлено

  • 20268 — соединение разорвано

В планировщике заданий создавалась задача, которая запускала скрипт или команду, если в журнале событий появлялась запись с ID 20267. 

Можно ли сделать что-то подобное в FortiClient VPN? Можно!

В конфигурационном файле подключения есть блок <connection>, а в нём ещё два блока —  <on_connect> и <on_disconnect>. Из названий понятно, что в одной применяются настройки после подключения, в другой — после отключения.

<on_connect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[]]>
    </script>
  </script>
</on_connect>
<on_disconnect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[]]>
    </script>
  </script>
</on_disconnect>

Необходимые нам команды прописываются в <![CDATA[]]>. Обычно в XML файлах CDATA используется для информации, которая не должна анализироваться и разбираться XML парсером.

В этом месте работают привычные нам команды, которые мы прописываем в командной строке. Добавим сюда обновление групповых политик:

<on_connect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[
        gpupdate /force
      ]]>
    </script>
  </script>
</on_connect>

А если надо подключать и отключать сетевой диск, то так:

<on_connect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[
        net use U: \\Server\SharedFolder
      ]]>
    </script>
  </script>
</on_connect>
<on_disconnect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[
        net use U: /delete
      ]]>
    </script>
  </script>
</on_disconnect>

Команды выполняются построчно, потому описанные выше варианты можно объединить:

<on_connect>
    <script>
        <os>windows</os>
        <script>
            <![CDATA[
                gpupdate /force
                net use U: \\Server\SharedFolder
            ]]>
        </script>
    </script>
</on_connect>

Думаю, вы уже поняли, что сюда можно добавить запуск приложения или скрипта. Такие же возможности разработчики предусмотрели и в Linux, и в MacOS. 

Можно ли при подключении FortiClient VPN выполнять задачи из планировщика? Да. Для этого требуется, чтобы приложение отправляло записи в журнал событий. В Windows есть штатная команда eventcreate. Она позволяет администратору создать запись об особом событии в журнале событий. 

Запускаем командную строку от имени администратора и прописываем eventcreate со следующими аргументами:

eventcreate /T SUCCESS /ID 1 /L APPLICATION /SO FortiClient /D "FortiClient Welcome Event"
  • /T — тип записи (success — успех, error — ошибка)

  • /ID — код события (от 1 до 1000, дальше — зарезервировано системой)

  • /L — тип журнала (Application — журнал «Приложение», System — «Система»)

  • /SO — источник (если не указать, там будет использован источник по умолчанию) 

  • /D — описание события

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

<on_connect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[
        eventcreate /T SUCCESS /ID 267 /L APPLICATION /SO FortiClient /D "FortiClient VPN Connected"
      ]]>       
    </script>
  </script>
</on_connect>
<on_disconnect>
  <script>
    <os>windows</os>
    <script>
      <![CDATA[
        eventcreate /T SUCCESS /ID 268 /L APPLICATION /SO FortiClient /D "FortiClient VPN Disconnected"
      ]]>
    </script>
  </script>
</on_disconnect>

Сохраняем конфигурацию и импортируем в FortiClient VPN. После этого можно создавать задачу с триггером на определённое событие.

Ожидание и реальность

Я уже говорил, что секции в XML-файле конвертируются в ключи реестра со значениями. В этот момент я подумал: «Кайф! Экспортирую ветку реестра, где хранится информация о подключении, а затем буду импортировать в два клика».

Значения on_connect и on_disconnect тоже шифруются
Значения on_connect и on_disconnect тоже шифруются

Как оказалось, так работать не будет. На другом тестовом стенде процессы после установки соединения не запустились. Предполагаю, что некоторые значения конфигурации зашифровываются с привязкой к параметрам системы или оборудованию. Остаётся только импорт через сам клиент. 

Стоп! Импорт же у нас в графической оболочке не работает. Ну ничего, воспользуемся консолью.

"%ProgramFiles%\Fortinet\Forticlient\FCConfig.exe" -f D:\vpn.conf -o import -k YourPa$$word

В этом случае импорт производится корректно.

Итог

Как видим, FortiClient VPN способен запускать выполнение команд, скриптов и приложений после подключения к серверу и после отключения от него. С учётом того, что такая возможность в клиенте есть и на других операционных системах, это может помочь решить задачи различного типа.

Конечно же, не стоит пренебрегать безопасностью. При импорте значения команд и скриптов в реестре шифруются. Подобраться к ним или подменить значения злоумышленнику будет сложнее. Изменение параметров задания в планировщике может потребовать пароль от учётной записи. А вот подменить код в скрипте, который запускается из планировщика, труда не составит. Ему лучше назначить соответствующие права на запись.

Комментарии (10)


  1. Vdm_ro
    15.11.2024 09:20

    Для обновления групповых политик учетка админа компьютера обязательна? (вроде была нужна, может есть обходной маневр - не в курсе)

    Если обязательно - мы запускаем ВПН клиент от имени админа компа и даем возможность запустить любой скрипт/команду тому, кто добрался до конфигурационного файла...

    ИМХО: Возможно в статье не помешала бы инфа по огораживанию приложения от пользователя(автоматический запуск при логине/скрытный запуск/конфиг только на чтение для пользователя), по крайней мере этот момент неплохо бы держать в голове. С другой стороны раз настраивает админ - он такие моменты в голове держать должен постоянно.


    1. novburn Автор
      15.11.2024 09:20

      Для обновления групповых политик учетка админа компьютера обязательна? (вроде была нужна, может есть обходной маневр - не в курсе)

      Если я правильно понимаю, то нет. Принудительно обновить групповые политики можно из-под пользователя.

      Если обязательно - мы запускаем ВПН клиент от имени админа компа и даем возможность запустить любой скрипт/команду тому, кто добрался до конфигурационного файла...

      Здесь немного не понял. Если вы отредактируете конфигурационный файл подключения, то ничего не изменится. Эту конфигурацию потом ещё импортировать надо в клиент.

      Для запуска клиента достаточно пользовательских прав. Опишите подробнее ситуацию, я постараюсь ответить.

      автоматический запуск при логине/скрытный запуск

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


      1. Vdm_ro
        15.11.2024 09:20

        Да, действительно, обнова ГП локального админа не требует.


  1. MyNameIsJIEXA
    15.11.2024 09:20

    Спасибо за статью. Много новых возможностей подсказали!


  1. AMaxKaluga
    15.11.2024 09:20

    Получилось ли стартовать подключение из командной строки?


    1. novburn Автор
      15.11.2024 09:20

      Не тестировал. Нужно, чтобы при логоне подключался впн?


      1. AMaxKaluga
        15.11.2024 09:20

        Да, при логоне или чтобы ярлык на рабочем столе сделать на подключение/отключение.


  1. vvm13xx
    15.11.2024 09:20

    Можете что-нибудь посоветовать про ipv6? Когда коннекчусь форти-клиентом "к работе", работа с интернетом по ipv6 у меня отрубается, тогда как ipv4 остаётся. При этом netstat -rn и ipconfig /all ничего подозрительного не показывают, рутинг меняется только по ipv4, а по ipv6 ни малейших изменений. Что именно портится - загадка. Это немного неудобно, потому что некоторые интернет-ресурсы оказываются доступны только по ipv6.
    (Windows 11, перебрал несколько версий форти-клиента; сейчас сижу на OpenVPN, который подобным не страдает).


    1. novburn Автор
      15.11.2024 09:20

      Добрый день, в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Fortinet\FortiClient\Sslvpn (если у вас ipsec. то там возможно другой раздел) есть значение BlockIPV6, там какое значение?


      1. vvm13xx
        15.11.2024 09:20

        Да, спасибо, помогло. У нас ipsec. Нашёл HKEY_LOCAL_MACHINE\SOFTWARE\Fortinet\FortiClient\FA_IKE\BlockIPV6 =1 и HKEY_LOCAL_MACHINE\SOFTWARE\Fortinet\FortiClient\Sslvpn\BlockIPV6 = 0. Обнулил первое.

        Ещё бы автоподключение при обрыве связи, и можно было бы пользоваться ;-).