Еще в далеком 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)
l0ser140
14.12.2024 07:10Решал то же самое просто ретрансляцией magic пакета полученного извне на широковещательный адрес локалки.
Можно любой ПК включать, а не прибитый в конфиге mac.
fedorro
14.12.2024 07:10Просто настроил на роутере ВПН-сервер, и включаю\захожу откуда угодно как у себя в локалке)
slavius
14.12.2024 07:10Тут было про
Кнокинг
;)
Это скрывает все порты, все компы.
fedorro
14.12.2024 07:10Кнокинг скрывает открытые порты на внешнем интерфейсе, а в случае с ВПН-сервером на внешнем интерфейсе достаточно держать открытым порт ВПН-сервера. Если совсем не хочется ничего светить, то и его тоже можно скрыть\открыть кнокингом, и никаких скриптов не нужно.
Diyk Автор
14.12.2024 07:10Именно так! В моем случае даже RDP попой в инет торчит, но надежно прикрыт кноком! Так как некогда включать vpn, и работа его в дороге работает крайне нестабильно. А напрямую - вполне жить можно.
swshoo
14.12.2024 07:10для RDP и передачи файлов юзаю ssh сервер Bitvise - бесплатен для частного использования, ставится под винду, прост в настройке, имеет свои алгоритмы сжатия (скорость при передачи файлов очень приятная), защита от DoS и.т.д. - и всё это работает по шустрому ssh тоннелю, что очень радует на "тугих" каналах, где rdp часто отваливается.
omgiafs
14.12.2024 07:10Если роутер на OpenWRT, то просто коннект по ssh с выполнением команды etherwake с MAC-адресом NIC ПК в качестве аргумента. Так банально, что статью не написать.
Alexsey
14.12.2024 07:10А вы любите рисковать я смотрю - выставлять ssh роутера наружу. Даже если там по сертификатам вход.
omgiafs
14.12.2024 07:10Сейчас я вам накину фактов для информации.
SSH на роутере открыт в мир более 15 лет.
SSH висит на нестандартном порту с 5-значным номером.
Логин от рута отключен.
Также на роутере есть скрипт, который при первой же проваленной попытке аутентификации отправляет на отдельный "технический" почтовый ящик сообщение о неудачной попытке входа и атрибутах коннекта - логин, IP.
За всё время эксплуатации этой связки не было буквально ни одного сообщения о неудачных попытках подключения, кроме тех, которые инициированы мной в качестве тестов.
Чувства от этого всего как в анекдоте: "- 5 раз. - А она? - А она не пришла..."
citizen7
14.12.2024 07:10Как такое возможно?) У меня тоже ssh на 5-ти значном порту, каждый день на него стучатся боты. У меня 3 листа, если неудачная авторизация то добавляется в первый лист на 12 часов, если ещё раз неудачная в течении этих 12, то добавляется во второй на 12 часов, и также в третий, если ещё одна неудачная и ip есть в третьем, то на 30 дней в блок. И у меня сейчас в листе блока 22 IP.
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
Diyk Автор
14.12.2024 07:101 Тоже накину немного, одна компания пригласила подработать, ровно через несколько дней как им пришел неадекватный счет за телефонию, во время разбора что случилось, еще почти в каждом компе обнаружил кликеров платных ссылок. Я к чему - я вообще не понимаю зачем делать дырки, списки, чего-то отслеживать, не спать ?
2 Если роутер за НАТом провайдера, это не плохо для защиты, но не панацея, ведь в локалке провайдера тоже есть люди, которые шарят в сетях... Я считаю, что никаких вольностей и русских авось не должно быть. Потому что если "палка" выстрелит, то очень громко и скорее всего больно!
3 Статья то вообще об удаленном включении компа...
omgiafs
14.12.2024 07:10Затем, что мы говорим про домашний роутер. Иногда доступ к нему нужен снаружи. Как это делать и какие риски нести - каждый решает сам.
Лично я доверяю проверенным в боевых условиях решениям, которые благодаря агрессивной среде, в которой они находятся, имеют наивысшую из возможных степень защиты, вылизанный оптимизированный и своевременно обновляющийся код, находящийся в открытом доступе и прошедший многочисленные аудиты. Я говорю про OpenSSH, dropbear и иже с ними.
Если кто-то вместо этого использует чужой проприетарный сервис типа AnуDesk - это его выбор. При условии что тот, кто это делает, вообще понимает, что гоняет свой трафик через сервера третьего лица и у этого лица есть все возможности быть MITM хотя бы для "просто почитать и посмотреть на скриншоты того, что вы там по сети гоняете".
randomsimplenumber
14.12.2024 07:10код, находящийся в открытом доступе и прошедший многочисленные аудиты. Я говорю про OpenSSH,
Было немного смешно. Про баги 10-летней выдержки, которые пару лет назад пофикшены в openssl, вы не слышали? Может этот код прошел какой то аудит, а может и нет. А может в него вольют что-то интересное через атаку на поставки. Как в openssh через уязвимость в библиотеке сжатия, недавно.
randomsimplenumber
Обожаю питоновские однострочники. На python можно писать как на perl ;)
ABATAPA
Нет, с Perl не сравнится.