Аналог Teamviewer из VNC, SSH и суперклея

    Всем хорош teamviewer, вот только в коммерческих целях он какой-то не бесплатный, о чем не устает напоминать… Да и вообще, не хорошо нарушать лицензию.

    Но удобство запуска quick support впечатляет — клиент запускает маленькую программку, диктует циферки по телефону и вуаля, мы видим его рабочий стол. Никаких VPN, никаких пробросов портов и прочей предварительной настройки. Удобно же?

    В качестве бесплатного аналога вполне подходит VNC, с call-back подключением вполне приемлемо, да вот только когда клиентов много, и компьютер к которому цепляются тоже не один начинаются те же проблемы (хотя и более решаемые). Идея teamviewer лично мне нравится больше. А если нравится, почему бы не сделать свою реализацию…



    Сразу оговорюсь, предлагаемое решение, еще даже и не решение совсем, реализация задумки была выполнена «на попробовать», но вполне доказала свою работоспособность, а улучшательства и удобства — можно допилить по ходу времени.

    Итак, за основу возьмём winvnc (tightvnc), прикрутим к нему реверсивный SSH-туннель, а определять клиента будем, например по номеру порта. Нам потребуется:
    OpenSSH сервер (на линуксе, например), web-сервер (с php в моем случае).
    Клиент будет использовать собс-но winvnc (я взял из комплекта tightvnc-portable) и консольный клиент SSH plink из пакета Putty.

    В альфа-версии нашего клиента удаленной поддержки не будет ничего лишнего (да и не лишнего тоже много чего не будет), и Т.З. для сервера будет выглядеть примерно так:

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


    Для клиента:
    При запуске клиент при должен запросить с сервера данные о туннеле.
    Запускать winvnc с заранее определенными настройками
    Поднимать SSH-туннель с полученными настройками.

    Приступим:

    Не буду углубляться в вопросы запуска apache2+php+OpenSSH, предположим, что все это уже имеется.
    Добавим пользователя vnc:

    $ sudo useradd -M -s /bin/false vnc

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

    Назначим пароль:
    $ sudo passwd vnc

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

    В sshd_config (/etc/ssh/sshd_config) разрешим открывать порты на всех сетевых интерфейсах, добавив опцию:
    GatewayPorts=yes


    Без неё туннель откроется на адресе 127.0.0.1 (со стороны сервера) и без дополнительных шаманств его использовать удаленно не получится. Остается перезапустить OpenSSH

    $ sudo service ssh restart

    Передавать настройки клиенту придумалось в виде cmd скрипта, который запустит plink и оповестит клиента о волшебной циферке которую нужно сообщить. Этим займется скрипт на PHP (или на чем будет удобно) вида:

    <?php
    $server = 'mysshserver.com'; // адрес OpenSSH сервера
    $user = 'vnc'; // Логин созданного пользователя
    $password= '123'; // Пароль от созданного пользователя
    $ssh_port=22; //Порт на который слушает SSH
    $vnc_port=11111; //порт на котором будет висеть VNC-сервер
    $port_start = 40000; //диапазон выдаваемых портов
    $port_end = 50000;
    $ports = NULL;
    //Определяем занятые порты
    $r =  exec("netstat -lnt4 | tail -n +3 | awk 'BEGIN{FS=\"[: ]+\"}{print $5;}' | sort -n", $ports);
    //Находим свободный из заданного диапазона
    do {
            $port = rand($port_start, $port_end);
            if(!in_array($port, $ports)) break;
    } while (1);
    //выдаем cmd-скрипт
    header("Content-type: text/plain;");
    echo "@echo off\r\n";
    echo "title Port number is: $port\r\n";
    echo "start /MIN cscript mb.vbs \"Port number is: $port\"\r\n";
    echo "plink.exe  -N -R $port:localhost:$vnc_port -P $ssh_port -pw $password -l $user -batch $server \r\n"
    ?>


    И добавим разрешения для фаерволла:
    #разрешение уже установленных соединений
    iptables -A OUTPUT   -m state --state RELATED,ESTABLISHED -j ACCEPT
    #запрещение всех остальных пользователю vnc
    itpables -A OUTPUT  -m owner --uid-owner `id -u vnc` -j REJECT
    # разрешение соединений в диапазон 40000-50000
    itpables -A INPUT -p tcp --dport 40000:50000 -j ACCEPT
    Остальные настройки (политика по-умолчанию, разрешение SSH, HTTP -трафика, для при):
    itpables  -P INPUT    DROP
    itpables -A INPUT -p tcp —dport 22 -j ACCEPT
    itpables -A INPUT -p tcp —dport 80 -j ACCEPT
    


    Теперь приступим к сборке пакета для клиента. В него войдет:
    winvnc (повторюсь, я взял из пакета tightVNC portable) и необходимые библиотеки
    plink с сайта putty
    wget for windows (binaries и dependencies)
    reg-файлы настроек для winvnc и настройки для plink. Последний очень хочет одобренный ключ SSH в реестре и нет никакой возможности не интерактивно добавить его.

    Для получения заветных кусков реестра, запускаем Putty цепляемся к нашему SSH-серверу, принимаем ключ и экспортируем реестр:

    reg export HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys keys.reg


    Точно также поступаем с настройками winvnc: запускаем на стендовом компьютере,
    в настройках задаем:
    1. Пароль или пустой, по вкусу, на вкладке Server,
    2. там же устанавливаем номер порта я поставил 11111 (используется в только PHP-скрипте).
    3. На вкладке Administration разрешаем loopback соединения, в случае пустого пароля — разрешаем их использование.
    4. Ну и выключаем HTTP сервер, он в нашем случае не используется.

    Применяем, закрываем и экспортируем:
    reg export HKEY_CURRENT_USER\Software\ORL\WinVNC3 winvnc.reg


    Добавим vb-скрипт, который будет выводить окно сообщения заданным текстом:
    mb.vbs:
    Set objArgs = WScript.Arguments
    messageText = objArgs(0)
    MsgBox messageText


    И самый главный скрипт, который все свяжет:
    runme.cmd:

    winvnc.exe -kill
    reg import host-key.reg
    reg import winvnc.reg
    start winvnc.exe -run
    wget http://mysshserver.com/script.php -O tunnel.cmd && tunnel.cmd
    winvnc.exe -kill


    в нем пришибаем winvnc (вдруг уже работает?),
    импортируем куски реестра,
    запускаем winvnc
    скачиваем скрипт и если скачался — запускаем его.

    Остается сложить все вышеописанное в одну папку и запаковать в SFX архив, с запуском этого скрипта после распаковки: для WinRAR SFX как-то так:
    Silent=1
    Path=%TEMP%\support
    SavePath
    Setup=%TEMP%\support\runme.cmd


    и можно отдавать клиенту. При запуске, тихо и незаметно распакуется архив, запустится скрипт runme.cmd, который настроит winvnc, plink, скачает скрипт запуска туннеля, запустит его и оповестит клиента о номере порта.
    Как и в случае с teamviewer — клиент сообщает его, и можно подключаться (уже к нашему SSH-серверу, с указанным номером порта)

    В итоге имеем:
    • Клиент может сидеть за NAT
    • VNC Viewer так же может быть за NAT
    • Единственное, что необходимо для подключения к клиенту — номер порта, который продиктует клиент.


    Теперь о планах на будущее:
    1. Убрать тяжелый wget и вообще все скрипты переписать на VBS
    2. Сделать web-интерфейс для отслеживания подключенных клиентов и возможность скачать VNC-файл для быстрого подключения.
    3. Что еще?
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 56
    • 0
      reg-файлы настроек для winvnc и настройки для plink. Последний очень хочет одобренный ключ SSH в реестре и нет никакой возможности не интерактивно добавить его.


      А публикация ключика по DNS не помогает?
      • +1
        Без патча на Putty только так, или попросит пользователя в черном окне нажать Y (чего испугаются 90% из тех, на кого рассчитан такой способ подключения)
        • 0
          В таком разе можно воспользоваться cygwin/msys -версией ssh…
          • +1
            можно, но там еще будут лишние библиотеки от которых тот же mingw32 зависит
            • +2
              Кстати, можно было бы воспользоваться чем то наподобие openvpn, или вообще ограничиться stunnel-ем…

              Да, задачка интересная, и решается в 1000 и 1 способ — в том числе можно было бы прикрутить hamachi или teredo/ipv6
              • +1
                Хотелось, чтобы ничего устанавливать не нужно было, с OpenVPN, pptp хорошо, но долго объяснять
                • +1
                  openvpn-клиент с конфигом можно запустить в одну строку, из того же батника.

                  Но в общем вы правы: чем проще, тем надежнее.
                  • 0
                    Там драйвер tun адаптера еще есть
              • +1
                Попробуйте вот эту штуку — sshwindows.sourceforge.net/
                У неё синтаксис такой же, как у обычного ssh. А значит можно сделать что-то вроде ssh -R blah:127.0.0.1:blah user@host -i id_dsa.key -o StrictHostKeyChecking=no сделать из bat-файла.
                Тогда решение становится универсальным. Кладем в архив bat файл + sh файл, файлы для винды и скрипт, который установит и запустить x11vnc в туксах.

                Ну и покопайтесь по хабру, тут были обзоры программ, которые софтину по экзешнику упаковывают в portable вместе со всем необходимым. Месте занимать много будет, зато решение красивое будет.
                • 0
                  Собсно это вторым этапом, попробую на Autoit сделать, за sshwindows спасибо, не натыкался
                  • 0
                    Ещё и порты на сервере можно будет генерировать рандомно или по функции от времени, чтобы не совпадали. Тогда и php скрипт особенно не нужен будет по факту.
                    Ну и да, если сидите под никсами — то там есть прекрасная remmina, которая умеет ходить на vnc через туннели, дабы не открывать vnc наружу.
                    Если получаться чего не будет — попинайте меня палочкой в почту, попробую довести до конца вашу идею (т.е. до полной автоматики), но с учетом linux-клиента на нашей стороне.
                    • 0
                      php скрипт это заглушка пока, он еще будет регистрировать в базе запрос клиента
                    • 0
                      на InqSoft Neo Sign 0f Misery будет компактнее.
          • 0
            Если уж клиенты у вас под форточками все то и изобретать ни чего не надо — юзаем ChunkVNC
            • 0
              Там же UVNC repeater используется, хотя надо пропробовать, спасибо за наводку.
              Клиенты любые не только форточки, ssh -R в любой *nix системе, да и со скриптами там лучше
              • 0
                Я даже как то писал статью, еще в песочнице, с разбором и модификацией клиента. Но тогда было никому не интересно :)
                Но самому построить такую систему интереснее, согласен :)
              • 0
                А если абонент за NATом? и я за NATом, тогда песни не будет?
                • 0
                  Песня будет, причем даже если и клиент за натом и тот кто подключается к его рабочему столу.
                  схема такая:
                  VNC Server <== SSH Tunnel ==> OpenSSH Server <== Internet ==> VNC Viewer
                  Единственное, что не должно быть за натом — сервер OpenSSH
                • +2
                  Замените суперклей на синюю изоленту! ;)))
                • 0
                  А еще в большинстве случаев хватает шаринга экрана через Skype.
                  • 0
                    Вот кстати, как-то не прижился
                  • 0
                    Может я не в тренде, но мой типичный юзер просто в экстазе когда «диктует циферки по телефону и вуаля».

                    Я сам пользовался VNCшными приблудами до TeamViewer'а, но то что дает этот продукт (несмотря на все тормоза и глюки) бесценно, ибо как говорил товарищ А. Энштейн: «Всё должно быть сделано настолько просто, насколько возможно, но не проще!», чего не скажешь о предлагаемом решении (надеюсь пока-что не скажешь ибо а) open source и б) пропуск трафика через левый сервер не есть вери гуд ):).
                    • 0
                      Тимвьювер тоже пропускает траффик через левый сервер в случае НАТа, нет?
                      • 0
                        Как раз тут пропускаем трафик через свой сервер, а тимвьювер пропускает через левые
                      • 0
                        Ну с точки зрения клиента все просто — запускаем, диктуем цифры и всё. Остальная механика скрыта
                      • 0
                        Я когда-то пытался что-то такое сваять с autoit + pptp_vpn + vnc. Но подошёл к вопросу не так основательно, как Вы и честно говоря забил. Велосипед против Teamviewer'a не покатил.

                        Я думаю многие пытались что-то сделать, но Вы меня поразили, доведя эту идею до конца, ведь сам я сдался.
                        • 0
                          Поспорил на литр пива, что за пару часов сделаю аналог. Мотивация — сильная штука
                          • 0
                            Ждём статью = )
                            • 0
                              Это же он ее и написал.
                              • 0
                                Знач проспорил, потому как за 2 часа это не сделаешь)
                                • 0
                                  За полтора управился
                                  • 0
                                    Значит у Вас отличный бекграунд.
                        • 0
                          Есть бесплатное, кросплатформенное решение: «Удаленный рабочий стол Chrome BETA» chrome.google.com/webstore/detail/gbchcmhmhahfdphkhkmpfmihenigjmpp
                          • 0
                            я делал такую же штуку :)
                            только я не plink взял, а самую что ни наесть putty и с помощью напильника и топора (в основном топора :D ) она превратилась с одну форму с кнопкой connect весом 130 кб.
                            изначально задача была коннеститься к серверам и в тренде был rdp, однако жись показала, что чаще нужен именно vnc и был прикручен tightvnc сервер (вес стал уже 300кб), который разворачивался из ресурсов и запускался из temp'a (антивирам незачет ни один не ругался :)) ) пользователю осталось продиктовать номер порта к которому следовало подключаться.
                            а еще она умела стартовать как служба. А еще vncviewer из tightvnc научился отлавливать alt-tab, ctrl+esc, winkey…

                            на самом деле мне очень жаль, что практически заброшена разработка open source' ных vnc серверов.
                            тот же tightvnc (мне очень нравится!) отрабатывает позже чем тот же teamviewer:
                            наверняка уже появились новые способы отлавливать изменения на экране.

                            в прицепе эта тема мне очень близка — создание бесплатного аналога teamviewer-a — может даже на статейку хватит.
                            • 0
                              А USB прокинуть можно? LinuxWindows или LinuxMac
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Тогда уж OpenVPN + vnc. Но как уже неоднократно говорилось — «сложность» установки часто пугает пользователей, да и объяснить по телефону установку hamachi, настройку VNC порой очень сложно.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  • 0
                                    Повесить ssh на HTTPS порт
                                    • 0
                                      А можно поподробнее — что за reweivmaet? Что-то поисковики какую-то чушь выдают…
                                      • 0
                                        Поднесите экран компьютера к зеркалу.
                                        • 0
                                          млиин :))
                                          • 0
                                            copy-paste развращает, перестаешь читать слова
                                    • 0
                                      Я сейчас активно играюсь с повершеллом, но по умолчанию запуск скриптов запрещен, так бы можно было красиво Ваше решение обернуть…
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • 0
                                          Я не против ammy или teamviewer. Последним пользуюсь довольно часто, просто встал вопрос о покупке лицензии — и соответственно вопрос «за что платить 20-40к». Основное назначение — доступ к рабочему столу, аудио, передачей файлов, презентациями я ни разу не пользовался. Получается платить не за что.
                                        • 0
                                          Переписал на VBS, получилось сильно лучше — 545кб (plink оставил, winssh требует cygwin, а он больше 2мб), туннель убивается после выхода из winvnc. Набросал добавление в базу данных, список сеансов, быстрое подключение (скачивается vnc-файл). Получилось вроде бы удобно.

                                          Кто может помочь с приличной веб-мордой?
                                          • 0
                                            Можно поинтересоваться, есть ли дальнейшее развитие проекта?

                                            У меня для TM есть большой плюс, это возможность с любого подотчетного компа удаленного офиса или объекта используя аккаунт ТМ, оказать оперативную поддержку другому офису.

                                            Хотя, я так понимаю, здесь можно на базе веб-интерфейса и парольного доступа к страничке со списком подключенных клиентов аналогично получить доступ к управлению из любого места?
                                          • 0
                                            Где-то была картинка про троллейбус.
                                            Но согласен уметь собрать такую штуку это круто.
                                            Так же подумал о покупке лицензии Teamviewer.
                                            • 0
                                              Так в том-то и дело, что ничего сложного нет — запуск VNC-сервера не сложный, реверсивный туннель — базовая возможность SSH, а остальное — обвязка.
                                            • 0
                                              как решаете проблему VNC с раскладками (переключение, если у клиента и у Ваc на одинаковые хоткеи)?
                                              • 0
                                                tightvnc умеет хорошо работать с раскладками
                                              • 0
                                                Извините, что поднимаю старую тему, но вопрос своей актуальности до сих пор не потерял.
                                                Все попытки до этого так или иначе натыкались на какие-то грабли
                                                Однако буквально только что увидел, что ребята из Контура пользуются VNC для поддержки, скорее всего — сильно допиленный VNC скомпилированный под себя.
                                                Если кому-то интересно — скачать можно на их сайте по ссылке внизу «дистанционная помощь»
                                                https://auth.kontur.ru
                                                Т.е. в принципе это работает…

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