Приветствую, друзья.

Это мой второй пост, первый был закидан тапками) Надеюсь тут будет  лучше.

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

Библиотеку мы назвали Heredes (HEadless REmote DEsktop System). Это библиотека для управления рабочим столом удаленного ПК из приложений - вроде не дает никто такого? Нам не жалко, а вам, надеемся, пригодится. Аналогов отдельных для решения конкретной задачи как бы и нет. Есть как часть какого-то сервиса, что далеко не всегда приемлемо. И то для пользователей и сисадминов. Ну а для разработчиков - это всегда делать все с нуля самим.

Возможности библиотеки:

- Простое установление прямого соединения между двумя ПК за NAT (в разных подсетях)

- Двусторонний обмен любыми пользовательскими данными.

- Оптимизация для простоты реализации таких повседневных задач как:

- Прямая передача файлов за NAT. Размер файлов ограничен вместимостью ваших жестких дисков

- Покадровое реалтайм видео с рабочего стола одной машины на другую. Возможность отрисовки рабочего стола как на виртуальном DC так и на реальном

- Реалтайм аудио с микрофона одной машины на колонки второй (в формате PCM) с возможностью записи аудио в файл.

- Проброс клавиатуры и мыши между двумя ПК за NAT.

- Шифрование пересылаемых данных с помощью необычного закрытого ключа.

- Наше решение для разработчиков, то есть это библиотека которую можно использовать в Вашем проекте

- Мы пробиваем NAT. И клиент и сервер могут не иметь белых адресов

Минусы:

- Логин на пк/сервере. Мы не логинимся, т.о. вход на ваши сервер или ПК должен быть выполнен.

- Два ПК в одной локальной сети, видя друг друга напрямую, тем не менее не смогут при помощи этой библиотеки установить соединение.

Сферы возможного использования:

- Удаленный доступ за NAT к любому ПК .

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

- Несколько рабочих столов можно отображать в одном интерфейсе.

- P2P мессенджер (с голосовым, видео, текстовым обменом и реальной возможностью передавать любые другие данные/файлы на выбор разработчиков).

Детальнее с тех. документацией вы можете ознакомиться тут. Пока только Windows, но скоро будет Linux.

Что мы ждем от вас:

1. Конструктивную критику. Возможно, мы давно видим однобоко свой продукт.

2. Конкретные предложения. Где что-то добавить, а где убрать.

3. Направление развития. По вашим отзывам будем формировать планы на будущее. Пока думаем работать над р2р файлопередавалкой и менеджером удаленных соединений (он вообще нужен?).

В следующих статьях (или статье) распишем более детально работу с C, C #, C ++, Python, PHP и JS (для десктопных приложений), Delphi и на примерах (просьба написать какие из этих вопросов актуальны, а какие не нужны):

- простая звонилка за NAT;

- простой обмен текстовыми сообщениями за NAT;

- простая передача файлов за NAT;

- простой RDP за NAT;

- фоновое сохранение скрина удалённого ПК  за NAT;

- удаленная командная строка CMD за NAT.

Ссылки: на проект, скачать архив, документация.

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


  1. sHaggY_caT
    23.08.2021 23:36
    +1

    Это мой второй пост, первый был закидан тапками) Надеюсь тут будет лучше.

    Напишу только за себя. У кого-то могут быть другие мнения. Надеюсь, Вы не против.

    Простите, но не нужно такое. Когда в прошлом решала похожие задачи, использовала VNC и VPN.

    Я бы купила в таких случаях opencode(можно посмотреть сорцы, можно прислать PR и добиться мерджа), но не opensource (ну опенсурс лучше было бы), который бы каким-то образом удобно интегрировался с он-прем инфраструктурой. OpenCode нужно и для сервера и для клиента. А троян внутри инфраструктуры а-ля тимвьювер не нужен.

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

    Хочется, чтобы эталонная реализация умела k8s на серверной стороне, и имела линукс-клиент (это обязательно).


    1. Brodilla Автор
      24.08.2021 00:05

      Здравствуйте. Большое спасибо за ваш комментарий - мы действительно опасались обвинений в трояне или митм, но все же решили выложить данный проект. Это бетта и продавать бетту было бы верхом наглости. Но эта бетта содержит ряд собственных решений, реализацию которых не хотелось бы открывать до момента доведения до ума. После чего - все возможно, в т.ч и продажа opencode, о которой пока что говорить просто рано (продукт пока явно не на уровне для продаж). В данный момент мы - ноунейм и, конечно, с вашей стороны не должно быть к нам доверия, но в будущем надеемся его заслужить.


      1. pyur
        25.08.2021 09:01

        бетта зан насын.


  1. Z2K
    23.08.2021 23:42

    Простое установление прямого соединения между двумя ПК за NAT (в разных подсетях) и т.д. - Круто.


    1. Brodilla Автор
      24.08.2021 00:12

      Здравствуйте. Спасибо за аванс. Надеемся, вы попробуете саму библиотеку.


  1. remzalp
    24.08.2021 07:11

    - Шифрование пересылаемых данных с помощью необычного закрытого ключа.
    Вы настолько круты, что умеете в свою криптографию?

    Ожидал какое-то интересное ноу-хау, но всё как обычно оказалось обвязкой вокруг "STUN-сервера HeReDeS (от разработчиков не требуется наличие собственного stun-сервера..."


    1. Brodilla Автор
      24.08.2021 11:04

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

      Без ноу-хау не обошлось, на самом деле. Во-первых, своего stun-сервера не требуется разработчику. Во-вторых, не требуется разбираться в протоколах работы со stun сервером ни нашим, ни каким другим, т.к все сведено к вызову функций, которые взяли на себя работу с протоколами сетевого взаимодействия. Обвязка вокруг известной ранее техники пробоя NAT - безусловно, это она и есть.

      Есть ли аналоги библиотеки - сомнительно. Ближайшим аналогом является другая "обвязка вокруг той же техники" - webrtc, которая, по ряду причин, не устроила нас и, возможно, не устроит еще кого-то.


      1. Kotofay
        24.08.2021 12:02

        Используется ли вашей библиотекой TURN сервер если два клиента находятся за симметричным NAT-ом?


        1. Brodilla Автор
          24.08.2021 15:47

          Turn не используется. В этом случае возможно использовать свой turn если произошел отказ соединения. Возможно в будущем, мы предложим ПО для своего turn сервиса, но вопрос под вопросом и зависит от спроса.


      1. suns
        26.08.2021 19:12

        "более надежного" - это вообще спорное утверждение. Наверное еще один раунд действительно не ослабит шифр, однако изменения в s-box вполне могут походить на закладку


        1. Brodilla Автор
          28.08.2021 13:03

          Идеологически мы сохранили RSA-идею в упрощенном виде. И, на самом деле, при использовании "по умолчанию" в сравнении со стандартным RSA мы выигрываем лишь по скорости многократно, но не по сложности расшифровки.
          Так что утверждение не спорное - если использовать библиотеку не слишком заморачиваясь и, оставляя все по умолчанию то шифрование поверх или до нас, не будет лишним.

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

          Тема обширная и, наверное, ей будет стоить посвятить отдельную статью.


  1. expertykt
    24.08.2021 07:24
    +1

    Для VBA: простой обмен текстовыми сообщениями за NAT;


    1. Brodilla Автор
      24.08.2021 11:09

      А почему нет? В VBA тоже есть возможность использования вызовов функций из других dll. Функционал вполне встраивается в макросы приложений MS Office через Public или Private Declare. С оговоркой - это на данный момент 32-битные версия dll, и версия пакета MS office должна быть той же битности иначе или не выйдет или придется использовать самописную "прокладку", например для взаимодействия через pipe или файлы - накладно в плане реализации, но тем не менее тоже возможно если очень надо связать напрямую две удаленных таблицы в Excel, к примеру.


  1. Stecenko
    24.08.2021 08:35
    +1

    Мы пробиваем NAT. И клиент и сервер могут не иметь белых адресов

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


    1. fougasse
      24.08.2021 09:14

      STUN уже лет 15 как в ходу, да.


      1. Ra-Jah
        24.08.2021 09:33
        +1

        На вопрос вы не ответили. Как это поможет с двумя restricted NAT, не понятно и вообще ничего не понятно без описания конкретных технологических приемов работы этого волшебного клиента.


        1. fougasse
          24.08.2021 12:31

          Как STUN работает с restricted cone NAT - публичная информация, там нет никакого rocket-science.

          Для symmetric NAT можно попробовать TURN.


          1. qw1
            24.08.2021 13:25

            Сейчас я не знаю ни одного современного девайса, ни одной современной ОСи (в случае програмного NAT), ни NAT от интернет-провайдеров, которые были бы подвержены Hole Punching. Всё осталось далеко в 2000-х. А вы знаете?


            1. Brodilla Автор
              24.08.2021 15:31

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


              1. qw1
                25.08.2021 00:43

                Вот прямо сейчас проверил.

                Проводной провайдер даёт мне белый IP (а переключаться я не хочу), поэтому его NAT проверить не получилось. Но домашний роутер основан на linux, и не допускает hole punching, тестирующая утилита определяет «port-restricted nat».

                На мобильном провайдере (Megafon) тестирующая утилита определяет Symmetric Cone. Да и с какой радости провайдерам оставлять Full cone NAT, если при этом появляется лимит в 64K соединений через один публичный адрес, а потом порты кончатся. Лучше иметь полную таблицу трансляций и почти неограниченное число соединений через 1 публичный IP. Full cone был временным явлением из-за дороговизны памяти роутеров, чтобы сэкономить 2-4 байта на каждом соединении, не запоминая внешний IP. Сейчас память сильно подешевела.

                Так что в моём случае прямое соединение за NAT-ами невозможно.

                Ваш опыт, скорее всего, относится к случаям, когда клиенты находят внешний сервер, через который идёт трафик.


                1. fougasse
                  25.08.2021 08:02

                  Ну так о чём и речь, внешний сервер.


                  1. qw1
                    25.08.2021 09:54

                    Тогда через этот сервер должен идти весь трафик, т.е. речь не о STUN.


                1. Brodilla Автор
                  25.08.2021 12:19

                  В ближайшие дни выйдет статья с примерами реализации на С++, а так же ссылки на скомпилированные примеры. Лучшего способа проверки, чем проверка на практике - нет. Попробуйте библиотеку в действии: например, стационарный ПК за роутером, а ноут через мобильного провайдера... а утилиты отлично покажут откуда и куда приходит трафик. И оставьте отзыв о практическом опыте - это будет полезно.


                  1. qw1
                    25.08.2021 17:04

                    Можно попробовать, но случится чудо, если оно у меня заработает.


                    1. Brodilla Автор
                      25.08.2021 21:55

                      Опуская тех подробности о вашем домашнем роутере, можно утверждать об успешном пробивании NAT у мегафона/йоты с одного конца (тесты в регионе - Краснодар) и lifecell/киевстар с другой (регион - Одесса).

                      Таким образом, когда хоть одна из сторон подхватывает прямое соединение - второй ничего не остается. Имеет смысл попробовать - шансы сильно отличны от нулевых. Хотя утверждать можно конечно же только после живого теста в виду возможных погрешностей в работе утилит, к примеру - время покажет так ли непробиваем ваш случай.


    1. Brodilla Автор
      24.08.2021 11:20

      Да. Именно эту технику мы реализовали в библиотеке, но реализовали прозрачно в виде вызовов функций библиотеки с минимально возможным набором параметров. Так, например, получение адресов друг-друга происходит и в нашем случае посредством нашего сервера-маршрутизации (далее - stun сервера), но он уже есть и не требуется от вас, а протокол сетевого взаимодействия на всех этапах не требует его понимания. В своем приложении вы можете сосредоточиться на своей задаче, оставив банальную, но трудоемкую обертку организации прямого взаимодействия нашей библиотеке. Более того - мы постарались предусмотреть наиболее частые варианты потребностей и облегчить их реализацию. В ближайшие дни опубликуем статью с примерами реализации таких частых потребностей на С++.


      1. Vinni37
        24.08.2021 15:12
        +2

        Я правильно по нимаю, что в случие если ваш сервер помашет ручкой, все труды по внедрению окажутся прахом? Или ваш сервер-маршрутизации можно поднять у себя?


        1. Brodilla Автор
          24.08.2021 16:46

          Все немного иначе. Если по каким-то причинам мы решим, что нецелесообразно более предоставлять наш stun-сервис в общий доступ, мы спросим здесь же на хабре кто хочет-может предоставить ради саморекламы или из добрых побуждений впс в качестве stun-сервера и получить права на домен heredes.org в придачу на добровольной основе.

          Есть внутренняя уверенность, что выложить 50$ в год ради саморекламы смогут многие. Таким образом бесплатный stun маловероятно, что умрет.


          1. qw1
            25.08.2021 00:52
            +1

            Если у вас дейcтвительно STUN по RFC 8489, а не какой-то свой велосипед, то логично иметь возможность в API библиотеки указать адрес STUN-сервера. Нагуглить пяток действующих STUN-серверов вообще не проблема. И домен не нужно будет никому передавать.


            1. Brodilla Автор
              25.08.2021 11:51

              Все в строгом соответствии со спецификацией RFC 8489, из которой следует возможная несовместимость на уровне протоколов различных STUN-серверов в связи с расширяемым форматом пакетов.


  1. Brodilla Автор
    24.08.2021 16:05

    del


  1. Daar
    25.08.2021 15:00

    Спасибо за ваш труд! Вашу библиотеку полгода бы назад. Сейчас сделан свой велосипед на бесплатных VNC. Но если все будет красиво как написано у вас, то можно подумать и о миграции. Интересуют такие вопрос:

    1. Можно задавать свои STUN-сервера или ваши жестко вшиты?

    2. Это только под windows или будут другие платформы, то какие?

    3. Как понял бесплатно пока на тесте, а можно узнать примерно какая будет потом монетизация? А то может и не стоит пробовать :)))

    4. Реалтайм видео - как понимаю есть возможность захвата с камеры? Но при этом пугает "Мы скриним весь экран", какие-то кодеки используются?


    1. Brodilla Автор
      25.08.2021 19:52

      • на данный момент только под windows и только 32 бита для большей совместимости. следующим шагом, после перехода от бетты к версии, будет линукс реализация, затем в планах интеграция клиентской части с браузерами через webassembly (сторона ожидающая соединения скорее всего останется чисто десктопной всегда, т.е решение врядли перейдет в форму браузер-браузер) и только после этого возможно и 64 битные.

      • STUN-сервер жестко вшит на данный момент. связано это с тем что формат пакетов расширен с целью объеденить протоколы межклиентского взаимодействия и протокола обмена с STUN сервером, что облегчает обработку пакетов и уменьшает этот участок кода более чем в 2 раза, но напрочь убивает надежду на совместимость. вариант распространения кода stun сервера для корпоративных решений пока не рассматривается

      • это рекламный продукт и он будет бесплатен всегда. из недостатков возможно покажется невозможность установки исходящего соединения в фоновом режиме (а окно ввода ID принимающей стороны содержит рекламеый блок 150х150) рекламирующий другие, в т.ч платные продукты. это и есть плата за использование - небольшой квадрат в момент установки соединения на стороне 'клиента'. серверная (ожидающая часть) фоновая

      • функция захвата изображения работает с указанным hDC. в ряде случаев WinAPI работы с камерой предполагает так же отрисовку на указанном DC, что делает принципиально возможным и захват изображения с камеры. на сколько производительным будет такой проброс - не тестировали и соответственно не оптимизировали, но принципиально это возможно.

      • кодек. это самый интересный вопрос. мы пошли по пути GOOGLE в том смысле, что решили внести что то новое. кодек проприетарный.

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

      классическое же видео содержит беспорно гениальные решение в виде векторов движения и другие оптимизирующие факторы, которые требуют обработки нескольких (чем больше тем лучше сжатие) кадров. Хуже того, эти решения существенно замедляют сжатие видеопотока, т.к поиск векторов движения врядли можно отнести к быстрой по времени задаче, что делает реалтайм с хорошо оптимизированным по трафику видео невозможным. таким образом наш кодек это скорее проброс покадровых изображений в модифицированном гибриде - что то между jpg-gif с оптимизированным решением заменяющим громоздкое класическое косинусное преобразование, хорошо оптимизированным упором на различие в соседних кадрах и некоторыми другими решениями позволяющими добиться возможного минимума трафика при относительно статичных изображениях и приемлимых требованиях к ширине канала при динамике. такой алгоритм позволяет избежать постоянной синхронизации видеопотока а приводит к тому что в случае нестабильности канала или низкой пропускной способности просто пропускаются кадры, но разрыв с реалтаймом не превышает 20-30мс плюс время на загрузку кадра и что важно - с течением времени разрыв во времени не суммируется

      в бетте кодек это самое сырое место - отнеситесь с пониманием. с другой стороны эта 'сырость' очень наглядно задемонстрирует и принципы идеи, не особо сглаживая/скрывая межкадровые переходные состояния - в определенном смысле недоработки бетты визуализируют алгоритмы


      1. Daar
        26.08.2021 08:53

        возможно покажется невозможность установки исходящего соединения в фоновом режиме

        А вот это как раз для нас и будет главной причиной отказа от вашего продукта... Грубо, у нас будет список компов и пользователь просто выбирает какой ему нужен и нажимает "Подключиться" и сразу открывается окно УД, без ввода адресов/паролей и т.д. Я думал у вас эту информацию (ид, пароли и т.д.) можно было передать при вызове функций из библиотеки. Или возможно?
        А это баннер он посередине экрана будет или где? Ну и если это баннер то получается ему требуется доступ в интернет и он будет выкачивать новые баннеры?
        У нас просто продукт для внутреннего использования, желательно без выхода в интернет, почему и спрашивал о своих STUN серверах.


        1. Brodilla Автор
          26.08.2021 19:12

          К сожалению, без интернета работать не будет. Вообще, Heredes это побочный продукт при разработке нашего основного - собственно основной будет использовать этот же стун. И идея выложить его для всех возникла недавно. Именно поэтому это бесплатно и как есть.


        1. MGSpace
          26.08.2021 23:49

          внутри локальной сети по моему проще организовать прямую рересылку изображения или я ошибаюсь? вплоть до вообще через pipe вида \\192.168....\pipe\... что б с сокетами не играться

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


  1. MGSpace
    26.08.2021 19:12

    Интересно было бы попробовать. жду примеров т.к пока не совсем ясна последовательность взаимодействия


    1. Brodilla Автор
      27.08.2021 21:13

      как только сделаем - дам сюда ссылку.


    1. Brodilla Автор
      30.08.2021 23:38

      https://habr.com/ru/post/575442/ вот примеры. надеюсь, что-то да пригодится.