Еще в далеком 2016 году хабровчанин Александр Корюкин @GeXoGeN реализовал интересный проект по удаленному включению домашнего компа. Ссылка на статью. Само направление мысли правильное, так как очень востребованное! Критику пропускаем и сразу переходим к рассмотрению другого варианта скрипта для удаленного включения компа.

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

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

В виду разъездной работы имеется под рукой только смартфон. Чтобы срочно заскочить на необходимой компьютер, я использую программу Кнокинга для прохождения фейс-контроля, многие для удобства сами могут запустить нужную программу типа того же Удаленного рабочего стола. Не буду разжевывать что за Кногинги, полистайте инет самостоятельно, если не знакомы с такой темой. Как только я прошел проверку свой-чужой, срабатывание NAT пишет событие в лог определенную запись:  мак-адрес компа на который идет перенаправление, с префиксом «mac:».  Этот префикс играет ключевую роль, именно ее скрипт ищет в логах.

Пример подключения на рабочий стол
Пример подключения на рабочий стол

В этом окне заносим и ip-адрес и мак компьютера. Соответственно ip-адрес должен быть в статике!

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

Далее разберем тело скрипта.

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

:local X "$[:pic [/system clock get time ] 0 7 ]";

:local Y "$[:pic ([/system clock get time ] - 00:00:10 ) 0 7 ]";

Захватываю текущее время в переменные "X" и "Y", причем время Y убавляем на 10 секунд!, и пиканьем обрезаем последнюю цифру у обоих переменных. Для чего же это нужно? А необходимо это для команды "find", которая единственная умеет быстро искать что либо в логах, да еще с применением каких-никаких регулярок! (условие было простота, надежность, а главное скорость), и ядро получилось:

log find time~"$X|$Y"&&message~"^mac:"

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

:foreach i in=[ log find time~"$X|$Y"&&message~"^mac:"] do={

Если есть совпадение, переменной " i " присваивается номер строки и далее выковыриваем из содержимого ( колонка Message ) в переменную "m" мак-адрес, указанный в лог-префиксе NAT-а :

:foreach m in="$[:pic [log get [ find .id="$i" ] value-name=message ] 4 21 ]" do={

А переменная "m" уже используется по прямому назначению:

:log warning "Включатель компов: $m";      :tool wol interface="bridge1" mac="$m"

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

:local X "$[:pic [/system clock get time ] 0 7 ]";        :local Y "$[:pic ([/system clock get time ]  - 00:00:10 ) 0 7 ]";

:foreach i in=[ log find time~"$X|$Y"&&message~"^mac:"] do={:foreach m in="$[:pic [log get [ find .id="$i" ] value-name=message ] 4 21 ]" do={:log warning "Включатель компов: $m";      :tool wol interface="bridge1" mac="$m";}}};
и визуально
и визуально

Пример как это работает со смартфона

Стоит также упомянуть, что если у вас старенький / слабенький борд, для увеличения скорости имеет смысл убавить количество строк в логах. К примеру на RB951 рекомендую оставить не больше 300-500 строк. А бывалые микротофилы могут спокойно за автоматизировать настройку лог-префиксов для правил NAT! Но это уже другая история. Если кому пригодиться - дерзайте!

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


  1. randomsimplenumber
    14.12.2024 07:10

    Обожаю питоновские однострочники. На python можно писать как на perl ;)


    1. ABATAPA
      14.12.2024 07:10

      Нет, с Perl не сравнится.


  1. l0ser140
    14.12.2024 07:10

    Решал то же самое просто ретрансляцией magic пакета полученного извне на широковещательный адрес локалки.

    Можно любой ПК включать, а не прибитый в конфиге mac.


    1. fedorro
      14.12.2024 07:10

      Просто настроил на роутере ВПН-сервер, и включаю\захожу откуда угодно как у себя в локалке)


      1. slavius
        14.12.2024 07:10

        Тут было про

        Кнокинг

        ;)

        Это скрывает все порты, все компы.


        1. fedorro
          14.12.2024 07:10

          Кнокинг скрывает открытые порты на внешнем интерфейсе, а в случае с ВПН-сервером на внешнем интерфейсе достаточно держать открытым порт ВПН-сервера. Если совсем не хочется ничего светить, то и его тоже можно скрыть\открыть кнокингом, и никаких скриптов не нужно.


          1. Diyk Автор
            14.12.2024 07:10

            Именно так! В моем случае даже RDP попой в инет торчит, но надежно прикрыт кноком! Так как некогда включать vpn, и работа его в дороге работает крайне нестабильно. А напрямую - вполне жить можно.


            1. swshoo
              14.12.2024 07:10

              для RDP и передачи файлов юзаю ssh сервер Bitvise - бесплатен для частного использования, ставится под винду, прост в настройке, имеет свои алгоритмы сжатия (скорость при передачи файлов очень приятная), защита от DoS и.т.д. - и всё это работает по шустрому ssh тоннелю, что очень радует на "тугих" каналах, где rdp часто отваливается.


  1. omonraa
    14.12.2024 07:10

    ключевое слово - статический ip.

    анидеск поставил и не парюсь.

    ему пофиг на статику.


    1. Ambulate
      14.12.2024 07:10

      Светишь данными третьим лицам?


      1. swshoo
        14.12.2024 07:10

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


    1. Diyk Автор
      14.12.2024 07:10

      В самом начале говорится, что никаких посредников (особенно таких посредственных, и денег просящих), к тому же ани с наружи не включит тебе комп


  1. omgiafs
    14.12.2024 07:10

    Если роутер на OpenWRT, то просто коннект по ssh с выполнением команды etherwake с MAC-адресом NIC ПК в качестве аргумента. Так банально, что статью не написать.


    1. Alexsey
      14.12.2024 07:10

      А вы любите рисковать я смотрю - выставлять ssh роутера наружу. Даже если там по сертификатам вход.


      1. Ambulate
        14.12.2024 07:10

        У автора ещё хуже - дырявый микротик


        1. Diyk Автор
          14.12.2024 07:10

          Прошу прощения! А в каком месте вы увидели дырки? В том месте где говорилось что именно безопасность сохранялась?


        1. swshoo
          14.12.2024 07:10

          много возможностей (ros), много печалей, если не понимаешь, что делаешь -)


      1. omgiafs
        14.12.2024 07:10

        Сейчас я вам накину фактов для информации.

        1. SSH на роутере открыт в мир более 15 лет.

        2. SSH висит на нестандартном порту с 5-значным номером.

        3. Логин от рута отключен.

        4. Также на роутере есть скрипт, который при первой же проваленной попытке аутентификации отправляет на отдельный "технический" почтовый ящик сообщение о неудачной попытке входа и атрибутах коннекта - логин, IP.

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

        Чувства от этого всего как в анекдоте: "- 5 раз. - А она? - А она не пришла..."


        1. citizen7
          14.12.2024 07:10

          Как такое возможно?) У меня тоже ssh на 5-ти значном порту, каждый день на него стучатся боты. У меня 3 листа, если неудачная авторизация то добавляется в первый лист на 12 часов, если ещё раз неудачная в течении этих 12, то добавляется во второй на 12 часов, и также в третий, если ещё одна неудачная и ip есть в третьем, то на 30 дней в блок. И у меня сейчас в листе блока 22 IP.


          1. omgiafs
            14.12.2024 07:10

            Не знаю. Просто оно так. Может у вас порт недостаточно пятизначный? Например какой-нибудь популярный 10080 или 10808 вместо 57952? Первые два из примера щупают все кому не лень.

            Вот лог самый свежий. Все сообщения о коннекте с локального IP - это мой Zabbix порты щупает. Последнее сообщение -это я на роутер зашёл. А больше в логе ничего нет...

            Лог

            Sun Dec 15 10:17:38 2024 authpriv.info dropbear[5991]: Child connection from 192.168.1.116:54212
            Sun Dec 15 10:17:38 2024 authpriv.info dropbear[5991]: Exit before auth from <192.168.1.116:54212>: Exited normally
            Sun Dec 15 10:22:38 2024 authpriv.info dropbear[6051]: Child connection from 192.168.1.116:50530
            Sun Dec 15 10:22:38 2024 authpriv.info dropbear[6051]: Exit before auth from <192.168.1.116:50530>: Exited normally
            Sun Dec 15 10:27:38 2024 authpriv.info dropbear[6086]: Child connection from 192.168.1.116:56334
            Sun Dec 15 10:27:38 2024 authpriv.info dropbear[6086]: Exit before auth from <192.168.1.116:56334>: Exited normally
            Sun Dec 15 10:32:38 2024 authpriv.info dropbear[6140]: Child connection from 192.168.1.116:35138
            Sun Dec 15 10:32:38 2024 authpriv.info dropbear[6140]: Exit before auth from <192.168.1.116:35138>: Exited normally
            Sun Dec 15 10:37:38 2024 authpriv.info dropbear[6187]: Child connection from 192.168.1.116:33992
            Sun Dec 15 10:37:38 2024 authpriv.info dropbear[6187]: Exit before auth from <192.168.1.116:33992>: Exited normally
            Sun Dec 15 10:42:38 2024 authpriv.info dropbear[6231]: Child connection from 192.168.1.116:33424
            Sun Dec 15 10:42:38 2024 authpriv.info dropbear[6231]: Exit before auth from <192.168.1.116:33424>: Exited normally
            Sun Dec 15 10:47:38 2024 authpriv.info dropbear[6284]: Child connection from 192.168.1.116:54548
            Sun Dec 15 10:47:38 2024 authpriv.info dropbear[6284]: Exit before auth from <192.168.1.116:54548>: Exited normally
            Sun Dec 15 10:52:38 2024 authpriv.info dropbear[6328]: Child connection from 192.168.1.116:41320
            Sun Dec 15 10:52:38 2024 authpriv.info dropbear[6328]: Exit before auth from <192.168.1.116:41320>: Exited normally
            Sun Dec 15 10:52:56 2024 authpriv.info dropbear[6333]: Child connection from 192.168.1.101:6097
            Sun Dec 15 10:52:56 2024 authpriv.notice dropbear[6333]: Pubkey auth succeeded for 'REDACTED' with ssh-ed25519 key SHA256:Un/v6wn7CuwREDACTED5+5/wluTREDACTEDgaoU8n9U from 192.168.1.101:6097


        1. Diyk Автор
          14.12.2024 07:10

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

          2 Если роутер за НАТом провайдера, это не плохо для защиты, но не панацея, ведь в локалке провайдера тоже есть люди, которые шарят в сетях... Я считаю, что никаких вольностей и русских авось не должно быть. Потому что если "палка" выстрелит, то очень громко и скорее всего больно!

          3 Статья то вообще об удаленном включении компа...


          1. omgiafs
            14.12.2024 07:10

            Затем, что мы говорим про домашний роутер. Иногда доступ к нему нужен снаружи. Как это делать и какие риски нести - каждый решает сам.

            Лично я доверяю проверенным в боевых условиях решениям, которые благодаря агрессивной среде, в которой они находятся, имеют наивысшую из возможных степень защиты, вылизанный оптимизированный и своевременно обновляющийся код, находящийся в открытом доступе и прошедший многочисленные аудиты. Я говорю про OpenSSH, dropbear и иже с ними.

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


            1. randomsimplenumber
              14.12.2024 07:10

              код, находящийся в открытом доступе и прошедший многочисленные аудиты. Я говорю про OpenSSH,

              Было немного смешно. Про баги 10-летней выдержки, которые пару лет назад пофикшены в openssl, вы не слышали? Может этот код прошел какой то аудит, а может и нет. А может в него вольют что-то интересное через атаку на поставки. Как в openssh через уязвимость в библиотеке сжатия, недавно.


            1. Alexsey
              14.12.2024 07:10

              OpenSSH

              CVE-2024-6387