Представьте: вы решили (или жизнь за вас так решила) перевести сотрудников с Windows на Linux. Сегодня я расскажу, как это сделать и при этом сохранить пользователям доступ к привычным приложениям. 

Проблему будем решать на примере нашего терминального сервера Termit. Под катом вы найдете пошаговую инструкцию, как с его помощью настроить терминальный доступ к Windows-приложениям. 

Сейчас многие компании мигрируют на Linux по юридическим причинам и требованиям ИБ. Но пользователи, понятно, не в восторге от перспективы потерять доступ к привычным Windows-приложениям. 

Так что перед нами встает задача: 

  • обеспечить доступ к привычным приложениям в новой ОС;

  • гарантировать их стабильную работу;

  • максимально «обезболить» переход для сотрудников. 

Поэтому остается взять на себя миссию по достижению межсетевой совместимости. 

Внедряем Termit, уводим Windows в защищенный контур

Прямой переход пользователей с Windows на Linux связан с кучей организационных и технических сложностей. Наш подход – оставить приложения в среде Windows, но дать пользователям Linux доступ к ним через Termit. Это может быть проще и быстрее, чем менять привычки людей. Плюс в Termit можно гибко настроить права доступа к приложениям.

Как пользователи Linux получают доступ к Windows-приложениям на базе терминальной системы
Как пользователи Linux получают доступ к Windows-приложениям на базе терминальной системы

Проходим миссию с Termit

Задача поставлена, требования собраны. Самое время приступить к нашей миссии. И да пребудет с нами инструкция!  

Начнем с развертывания Termit. Как это сделать – читайте в статье

После развертывания нужно настроить Windows Server и подключить его к Termit. Подробная инструкция – в нашей wiki

Добавляем Windows-сервер в Termit

Когда сервер настроен, добавляем его в службу Termit:

  1. Заходим в Termit с правами администратора. 

  2. На вкладке «Серверы» выбираем «Новый Сервер». 

  3. Вводим FQDN сервера и выбираем тип «Windows».

  4. Нажимаем «Далее». 

  5. Следующий этап можно пропустить (дополнительные параметры внесем позже).

  6. Проверяем, всё ли верно, и нажимаем «Создать».

  7. После этого откроется окно с длинной строчкой кода, которую нужно скопировать.

  8. Вернемся на Windows Server и выполним скопированную команду в cmd.exe.

  9. После выполнения команды проверяем статус сервера.

Теперь ваш Windows Server готов к работе в связке с Termit. Можно переходить к настройке приложений для пользователей.

Публикуем приложения

Приложения уже есть, но пользоваться ими пока никто не может. Переходим к организации доступа: нам нужно объединить серверы в группу и опубликовать приложения. 

Для этого в Termit:

  1. Переходим в раздел «Группа серверов» и нажимаем «Новая группа». 

  2. Вводим имя группы и выбираем тип «Windows».

  3. Нажимаем «Далее».

  4. Здесь нужно выбрать сервер из списка и снова нажать «Далее». 

  5. Пропускаем остальные шаги и нажимаем «Сохранить».

Следующий этап  – публикация приложений: 

  1. В Termit перейдем на вкладку «Приложения». 

  2. Выбираем «Добавить приложение».

  3. Заполняем поля:

  • Имя приложения: Блокнот… Ну, или возьмем что-то посложнее – MS Power BI.

  • Операционная система: Windows.

  • Тип: Приложение.

  • Команда для запуска: укажем полный путь к exe-файлу приложения.

    1.  Нажимаем «Далее».

    2. Выбираем группу серверов и переходим «Далее».

    3. Нажимаем на знак «+» и добавляем группу пользователей из Active Directory, для которой мы опубликуем приложение. Важно: также добавьте эту группу на сервере Windows в локальную группу «Пользователи удаленного рабочего стола». 

    4. Нажимаем «Далее».

    5. Проверяем введенные данные и нажимаем «Создать».

Конечные пользователи

Теперь пора протестировать настройки на реальных пользователях. Выберите коллегу, который готов первым попробовать нашу систему.

Даем тестовому пользователю четкие указания:

  1. Установить одну из отечественных ОС: РЕД ОС, ALT Linux или Astra Linux. 

  2. Установить Termit Desktop:

  • Войти в систему Termit под своей учетной записью сотрудника.

  • Скачать дистрибутив Termit Desktop нужной версии.

  • Запустить установку.

  1. После установки Termit Desktop:

  • Запустить приложение.

  • Ввести имя Termit Broker.  

  • Зайти под учетной записью сотрудника.

  • Запустить любимое приложение на Windows.

Если тестирование прошло успешно и сотрудник подтвердил, что всё работает нормально, можно переводить на Linux всех остальных.

Мы справились с непростой  миссией,  и нам не пришлось шаманить для запуска Windows-приложений в неестественной для них среде. Пользователи работают на Linux, как того требуют корпоративные стандарты, а приложения запускаются в родной для них Windows. Всё работает стабильно, все довольны, значит, и мы тоже. 

В будущем, если потребуется перейти с терминальных серверов Windows на Linux, вы сможете легко добавить в Termit новую группу серверов. Это обеспечит доступ к приложениям как с Windows, так и с Linux.

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

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


  1. Getequ
    16.08.2024 12:50

    Получается это просто RDP одного окна-приложения по-линуксятски? Ведь все вычисления и файлы хранятся на сервере? Или как? не оч понятно. Но идея хорошая, спору нет


    1. DmGolubev Автор
      16.08.2024 12:50

      Да, все так. Приложение работает на Windows-серверах, данные обрабатываются там же. Пользователи подключаются к этим серверам со своих ПК под управлением Linux. Таким образом можно мигрировать пользователей на Linux, оставив доступ к Windows-приложениям только тем, кому это нужно.


  1. vicsoftware
    16.08.2024 12:50

    Выглядит как RemoteApp для Linux...


    1. paguo
      16.08.2024 12:50
      +1

      (почти двадцать лет уже прошло а) я так скучаю по 2x.com - жаль ms их запинал за масштабирование в фреймы одной лицензии


  1. adeshere
    16.08.2024 12:50
    +1

    Я никогда не работал в Липнуксе, и ничего не знаю про Termit. Поэтому я не смог понять из статьи: любое ли Windows-приложение можно подключить таким образом? Ведь большинство Windows-приложений имеют полноценный оконный интерфейс. Юзер видит перед собой окно, которое обрабатывает перемещения и клики мышки, показывает всплывающие подсказки, ну и естественно ловит события клавиатуры. Будет ли это окно вести себя точно так же на линукс-машине, если она подключена к Windows-серверу через Termit? Можно ли развернуть такое окно на весь экран?

    Это не чисто теоретический интерес

    Дело в том, что мы написали программу для научных исследований, которая работает в среде Windows. Но по мере развития и совершенствования этой ОС все больше пользователей спрашивают: а можно с нашей прогой работать в Линуксе. А мы не программисты, мы научные сотрудники,.. мы сами этого не знаем. "Простые решения" вроде перекомпилировать под линуксом не проходят, так как у нас довольно специфический стек и весь интерфейсный "велосипед" придется переписывать заново. А ресурсов (да и знаний) для этого просто нет, так как "мы не программисты, мы научные сотрудники.. (ну и далее бесконечный зацикл ;-).


    1. MountainGoat
      16.08.2024 12:50
      +2

      Есть гораздо более вменяемые и общепринятые способы запускать Windows приложение на Linux. Способ, описанный здесь, применяется, когда на софт ещё и одна лицензия на всех и её нужно соблюдать.

      А так - шлите пользователей запускать в Wine и пусть пишут вам, почему не смогли.


      1. DmGolubev Автор
        16.08.2024 12:50
        +1

        Действительно, Wine тоже можно использовать. Но под ним работают не все приложения, зачастую проще оставить все как есть (т.е. на Windows), и перенести на Linux только пользователей.


      1. adeshere
        16.08.2024 12:50

        В Wine у нас не получается из-за наших велосипедов.

        У нас интерфейс реализован одним exe-шником (т.н. "сервер интерфейса"), а вся содержательная работа - другими (т.н. "клиентами"). Они постоянно обмениваются между собой сообщениями, включая проверку наличия друг друга в системе и т.д. Причем, в разных сценариях работы эти "клиенты" могут запускаться и как дочерние процессы сервера интерфейса, и самостоятельно, и как дочерние процессы друг друга.

        Описание велосипеда

        Сначала у нас запускается т.н. "сервер интерфейса". Он висит в системе как фоновый процесс и ловит сообщения от "клиентов". При первом обращении - создает окно клиента, и дальше уже выступает такой "прокладкой" между клиентом и этим окном.

        Когда мы это мутили, задача была в том, чтобы переселить пакет из DOS в Windows, почти ничего не меняя в "клиентах". (До этого они при общении с юзером полагались на DOS-прерывания).

        Был привлечен специальный чел, который

        такую прокладку сделал

        Она даже сперва называлась DOS10, если кто-то тут еще помнит смысл этой цифры;-)

        Заодно добавил немного новых функций, которых у нас в DOS-версии не было. Которые мы постепенно стали к своим "клиентам" прикручивать... Фактически получился свой собственный фреймворк, через который у нас реализован весь интерфейс.

        Написаны и отлажены эти велосипеды были в XP, но семерку все перекочевало на ура. В десятке и в 11-ке были отдельные непонятки, но только для некоторых специфических установок винды (в стандарте все вроде работает). Самый труднопонимаемый баг был в том, что окно клиента не закрывалось после закрытия программы. Сервер интерфейса почему-то не мог получить информацию, что клиент больше не активен. Пришлось добавить костыль: перед завершением работы клиент теперь посылает серверу сообщение "я мухожук навсегда". Если успеет, конечно ;-)

        А под Вайном так и не заработало.


        1. Katasonov
          16.08.2024 12:50

          У меня есть похожая архитектура Win приложения. Коммуникация между клиентами происходит через pipes. В таком случае проблем с закрытием клиентов проблем не будет, так как в случае закрытия канала летит евент который отваливается и можно закрываться.


          1. adeshere
            16.08.2024 12:50

            Коммуникация между клиентами происходит через pipes (...) в случае закрытия канала летит евент

            Эту часть писал не я, поэтому могу наврать. Но у нас через pipe идут только большие объемы данных. Которые нужно передавать очень редко (такая архитектура). Поэтому они открываются, выполняют свою задачу и сразу же закрываются. А все оперативное взаимодействие идет через SendMessage. Если я правильно понимаю, это быстрее и проще (не надо готовить канал и т.д.).

            В общем, по каким-то причинам было сделано именно так. Товарищ, который это писал, намного грамотнее всех нас остальных, поэтому решение явно не с потолка взято. Но по итогу имеем то, что имеем. Под Wine не работает...


    1. akibkalo
      16.08.2024 12:50
      +1

      Здесь описывается клиентская часть, которая на стороне Linux. Само приложение, его ресурсы и устройства на Windows.

      Очевидно, если вашему приложению нужны, к примеру, графические акселлераторы или USB токены, - их следует подключать непосредственно в Windows, то есть ресурсы вашего ПК/ноута (процессорные, дисковые, память, графика) использованы не будут. Приложение использует ресурсы Windows сервера, у вас лишь картинка с отображением окна.

      Из описания мне не очень понятно, чем данный RDP клиент круче других, более известных. Поддерживает ли он фермы, перенаправление папок и профилей, Remote Desktop IP Virtualization (IP у терминального приложения под каждым пользователем свой) - что есть у Windows 7 в коробке.


      1. DmGolubev Автор
        16.08.2024 12:50

        Termit - это не совсем терминальный клиент. Это система терминального доступа, позволяющая работать с приложениями, опубликованными на терминальных серверах Windows и Linux. Наша клиентская часть поддерживает Windows/MacOS/Linux. В качестве серверов можно использовать Windows Server 2012R2 или самые разные Linux-системы (РедОС, Astra Linux, ALT Linux или Debian).

        В рамках Termit можно объединять терминальные серверы в группы и публиковать приложения на них. Таким образом обеспечивается отказоустойчивость и распределение нагрузки (балансировка).

        Перенаправление папок и перемещаемые профили поддерживаются на Windows-серверах, мы работаем над реализацией этих функций для Linux-серверов.


        1. adeshere
          16.08.2024 12:50

          Termit - это не совсем терминальный клиент. 

          Спасибо, дяденька! А что ты сейчас сказал? (с)
          ;-)

          Да, я тупой (и понимаю, что ответ был не мне ;-).
          Но у меня есть тупой вопрос, ответ на который я ищу по всей переписке.
          Условия задачи:

          1) У меня есть комп с Виндой. Совершенно обычной. Там может стоять что угодно, от XP до 11, от рус/англ домашки и Про до LTSC (но это не серверная версия точно). Он работает круглосуточно, и там на нем лежат файлы с данными, которые должна обрабатывать некая прога. Которая на этом компе (локально) прекрасно работает. И которую там иногда запускают местные юзеры.

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

          3) Оба компа подключены к инету. И даже могут быть в одной локальной сети.

          4) Но, менять версии ОС ни на первом, ни на втором компе нельзя. Можно только установить небольшое (нетяжелое по ресурсам) дополнительное приложение.

          ============
          А теперь вопрос: можно ли с помощью Термита как-нибудь выполнить то, что хочется юзеру в пункте 2? То есть соединить этого юзера с прогой? Желательно не заметив разницы с тем, как он это обычно делает на Windows-компе?


          1. itmind
            16.08.2024 12:50

            Как бы вы решили эту проблему, если бы на 2 компе стоял тоже Windows, а не Linux?

            Подключайтесь со второго компа на первый через AnyDesk (или через другое аналогичное ПО). Или ставьте на первый комп сервер RDP и подключайтесь через RDP. А Termit, насколько я понял, аналог сервера RDP.


    1. DmGolubev Автор
      16.08.2024 12:50
      +1

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


      1. adeshere
        16.08.2024 12:50

        То есть программа выполняется на Windows, на Linux просто отображается интерфейс.

        Это я понял. Вопрос в том, насколько полноценно и быстро он отображается. Например, графика у нас векторная и довольно увесистая. 100 тыс. элементов на графике - это норма, при которой юзер не замечает задержек; миллион должен отрисовываться за разумное время. Если просто посылать сообщения на экран, то на старых компах оно вообще не работает. Чтобы как-то разрулить ситуацию, наш так называемый "сервер интерфейса" создает в памяти виртуальный экран с разрешением, равным фактическому размеру окна в пикселах. Затем выводит на этот виртуальный экран векторные элементы изображения (там что-то похожее на wmf-стиль). Потом этот виртуальный экран отображается в Windows-окно. При изменении виртуального экрана он ре-отрисовывается (заново проецируется на Windows-окно) после каждого изменения, но не чаще 10 раз в секунду. Причем, если что-то где-то начинает вдруг тормозить, сервер это как-то контролирует (я не знаю, как именно) и динамически снижает частоту ре-отрисовки. Иначе работать было бы невозможно.

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

        совсем темный лес

        В те древние времена, когда я что-то я умел "в терминал", он выглядел наподобие командной строки: я там печатал вопросы, а оно в ответ что-то выводило в следующей строке, причем обычно с прокруткой экрана. Я правильно понимаю, что при удаленном подключении у Win-серверу Термит использует аналогичные протоколы только для передачи сообщений между компами? А формированием и обработкой этих сообщений на каждом компе занимаются местные "фоновые" программы? То есть, функциональность определяется вовсе не протоколом передачи сообщений, а функциональностью этих приложений?

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

        Если я правильно понял, то на Windows-сервере работает какой-то фоновый процесс, который эмулирует окно,

        перехватывая поступающие ему сообщения, и наоборот?

        В нашем пакете я имею отношение только к "клиентам", и вообще не представляю, как "внутри" устроены окна Винды.

        Из соображений здравого смысла мне казалось, что непосредственной работой с окнами занимается Винда. А как в это взаимодействие вклинивается Термит? В частности, будет ли окно программы отображаться на Windows-сервере?

        Мне трудно себе представить, что не будет

        Но если вдруг такое и правда возможно (я просто не в курсе), то для наших программ такой вариант не подойдет. Они просто не смогут корректно взаимодействовать друг с другом, т.к. у них не получится послать сообщение в другое окно клиенту-коллеге...

        Или же окно программы на Windows-сервере функционирует в обычном режиме, а Термит клиент просто отслеживает его изменения? Но как он это делает? Не попиксельно же (например, в нашем случае это приведет к фатальному торможению).

        Или он снимает копии всех сообщений и дублирует исполнение всех команд в линукс-окне? Но как тогда разрешаются конфликты? Например, юзер что-то щелкнул на Win-сервере, и состояние окна изменилось. А в тот же момент (до отображения этих изменений) юзер в линукс-терминале дал другую команду, которая в новом (измененном) окне выполняет совершенно другое действие?


    1. WinLin2
      16.08.2024 12:50

      del


  1. Al_Tar
    16.08.2024 12:50

    Как будто не было последних лет 20 с их терминальными серверами (от Citrix WinFrame до Virtual Apps, MS Terminal Server ...), потом VDI от того же Citrix, VMware, даже уже наших Space, Termidesk, Loudplay...

    Термиты, вы где были все это время? Почему ИХ уроков не выучили? Где были последние 2 года( когда тех же Space и Термидеск буквально завалили критикой за их протоколы)? Предлагать в кач-ве "решения" rdp ( freerdp 2.x?) , когда известны все его ограничения? Как вы собираетесь вписаться в существующие сети с потреблением на сессию в 4-8 раз выше , чем у наиболее популярного в терминальных серверах HDX/ICA? Без малейшей оптимизации ВКС( в rdp нагрузка на CPU терминального сервера в 12 раз выше, чем при использовании такой оптимизации)?

    Термидеск и Space во всю "пилят" свои протоколы, осознав, что ни один опенсорсный или rdp для enterprise никак не подходят, Loudplay уже давно на уровне Citrix или VMware по работе с тяжёлой графикой.

    И тут - "да, это - rdp!"

    Для изучения статья лохматого года по сравнению протоколов. В кач-ве домашнего задания : https://vm-guru.com/news/vdi-protocol-comparison-dec2010

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

    Резко? Не извиняюсь. Хуже будет, когда это от заказчика услышите


    1. kenomimi
      16.08.2024 12:50

       Предлагать в кач-ве "решения" rdp ( freerdp 2.x?)

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


    1. vicsoftware
      16.08.2024 12:50

      Ну, статья 2010 года необъективна после того, как в RDP завезли AVC444 кодирование.


  1. kenomimi
    16.08.2024 12:50

    У Cubes OS был драйвер для семерки, позволявший прозрачно шарить окна из вируалки в основную систему. Реально рабоали вперемешку виндовые и линуксовые окошки. Но сам Cubes OS монструозен и крив, потому идея провалилась...

    Похоже, тут идея аналогичная.