Удалённое управление устройством на OpenWrt с помощью чатов (Telegram, XMPP) и EMail
Устройство (роутер) может оправлять оповещения и получать команды прямо к вам в месенджер или на электронную почту.
Как отправить почту смотрите в статье про SMTP клиенты.
Получение писем с командами возможно с помощью SMTP сервера, например postfix
(популярный но сложный в настройке) или E-MailRelay и с помощью своих скриптов можно обрабатывать команды.
Но в целом почтовый сервер использовать проблематично из-за множества ограничений: ему нужен статический адрес, провайдеры интернета часто блокируют 25тый порт SMTP, много спама и проблема с DDoS.
Telegram
Наиболее вменяемый и часто используемуй способ. У Телеграмма роскошное АПИ для ботов с которым удобно работать через простое HTTP API с долгим ожиданием (long pooling). Например чтобы боту отправить сообщение достаточно отправить POST запрос:
TOKEN="токен вашего бота" CHAT_ID="id чата между пользователем и ботом" MSG="сообщение" wget -q -O - --post-data="chat_id=$CHAT_ID&text=$MSG" "https://api.telegram.org/bot$TOKEN/sendMessage"
Если интересно разобраться читайте Простой телеграмм бот на sh, или ещё одно применение старому роутеру.
Есть уже готовый бот alexwbaule/telegramopenwrt использующий curl
(установите с помощью opkg update; opkg install curl
) с множеством команд:
- cam_movie: Record 25 seconds of a camIP and send it.
- cam_mv: Move the camera around.
- cam_shot: Get a Pic from the camera.
- cam_vdo: Get a 25 seconds record from a camIP.
- chromego_add: Include to a user in chromego, a word to be used in permissions (block url/YouTube channel/etc).
- chromego_del: Remove a word from a user in chromego to be used in permissions (block url/YouTube channel/etc).
- chromego_list: List all permissions in chromego (block url/YouTube channel/etc).
- fw_add: Block a hostname using a deny rule in firewall, if append time to command will block from 23:00 to 8:00
- fw_delete: Remove a hostname from a deny firewall rule, if hostname is empty, will remove all rules created by this bot.
- fw_disable: Disable a firewall rule.
- fw_enable: Enable a firewall rule.
- fw_list: List all fw rules.
- fwr_disable: Disable a redirect firewall rule.
- fwr_enable: Enable a redirect firewall rule.
- fwr_list: List all redirect fw rules.
- fw_unblock: Remove a hostname from a deny firewall rule, if hostname is empty, will remove all rules created by this bot.
- get_ip: Get WAN IPAddress.
- get_mac: Get the Organization that own the MacAddr.
- get_ping: Ping an address or host, return Up or Down.
- get_uptime: Return the uptime from this Device.
- hst_list: Get hosts in the dhcp Leases. If a hostname is present, search only for this hostname.
- ignoredmac_add: Add a new macaddress to the allowlist and avoid being notified about it.
- ignoredmac_list: Shows the list of ignored mac addresses that will not be notified by the bot.
- interface_down: Shutdown an interface by name.
- interface_restart: Restart an interface by name.
- interfaces_list: Get interfaces configuration.
- interface_up: Start up an interface by name.
- lights: Turn On or Off house Lights.
- msg_tv: Send Message to Samsung TV
- netstat: Prints netstat table in ESTABLISHED, CLOSED and TIME_WAIT State.
- opkg_install: Install a package from opkg.
- opkg_update: Update list of packages available.
- ping_udp: Create a UDP packet to puncture a hole through a NAT firewall of your ISP
- proc_list: List all process in execution
- proc_restart: Restart a process in init.d
- proc_start: Start a process in init.d
- proc_stop: Stop a process in init.d
- proxy_disable: Disable HTTP and HTTPS or HTTP or HTTPS proxy.
- proxy_enable: Enable HTTP and HTTPS or HTTP or HTTPS proxy.
- proxy_list: List proxy rules that is enabled.
- reboot: Reboot the router.
- start: This menu help!
- swports_list: Switch ports list with states.
- wifi_disable: Disable a wireless device radio.
- wifi_enable: Enable a wireless device radio.
- wifi_list: List all wireless devices.
- wifi_restart: Restart a wireless device radio.
- wll_list: Get a Wi-Fi clients list that is connected to this device
Есть ещё один бот https://github.com/varakh/tlgbot. Он посвежее и русифицированный но он зачем-то использует bash (который ещё устанавливать нужно) и функционал скромнее.
Важно понимать что бот всё же ограничен в том что он может делать. Сквозного шифрования при этом нет, если кто-то взломает ваш Телеграмм он может вам попортить роутер и жизнь.
XMPP
XMPP (Jabber) плохо поддерживается но это потенциально самый безопасный способ. Вы можете установить Prosody XMPP серве и с небольшыми скриптами на Луа использовать его и как клиент.
Есть sendxmpp скрипт на perl чтобы отправлять сообщения по xmpp, похожий на sendmail. Чтобы отправлять сообщения через HTTP API с помощью wget
или curl
вы можете установить плагин REST API на ваш XMPP server (mod_http_rest для Prosody). Возможно XEP-0124 BOSH позволяет отправлять так сообщения.
- xmppcd Небольой демон XMPP клиента
UnifiedPush
UnifiedPush это открытая спецификация и инструменты которые позволяют пользователю выбрать как пуш оповещения будут доставляться. Его поддерживают различные приложения:
- ntfy.sh (произносится как “notify, нотифай”) это сервис оповещений Издатель — Подписчик (англ. publisher-subscriber; pub/sub) поверх HTTP протокола. Он позволяет вам отправлять оповещения на ваш телефон или компьютер с помощью скриптов с любого устройства используя REST API. У него есть приложения для Android и iOS.
- Тоже самое но я хочу использовать Google по какой-то причине: gCompat-UP Distrib (Android)
- У меня есть сервер Nextcloud: NextPush (Android)
- Я использую XMPP клиент Conversations: Conversations (Android)
Отправка оповещений через ntfy.sh
Пример скрипта для отправки пуш нотификаций через ntfy.sh в очередь example (вам следует создать свою личную очередь):
NTFY_QUEUE="example" NEW_CLIENT_IP="192.168.1.42" MSG="Someone joined network A new client with IP $NEW_CLIENT_IP joined. Please check if it's not an intruder." wget -q -O - "ntfy.sh/$NTFY_QUEUE" \ --header "Priority: urgent" \ --header "Tags: ghost" \ --header "Click: http://192.168.1.1/" \ --header "Actions: http, Open Luci, https://192.168.1.1/cgi-bin/ntfy-action.cgi?block=$NEW_CLIENT_IP, clear=true" \ --header "Email: root@OpenWrt" \ --post-data="$MSG"
ВНИМАНИЕ: опция --header
была добавлена в uclient-fetch
только в июле 2024 поэтому если вы желаете использовать расширенные свойства вам следует установить пакет wget-ssl
.