Управление сетевыми устройствами: Orange Pi, OpenWRT и Python

Автор — Александр Простак

Программист ООО «СМАРТС-Кванттелеком»

Современный мир интернета вещей (IoT) и смарт-устройств требует гибкости и мощности при управлении сетевым оборудованием. Найти подходящее решение, сочетающее в себе одновременно простоту, надежность и доступность, может быть сложной задачей. Сегодня я хочу рассмотреть одну из таких комбинаций: одноплатный компьютер Orange Pi с операционкой OpenWRT + Python.

Orange Pi — мощная и компактная альтернатива другим одноплатным компьютерам. Он обладает большой вычислительной мощностью, расширяемыми возможностями и множеством интерфейсов. OpenWRT, в свою очередь, легкая и гибкая ОС, специально разработанная для маршрутизаторов и сетевых устройств. ОС предлагает широкие возможности настройки и расширения сетевых функций. Ну и Python — один из самых популярных языков программирования в мире, предоставляет простоту и эффективность для разработки скриптов и автоматизации задач.

Рассмотрим использование Orange Pi с установленной на нем OpenWRT и разработанном на языке Python скрипте. Имея под рукой такие инструменты, попробуем создать собственную сетевую систему управления! В конечном итоге, вы сможете самостоятельно и легко воспроизвести этот пример и адаптировать его под свои нужды, открывая новые возможности в области управления сетевыми устройствами.

Итак, мы имеем:

Orange Pi R1 Plus LTS

Одноплатный ПэКа Orange Pi R1 Plus LTS — оказался под рукой и стал подопытным для реализации проектов, связанных с управлением сетевыми устройствами. Вот некоторые из его особенностей.

Плюсы:

1.       Вычислительная мощь: 4-ядерный проц ARM Cortex-A53 с тактовой частотой до 1.5 ГГц, достаточно неплохая производительность для выполнения различных задач и обработки данных, не только сетевых.

2.       Поддержка сети: на борту Ethernet-порты 10M/100M/1000M Ethernet (YT8531C) и 10M/100M/1000M USB Ethernet (на чипе RTL8153B).

3.       Расширяемость: «О»–пельсинка имеет различные интерфейсы, такие как USB-порт, USB Type-C порт (для питания) и слот для microSD-карт, что существенно прокачивает возможности по расширению и подключению внешних устройств.

4.       Поддержка операционной системы OpenWRT: поддержка OpenWRT — это то, что надо для стабильности и гибкости в управлении сетевыми функциями.

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

Минусы:

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

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

Использование Orange Pi R1 Plus LTS в связке с операционной системой OpenWRT и скриптами на Python позволяет создать мощную и гибкую сетевую систему управления. Это открывает широкие возможности для реализации различных проектов, связанных с IoT, автоматизацией и сетевой инфраструктурой.

OpenWRT

Многие уже слышали и знают, что это такое, поэтому вкратце: ОС OpenWRT является мощным инструментом для управления сетевыми устройствами и роутерами. Многие умельцы их накатывают на домашние роутеры, существенно расширяющие их функционал. Основные характеристики ОС.

Плюсы:

1.       Гибкость и настраиваемость: OpenWRT предоставляет широкие возможности для настройки и конфигурации сетевых функций. Вы можете выбрать только те компоненты и пакеты, которые вам нужны, и создать оптимальное решение для своих потребностей. Это обеспечивает гибкость и экономию ресурсов.

2.       Активное сообщество и поддержка: OpenWRT имеет большое сообщество разработчиков и пользователей, которые активно вносят вклад в его развитие. Это означает наличие обширной документации, форумов поддержки и регулярных обновлений, что облегчает работу с этой операционкой.

3.       Мощные сетевые возможности: OpenWRT предлагает широкий спектр функций и протоколов для управления сетевыми устройствами, включая маршрутизацию, межсетевое экранирование (firewall), VPN, QoS и другие. Вы можете создавать сложные сетевые конфигурации и обеспечивать высокую степень безопасности и производительности.

4.       Поддержка различных аппаратных платформ: OpenWRT совместима с множеством аппаратных платформ и архитектур, что позволяет использовать её на широком спектре сетевых устройств и роутеров.

Минусы:

1.       Сложность для новичков: изначально OpenWRT может показаться сложной для новичков в области сетевых технологий и Линукса. Требуется некоторое время и изучение, чтобы стать более опытным пользователем и использовать всю мощь этой операционной системы.

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

OpenWRT является рекомендуемой операционкой для одноплатников Orange Pi, включая модель Orange Pi R1 Plus LTS. Создатели Оранжа активно используют и рекомендуют OpenWRT в своих руководствах пользователя. Это подтверждает сочетание надежности и совместимости между OpenWRT и Orange Pi, что обеспечивает стабильную и эффективную работу сетевых устройств.

Python

Пайтон является мощным и мейнстримным языком программирования. Он предоставляет широкие возможности для сетевого взаимодействия. Вот некоторые из его плюсов и минусов, связанных с сетевым программированием.

Плюсы:

1.       Простота использования: Пайтон обладает простым и понятным синтаксисом, который делает его доступным для новичков и упрощает разработку и отладку кода для сетевого взаимодействия.

2.       Богатая стандартная библиотека: Python поставляется с обширной стандартной библиотекой, которая содержит модули и инструменты для работы с различными сетевыми протоколами, включая UDP. Это облегчает разработку сетевых приложений и сокращает время разработки.

3.       Кроссплатформенность: Python поддерживается на различных операционках, что делает его универсальным выбором для создания платформонезависимых сетевых приложений. Вам не придется переписывать код для каждой платформы отдельно.

4.       Поддержка сокетов: Python предоставляет мощный и удобный API для работы с сокетами, что облегчает создание и управление сетевыми соединениями на различных уровнях, включая UDP. Вы можете использовать сокеты для отправки и приема пакетов данных по сети.

Минусы:

1.       Относительная медлительность: Пайтон может быть несколько медленнее по сравнению с некоторыми другими языками программирования, такими как C или C++, особенно при работе с высоконагруженными сетевыми приложениями. Однако, для большинства сетевых задач этот недостаток несущественен.

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

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

Пример реализации

В нашем конкретном примере требовалось написать подобие сервера, связанного с одной стороны с управляемым устройством через Ethernet напрямую, а с другой стороны с пользователями — находящимися в одной подсети с одноплатником.

В ходе работы выяснились некоторые не самые очевидные моменты, которые я и опишу.

Для начала нужно было выбрать, какую версию операционки использовать и понять, как создать загрузочную microSD-карту.

В итоге оптимальным выбором стала ОС OpenWRT версии 21.02.1 с сайта самих разработчиков Orange Pi.

Для форматирования microSD-карты использовалась утилита SD Card Formatter. После того, как microSD карта вставлена в ПэКа, необходимо выбрать ее в выпадающем списке, затем нажать «Format» и согласиться с форматированием.

e5a065871d8bfbccad9a3bce9d5aba74.png

Для загрузки образа OpenWRT на микросд-карту использовалась утилита Win32DiskImager. Необходимо указать путь до образа OpenWRT, выбрать отформатированную microSD-карту из выпадающего списка и нажать «Write». После завершения процесса, нажать «Exit», и вставить microSD-карту в Оранж.

c623c8e45e6dc82bbb4e72b31ca14477.png

После включения Orange Pi, самым простым способом подключения к нему является подключение по SSH. Итак, по умолчанию LAN-порт имеет статический айпишник 192.168.2.1. На одной из сетевых карт ПК необходимо изменить сетевые настройки так, чтобы ПК находился в одной подсети с LAN-портом Оранжа. К примеру, можно выставить следующий айпи — 192.168.2.2.

33dba670f6f67b0d44dc4a27e22eadaf.png

После этого нужно соединить порт настроенной сетевой карты ПК и LAN-порт Orange Pi. Далее подключение будет производиться через командную строку Винды. По умолчанию для SSH подключения установлен логин root и пустой пароль. То есть, для подключения достаточно в командной строке ввести следующую команду:

ssh root@192.168.2.1

Далее возникла потребность поменять айпишник LAN-порта Оранжа на 192.168.0.1. Добиться этого можно следующими командами:

uci set network.lan.ipaddr=»192.168.0.1»

uci commit

ubus call network restart

Теперь у нас есть настроенный LAN-порт. Но для связи с пользователями будет использоваться WAN-порт. Необходимо подключить WAN-порт к коммутатору, чтобы получить IP адрес из той же подсети, к которой подключены остальные юзеры. После чего узнать полученный айпи можно командой ifconfig, интересующий нас интерфейс — eth0. В итоге сетевые настройки будут иметь следующий вид:

90464a67b970eef9603665f6bf80393a.png

Для установки пакетов в OpenWRT используется менеджер пакетов opkg. Интерпретатор Пайтон можно установить следующими командами:

opkg update

opkg install python3

Установленная версия python — 3.9.16, это нужно учитывать при написании скрипта.

В нашем проекте был необходим внешний накопитель — автоматическое монтирование в необходимую директорию можно сделать, редактируя файл /etc/config/fstab.

c3dd623a2420562ebea6744c7cb10276.png

Последнее приготовление, касаемое OpenWRT — добавить написанный скрипт в автозагрузку операционки. Для этого необходимо в каталоге /etc/init.d создать файл (например, с именем example), в котором будут содержаться скрипты, выполняемые при запуске и остановке работы операционной системы. После создания файла, разрешить его исполнение для всех групп пользователей командой:

chmod +x /etc/init.d/example

Пример содержимого файла автозагрузки приведен ниже:

f722d090e8c4b7cd38e2257297427d4a.png

Разберем содержимое файла. Первая строка — это строка shebang, которая используется /etc/rc.common в качестве оболочки для обеспечения своей основной функциональности и функций по умолчанию, а также для проверки сценария перед выполнением.

По этому rc.common шаблону доступны следующие команды для сценариев инициализации:

1.       start — Запустить службу.

2.       stop — Остановить службу.

3.       restart — Перезапустить службу.

4.       reload — Перезагрузить файлы конфигурации (или перезапустить, если это не удается).

5.       enable — Включить автозапуск службы.

6.       disable — Отключить автозапуск службы.

Все эти аргументы могут быть переданы сценарию при запуске. Например, чтобы перезапустить службу, вызовите ее с помощью restart:

/etc/init.d/example restart

Необходимые функции start () и stop () в сценарии определяют основные шаги, необходимые для запуска и остановки этой службы.

start () — эти команды будут выполняться при вызове с параметром start.

В нашем примере все, что делает функция start () — переходит в папку со скриптом и запускает его в фоновом режиме.

stop () — эти команды будут выполняться при вызове с параметром stop.

В нашем примере функция stop находит процесс скрипта и останавливает его по PID.

Строки START= и STOP= определяют, в какой момент последовательности инициализации запускается этот скрипт.

START=99 означает, что файл будет иметь символическую ссылку /etc/rc.d/S99example — другими словами, он будет запускаться после сценариев инициализации с START=98 и ниже.

STOP=1 означает, что файл будет иметь символическую ссылку /etc/rc.d/K1example — то есть он будет остановлен первым.

После создания и редактирования файла /etc/init.d/example включить автозапуск службы можно командой:

/etc/init.d/example enable

Готово, теперь написанный скрипт будет запускаться и останавливаться вместе с операционной системой.

Обработать остановку скрипта можно следующим образом.

46f14b7184e7a616d6fa9b4566c5a7e6.png

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

Осталось разобраться с сокетами. В начале нужно создать сам UDP IPv4 сокет:

socket = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)

Если вы хотите выполнить привязку ко всем доступным IPv4-адресам, укажите 0.0.0.0 в качестве IP-адреса. Порт 0 означает привязку к случайному свободному доступному порту. Вы можете получить порт, который был выбран, с помощью socket.getsockname ()[1].

socket.bind ((»0.0.0.0», 0))

Для того, чтобы сделать сокет неблокирующим, необходимо вызвать функцию:

socket.setblocking (0)

Далее, все что осталось сделать — получать в бесконечном цикле в отдельном потоке дейтаграммы на созданный сокет, и при необходимости посылать через сокет данные.

20bccc67f96b3b7368159fefc075a627.png

Вызов select.select проверяет сокеты в списке sockets и по готовности хотя бы одного — возвращает списки: `reads`, `send`, `excepts`. Последний аргумент вызова select.select — timeout — это время ожидания.

socket.fileno возвращает файловый дескриптор сокета или -1 в случае ошибки.

В конце концов, получить данные позволяет вызов socket.recvfrom (2048), где 2048 — размер буфера в байтах.

А отправить дейтаграмму можно вызовом socket.sendto (data, (ip, port)), где data — пакет для отправки, а (ip, port) — адрес destination для дейтаграммы.

Заключение

Варианты использования рассмотренной программно-аппаратной платформы ограничиваются только вашей фантазией. Представьте, что у вас есть небольшое устройство с ориентированной на сетевые задачи операционной системой, подключенное к интернету 24/7… Теперь просто дайте волю своему воображению! Вот несколько идей: VPN-сервер, BitTorrent-клиент, файловый сервер, веб-сервер, блокировщик рекламы, онлайн система видеонаблюдения и многое другое.

© Habrahabr.ru