Для меня никогда не вставал вопрос про RDP, так как постоянно носил с собой ноутбук. Если в студенческие годы таскать на горбу 17 дюймовый Lenovo IdeaPad Z710 почти под 3кг веса (2.9кг) было не сложно, то со временем даже 15 дюймовый HP или 13 дюймовый MacBook Pro стал прилично ощущаться и не в лучшую сторону для моей спины. 

Первая задача: как уменьшить вес, но не потерять в производительности? Для себя я выбрал собрать стационарный компьютер и подключаться к нему с iPad. Эта задача решается достаточно просто. И на ней не будем останавливаться.

Вторая задача: а как, собственно, подключаться? Есть несколько способов: ванильный rdp и сторонние сервисы. Начнем с сервисов. Сразу на ум приходит потрясающая тула TeamViewer. Она потрясающая до того момента, пока ты не узнаешь, какой ты дурак, который не читал лицензионное соглашение. Уехав на неделю в другую страну, с радостью, что проблема решена. И на второй день ловлю бан по железу, так как бесплатная версия запрещает использовать ее для работы. Можно купить лицензию за $130/год, но зачем такие крайности? Дальше мой выбор пал на такие сервисы как no-ip и DynDNS. Первый сразу отпал, так как роутер от моего провайдера (привет UPC) поддерживает только DynDNS. Как бы не хвалили этот сервис, я получил стабильные дисконнекты каждые 5-10 минут. Тут я вспомнил как я не люблю всю продукцию Oracle, а заодно вспомнил про них пару ласковых фраз.

Следующим моим вариантом стал сервис Google Remote Desktop. Именно он меня спас в ту неделю, когда меня забанили TeamViewer, тогда я предусмотрительно его настроил. Казалось бы, вот оно идеальное решение: стабильное подключение, бесплатно, быстрая установка. Но не все так радужно. Изображение не заполняет весь экран и окна часто не подстраиваться под текущее разрешение,  что даже закрыть их становиться проблематично. И тут я вернулся к тому, что решил попробовать первой же попыткой. Перед всей этой эпопеей с сервисами, я решил а вдруг все будет просто и направился в ближайшую точку UPC. В Минске у меня с 2012го года была возможность подключать статический IP у моего провайдера, да что уж там, даже государственный Белтелеком за небольшую сумму предлагал подключить статический IP для индивидуального пользователя. Однако поляки были настолько удивлены вопросом о подключении статического IP для не бизнеса, что был вызван менеджер и за 10 минут он так все равно не понял, зачем физическому лицу может понадобиться статический IP. Естественно ничего у меня не вышло. Ну вот круг замкнулся и я снова тут.

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

Прособирав разные гайды в одном месте я пришел к следующему: 

  1. создал папку shareip в моих документах, где будет происходить все непотребство

  2. Создал в этой папке 3 файла: new_ip.txt, old_ip.txt и getip.bat. В последний помещаем следующую команду, которая получает ваш публичный ip и записывает полученное значение в файл new_ip.txt

nslookup myip.opendns.com resolver1.opendns.com > ./new_ip.txt

  1. Далее создаем скрипт на питоне script.py, который будет вызывать батник с прошлого пункта, проверять поменялся ли ip и, если да, то отправлять обновленный ip мне на почту.

import subprocess
import smtplib


def CheckFile():
    file = open('old_ip.txt', 'r')
    if ip != file.read():
        file.close()
        open('old_ip.txt', 'w').close()
        file = open('old_ip.txt', 'w')
        file.write(ip)
        file.close()
        return True
    return False


def SendMail():
    content = ip
    connection = smtplib.SMTP_SSL('smtp.server', 465)
    connection.login('login, 'password')
    connection.sendmail('sender email', 'recipient email', content)
    connection.quit()


def GetIp():
    open('new_ip.txt', 'w').close()
    subprocess.call('getip.bat')


GetIp()
ip = open('new_ip.txt', 'r').read()

if CheckFile() == True:
    SendMail()
  1. После нужно настроить джобу, которая будет периодически запускать наш скрипт. Для начала создадим файл scheduler.bat. С помощью него мы будем запускать, созданный нами скрипт:

"C:\Python311\python.exe" "C:\Users\User\Documents\shareip\script.py"
pause
  1. Далее запускаем стандартную тулу Task Scheduler -> Action -> Create Task… -> Во вкладке general задаем имя -> Triggers -> New… -> Daily -> Repeat task every: 1 hour for a duration of: Indefinitely. -> Ok. -> Actions -> New… -> Browse -> Указываем путь до scheduler.bat -> Ok -> Ok.

  2. Далее нужно включить RDP на удаленном компьютере. Для windows 11 это Settings -> System -> Remote Desktop -> Remote Desktop -> On. 

  3. Следующий шаг - установить статический ip для своего компьютера в вашей локальной сети. Для этого перейдите Control Panel -> Network and Internet -> Network and Sharing Center -> Change adapter settings -> Выберите свой текущий адаптер и зайдите в свойства. В свойствах найдите пункт Internet Protocol Version 4 (TCP/IPv4). Мой роутер находиться по адресу 192.168.1.1 (адрес своего вы можете узнать на обороте своего роутера, в инструкции или погуглить)

    IP address

    192.168.1.2

    Subnet mask

    255.255.255.0

    Default gateway

    192.168.1.1

    Preferred DNS server

    8.8.4.4

    Alternate DNS server

    8.8.8.8

  4. Далее в настройках роутера вам нужно пробросить ваше устройство с вашим открытым портом в интернет. У меня этот пункт называется NAT где я указываю адрес моего компьютера, протокол и диапазон портов: 192.168.1.2 tcp 3389:3389

  5. Может выйти так, что вы подключаетесь к своему устройству, но на моменте входа в аккаунт - не принимает пароль, так как у вас настроен только Hello PIN. Выполните следующую команду runas /u:MicrosoftAccount\your@email.com cmd.exe вас попросит ввести ваш пароль от аккаунта. После этого все должно заработать

Надеюсь, кому-то этот мини гайд пригодится (за все ошибки извините. Что вы вообще мне сделаете? Я в другом городе :-)

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


  1. Darkholme
    27.05.2023 08:43
    +8

    стабильные дисконнекты каждые 5-10 минут

    А причём здесь DDNS? Что мешало поставить клиент другого DDNS сервиса на ПК?


  1. Foggy4
    27.05.2023 08:43
    +12

    Если провайдер выдает по DHCP "белый IP" , то проще все же DNS сервис настроить, почти все они имеют утилиту, которую можно прямо на комп поставить, если роутер не поддерживает. Сейчас просто многие провайдеры дают IP из приватного диапазона и тогда поможет только TeamViewer и иже с ними.

    " Как бы не хвалили этот сервис, я получил стабильные дисконнекты каждые 5-10 минут. " - не очень понятно, как такое поведение может быть связано с DNS сервисом, вы получаете IP по доменному имени и все, далее DNS сервис в процессе никак не участвует.


    1. dartraiden
      27.05.2023 08:43
      +2

      тогда поможет только TeamViewer и иже с ними

      Либо ZeroTier / Tailscale.


      1. Antra
        27.05.2023 08:43

        И удобство, и безопасность!


  1. Telmah
    27.05.2023 08:43
    +10

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


    1. Konstantinus
      27.05.2023 08:43
      +3

      обычно так делают до первой попытки взлома :)


      1. acyp
        27.05.2023 08:43
        +1

        Простой аналог fail2ban решает проблему брута. Регулярно поосматриваю securelab. Последняя дата уязвимости rdp-СЕРВЕРА с возможностью хоть какого-то доступа датирована 2007тгодом и относилась к rdp 7.0 (кажись).


        1. nidalee
          27.05.2023 08:43
          +2

          Дополню, что под эти цели уже есть софт.

          Так что велосипед повторно можно не изобретать.
          image


          1. Daysleeper
            27.05.2023 08:43

            Remote Desktop Gateway


            1. nidalee
              27.05.2023 08:43

              Это лишний сервер на винде нужен. Не у всех есть.
              Есть, конечно, rdpgw, но там думать надо. :)


        1. SlavikF
          27.05.2023 08:43

          У меня для защиты RDP от brute-force стоит вот это:

          https://github.com/DigitalRuby/IPBan


    1. grvctr Автор
      27.05.2023 08:43

      Я для наглядности оставил в статье стандартный порт)


      1. sergey-kuznetsov
        27.05.2023 08:43
        +1

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


        1. isden
          27.05.2023 08:43

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


          1. Antra
            27.05.2023 08:43

            А если доступ только по сертификату, запрет на пароли?


            1. isden
              27.05.2023 08:43

              Парольный доступ не делаю уже много лет. Но их это не останавливает :)


            1. nidalee
              27.05.2023 08:43

              Они и без паролей вообще пытаются ломиться, с одним юзернеймом.


  1. maxivanuk
    27.05.2023 08:43
    +6

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

    Рекомендую не следовать данному гайду. Да и вообще, как-то сложно.

    Могу порекомендовать для таких случаев сервис ZeroTier - это локалка через интернет без сложных конфигураций... И будет достаточно надёжно.

    Также, могу порекомендовать сервис облачного dns от микротика - там все эти плюшки из коробки (раздел ip-->cloud)

    Ещё, если очень хочется именно открывать порт наружу, читать инструкции по "port knocking"

    А вот открытые порты на маршрутизаторе - закрывайте ????


    1. Darkholme
      27.05.2023 08:43

      С "облачным dns" от mikrotik советую быть предельно осторожным. Он любит отваливаться из-за нагрузки на их сервера, и тогда к серверу вы не подключитесь. Концнепция сама по себе мне нравится и даже сам иногда пользуюсь, но лучше для резерва подключить тот же no-ip либо другого провайдера DDNS. А вот port knocking советую всем, жаль что не все хотят пошевелить пальцами и извилинами 10 минут. Но справедливости ради, оно не всегда удобно и нужно таскать всегда с собой скрипт или клиент.


  1. nbkgroup
    27.05.2023 08:43
    +6

    Выставлять голый RDP на статическом IP в сеть — это безумие. Да и на динамическом тоже.

    А если серый IP от CGNAT будет — вообще работать будет невозможно.


  1. avelor
    27.05.2023 08:43
    +7

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

    Альтернативно универсальный вариант - со своей виртуалкой где-нить в аренде, туннель до неё из дома и с планшета/ноутбука.

    А ваш вариант подойдёт в редких случаях когда имеем публичный адрес на оьорудовании, но и да, есть варианты более простые, без велосипеда. Но с открытым рдп наружу как минимум используйте fail2ban решения и нестандартный порт (всё равно будут брутфорсить и проверять на уязвимости:) ). Не лишним будет подумать про MFA на rdp. Но и потом усё равно перейти на впн:)


  1. Kotofay
    27.05.2023 08:43
    +3

    Чего только не придумают, лишь бы не ставить Tailscale.


    1. Johan_Palych
      27.05.2023 08:43
      +1

      Tailscale - самый быстрый вариант c Free-планом. Подробные доки.
      Headscale(An open source, self-hosted implementation of the Tailscale control server)
      ZeroTier


      1. Kotofay
        27.05.2023 08:43

        Дольше скачивать чем запустить RDP через него.


    1. Salavat
      27.05.2023 08:43

      Верно. Дополню еще: комп выключаю. Постоянно включен rasp pi еще первая версия тоже с Tailscale. Через него смотрю камеру и также могу включить комп. Далее уже по rdp можно подключиться к компу с Tailscale, сделать дела, выключить. С телефона тоже удобно.


  1. Konstantinus
    27.05.2023 08:43
    +1

    Некоторое время использовал подобный способ повесим RDP на нестандартный порт. Со временем Виндоус отказался меня авторизировать из-за слишком частых попыток авторизации.
    То есть логин/пароль у меня были сохранены и корректны. Но злоумышленники вычислив что на порту слушает rpd-сервер, брутфорсом пытались взломать систему.

    Компьютер к которому подключались показывал 30-50% загрузку процессора в момент простоя.

    Добавил на роутере правило что подключение происходить только с белого списка IP - и все проблемы ушли.


    1. Darkholme
      27.05.2023 08:43

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

      upd: если у вас mikrotik то сама судьба говорит что нужно использовать. Если что попрощо - VPN сервер и погнали.


      1. Konstantinus
        27.05.2023 08:43

        У меня Микротик. В правиле прописал условие что проброс только для этих Scr. Address.


    1. nUser123
      27.05.2023 08:43

      SSH туннель еще можно прокинуть


      1. Antra
        27.05.2023 08:43

        Кстати да. Если не хочется заморачиваться с полноценным VPN, уж хотя бы прокинуть SSH туннель с сертификатом и уже внутри подключаться по RDP. Но никак не сам RDP порт выставлять публично.

        Тем более, что даже на винде можно OpenSSH.Server штатно развернуть. Со всякими C:\Users\user1\.ssh\authorized_keys и т.п.


  1. vadimr
    27.05.2023 08:43
    +1

    Статический ip стоит недорого, а решает очень много проблем. Ну и белый список для соединений, конечно.


  1. maledog
    27.05.2023 08:43
    +4

    Какая-то матрешка. Раз уж используем python, что мешало из него же вызвать nslookup и прочитать stdout, чтобы не возиться с временным файлом? Не говоря уже о том что существуют более простые способы получить свой ip, например "curl https://yoip.ru/api/" .


  1. kale
    27.05.2023 08:43

    Более 20 лет назад такое на bat файлах для radmin делал)) Классический костыль


  1. Felin
    27.05.2023 08:43

    @grvctr
    https://so-viewer.com/ вам в помощь
    бесплатный, без ограничений, не благодарите.


  1. grigr
    27.05.2023 08:43

    Anydesk - отличная замена тимвьера, не жадный.


    1. DungeonLords
      27.05.2023 08:43

      А что у Anydesk с поддержкой Wayland?


  1. vvzvlad
    27.05.2023 08:43
    +1

    Боже. Почему не VPN/Zerotier/Tailscale? Почему не белый IP? Зачем извращаться? Зачем делать дырку в безопасности? Почему скрипт такой кривой? Зачем статический IP в локалке? Виндузятники..


  1. nevzorofff
    27.05.2023 08:43
    +1

    Вы реализовали тот же самый dyndns, который никак не мог быть источником обрывов.

    Он не выполняет функции VPN, а делает то же, что и ваш скрипт - сообщает вашему клиенту RDP IP адрес вашего компьютера с RDP.


  1. xkb45bkc4
    27.05.2023 08:43

    А если поставить Hamachi, то два ПК будут в одной сети, причем подойдет любой серый ip от провайдера, ну а дальше уже RDP?


  1. Hu3yP7
    27.05.2023 08:43

    Странно что никто не упомянул Parsec.


  1. alexander222
    27.05.2023 08:43
    -2

    Лет пятнадцать назад, когда был молодым и не опытным, решал эту проблему скриптом на сайте, который с параметром ?set записывал ip с котороко его вызвали, а с параметром ?get отдавал. Дома прописал в планировщик раз в минуту дергать скрипт на серевере, а когда было нужно заходил смотрел ip


  1. hulitolku
    27.05.2023 08:43

    Rdp лучше использовать в связке с wireguard.


  1. samponet
    27.05.2023 08:43

    Я что-то не понял- вся эта возня для того, чтобы предоставить доступ к своему компьютеру? Или таки к клиентскому? Если к своему, то это не сработает в сетях сотовых и большинства наземных провайдеров, ибо те и те предоставляют доступ через NAT и все dinDNS курят в сторонке. Самый простой способ, как говорили выше, тайлскейл. Если для клиентов, то там то же самое, так что легче дать им ссылку на клиента, развернув у себя что-то вроде Mesh и не мучится больше.
    Читая статью, я думал вот нашелся парень, который запросто без танцев с бубуном умеет пробрасывать RDP до любого клиента, а оно вон чего оказывается.


    1. MozgFx
      27.05.2023 08:43

      А что у вас за серые провайдеры наземные?


      1. samponet
        27.05.2023 08:43

        В смысле? Два крупных прова в городе дают клиентам адреса 10.*.*.*, тут dinDNS не поможет. РТ давал аналогично из 172 сети, сейчас не знаю. ОПСОСы аналогично дают только за NAT, белые только юрикам.


    1. Antra
      27.05.2023 08:43

      Как в tailscale выглядит процедура "подключения"? Действительно достаточно дать ссылку на клиента?

      В свое время у меня сложилось впечатление, что на клиенте нужно ввести пароль от аккаунта, что меня категорически не устраивало для "подключить друга". Я про бесплатную версию, конечно, в энтерпрайзах понятно что хоть SSO делай.

      В обшем, по этой причине я выбрал ZeroTier, где достаточно передать номер сети, а финально подтверждаешь подключение сам, в своей админке.

      Как сейчас? Так-то Wireguard мне очень нравится. (Еще бы не ругался периодически на винде, что не может создать адаптер, совсем было бы хорошо)


      1. samponet
        27.05.2023 08:43

        Относительно tailscale я имел в виду именно для себя, для объединения своих ресурсов в одну сеть. Для клиентов конечно это не подходит именно из-за авторизации в аккаунте. Да для клиентов, по большому счету, и не надо их в одну сеть объединять,слишком заморочисто с точки зрения безопасности. Однако Meshcentral поддерживает маршрутизацию RDP до клиента, не без костыля, но реально.


  1. MozgFx
    27.05.2023 08:43

    Тулза и тулса я ещё понимаю коверканное от английского слова tools... утилиты. Но "тула" Карл... это что...? И ещё "джоба"? Почему задача называется джобой... Почему планировщиком не управляете через командную строку? ведь все очень просто!


  1. MozgFx
    27.05.2023 08:43

    Автор можно я сокращу твой мануал до нескольких строк.

    1 пробрасываем порты на роутере и резервирует ip внутри сети, разрешаем rdp

    2 настраиваем dyndns (или что там у вас за сервис) вышеупомянутый вам даже почта не нужна, достаточно знать dns имя.

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

    4 при подключении используем тот ip что выдал нам ping. Порт который вы указали при настройке роутера.

    Работает при наличии белого IP.


  1. slavius
    27.05.2023 08:43

    Может http://litemanager.ru/ спасёт? Есть для всех платформ.