Обзор альтернативных прошивок домашних роутеров

MR_smoker

Арбитр
АРБИТРАЖ
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА

MR_smoker

Арбитр
АРБИТРАЖ
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА
Регистрация
20 Июн 2018
Сообщения
1,734
Реакции
632
Репутация
39
Род занятий

Отрисовка документов

Содержание статьи
Возможности стандартных прошивок часто не удовлетворяют всем требованиям пользователей. Кому-то надо качать торренты, кому-то необходим DLNA/VoIP/принт-сервер, а кто-то просто любит экспериментировать. Во всех этих случаях можно поставить ту или иную прошивку, а если ни одна из них не подходит, то и собрать ее самому.

Введение
SOHO-роутеры у большинства обычных пользователей, как правило, ставятся по принципу «настроил и забыл». Основное их предназначение в раздаче интернета для домашней сети, однако в отдельных случаях возникает необходимость в чем-нибудь более экзотическом, к примеру — в файловом сервере. В стандартных прошивках таких возможностей может и не быть. Но, поскольку ПО абсолютного большинства современных роутеров для домашнего использования (исключая, быть может, Huawei, где используется ОС собственной разработки) основано на ядре Linux, а некоторые фирмы в свое время даже открыли часть исходников, не исключено, что для твоего роутера существуют и кастомные прошивки, в одной из которых может найтись столь желанная возможность — как знать? А если даже и не найдется, то при некоторых усилиях ты можешь эту возможность добавить самостоятельно.


WARNING
Будь внимателен! Неправильная прошивка роутера может превратить его в бесполезный кусок железа и пластмассы.
На данный момент наиболее популярными прошивками считаются следующие:

  • Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    — пожалуй, самая известная из альтернативных прошивок. Возможности ее включают, например, ФС с функцией записи (как правило, реализуется путем создания раздела jffs2 и использования overlayfs для объединения со squashfs), пакетный менеджер opkg с репозиторием, в котором более 3000 пакетов, способностью использовать внешний накопитель для увеличения свободного пространства в /. При этом основная часть прошивки очень маленькая. Фактически это даже не прошивка, а полноценный дистрибутив для роутеров с соответствующими возможностями.

  • Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    — тоже достаточно популярная прошивка. В отличие от предыдущей, заточена для тех, кто не хочет ковыряться в конфигурационных файлах, устанавливать программы… Разумеется, там есть возможность это сделать, но придется столкнуться с некоторыми затруднениями.

  • Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    предназначена для роутеров на чипе Broadcom. Одно из преимуществ данной прошивки — при обновлении сохраняется старая конфигурация.

  • Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

    — совершенно свободная прошивка от FSF. Как водится, отпочковалась от OpenWRT и практически ничем, кроме отсутствия проприетарных драйверов, от последней не отличается. Примечательна тем, что из-за нее FSF немного изменил свои принципы: если до этого одним из условий «свободы» была необходимость иметь возможность компиляции приложения на том же устройстве, на котором оно запускается, то теперь это необязательно.
Разумеется, в списке упомянуты не все прошивки, но их настолько много, что всех и не упомнишь. Дальше я буду рассматривать роутер TP-LINK TL-WDR4300 и прошивку OpenWRT, как наиболее гибкую.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Прошивка TP-LINK TL-WDR4300 из «родного» firmware

Установка и начальная конфигурация OpenWRT
Первым делом необходимо прошить роутер. В моем случае в этом не было ничего сложного, главное — выбрать правильный вариант прошивки. Для этого необходимо внимательно смотреть на название — для обновления со стоковой прошивки TP-LINK я использовал файлopenwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin. В названии закодированы семейство чипсетов (ar71xx), конфигурация ядра (generic), название и версия аппаратной части роутера, тип ФС и для какой именно цели предназначен образ — прошивка с нуля (factory) или обновление существующей OpenWRT (sysupgrade). Ни в коем случае не используй sysupgrade для установки со стоковой прошивки — так ты просто превратишь роутер в кирпич. И вообще, поскольку для каждого роутера все индивидуально, читай внимательно соответствующий сайт.
Но вот ты прошил роутер и при этом умудрился его не окирпичить. Заходи по Telnet (адрес по умолчанию 192.168.1.1) и настраивай WAN. У меня он довольно долго не подключался, и пришлось разбираться с этим вопросом. Оказалось, что некоторые провайдеры (в частности, ТТК, к которому я подключен), кроме проверки по MAC-адресу, требуют еще и совпадения с этим MAC-адресом ClientID. В итоге я использовал следующие команды (здесь и далее, чтобы не путаться, где именно исполнять команды — на компе или на роутере, роутер будет обозначаться как openwrt#):
openwrt# uci set network.wan.proto=dhcp
openwrt# uci set network.wan.broadcast=1
openwrt# uci set network.wan.macaddr=09:aa:bb:cc:dd:ee
openwrt# uci set network.wan.clientid=0109aabbccddee
openwrt# uci commit network
openwrt# /etc/init.d/network restart
UCI (United Configuration Interface) представляет собой попытку сделать унифицированные файлы (и средства) конфигурации. Все настройки UCI хранятся в каталоге /etc/config. Для тех служб, которые используют свои файлы конфигурации, скрипты OpenWRT при запуске генерируют их на основе шаблона и файла UCI — так, например, сделано с Samba. Да, возможно, это уменьшает гибкость, зато в большинстве случаев упрощается конфигурирование тех или иных параметров, путем ли редактирования файлов конфигурации (с использованием vi) или же используя утилиту uci.
Вернемся к командной строке. Что делают первые три команды, в общем-то, ясно: первая устанавливает протокол (возможно выбрать статический IP, PPP, PPPoE, L2TP и еще несколько менее используемых вариантов), вторая устанавливает флаг broadcast в пакете dhcp, третья устанавливает MAC-адрес для интерфейса. Четвертая команда устанавливает поле ClientID в пакете dhcp (option 61) равным MAC-адресу. Последние две команды используются для сохранения изменений и перезапуска сети.
После этого (и после обязательной проверки работоспособности) я бы посоветовал поставить веб-интерфейс, так как базовые настройки с ним реально проще рулить. Для OpenWRT таковых существует как минимум две. Поставим LuCI — де-факто стандартный веб-интерфейс:
openwrt# opkg update
openwrt# opkg install luci
openwrt# /etc/init.d/uhttpd enable
openwrt# /etc/init.d/uhttpd start
И ставим пароль root.
openwrt# passwd
Замечу, что после установки пароля ты уже не сможешь использовать Telnet, только SSH. Теперь зайди в веб-интерфейс и настрой необходимые тебе параметры.
В общем-то, на этом настройку роутера можно и закончить. Однако я не нахожу особого смысла перешивать роутер, если ты не будешь использовать дополнительные возможности прошивки. Поэтому идем дальше…

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Веб-интерфейс OpenWRT

Создание extroot
Extroot необходим для того, чтобы у роутера было больше свободного места, — разумеется, за счет подключения внешнего накопителя, такого как флешка. Существует два типа создания extroot — перемещая на накопитель только оверлей и перемещая корень целиком. Сказать по правде, во втором варианте смысла мало — оверлей в роутере в любом случае используется, поэтому будем разбирать первый метод. Но и у него есть две версии. Поскольку я рассматриваю наиболее свежую стабильную версию OpenWRT, то и способ тоже будет соответствовать. На более старых ревизиях он, однако, может не работать. Ставим пакеты:
openwrt# opkg update
openwrt# opkg install block-mount kmod-usb-storage kmod-scsi-generic kmod-fs-ext4 e2fsprogs
Запиши текущий вывод команды mount — он тебе еще пригодится в дальнейшем.
После этого подготовь и подмонтируй флешку (ее ты можешь отформатировать в ext3 как на настольном Linux, так и в самом OpenWRT) и клонируй на нее текущий оверлей:
openwrt# mkdir /mnt/flash_overlay
openwrt# mount /dev/sda1 /mnt/flash_overlay
openwrt# tar -C /overlay -cvf - . | tar -C /mnt/flash_overlay -xf -
Только после этого ты можешь редактировать файл /etc/config/fstab, записывая в него параметры для использования extroot:
<...>
config mount
option target /overlay
option device /dev/sda1
option fstype ext3
option options rw,sync
option enabled 1
option enabled_fsck 0
После этого перезагрузись. Если тебе необходимо вернуть все обратно, ты находишь в ранее записанном выводе команды mount оригинальное устройство с оверлеем, монтируешь его и ставишь в файле etc/config/fstab на смонтированном старом оверлее option enabled в 0.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Редактирование файла /etc/config/fstab для включения extroot

Качаем торренты и настраиваем Samba
Раз уж роутер практически не выключается и места для установки стороннего ПО в нем теперь достаточно, грех не использовать его в качестве загрузчика торрентов. Но сперва нужно настроить файлообмен. Поскольку сеть у меня гетерогенная, выбор пал на Samba.
openwrt# opkg update
openwrt# opkg install samba36-client samba36-server luci-app-samba
openwrt# rm /tmp/luci-indexcache
В задачи статьи не входит детальное описание настройки Samba, а с веб-интерфейсом ты способен разобраться и сам. Несколько замечаний, однако, стоит сделать. Во-первых, на вкладке Edit template вместо «security = user» стоит написать (хотя бы для начала) «security = share», во-вторых — дай гостевой доступ к расшаренным папкам, в-третьих — смени владельца расшариваемого каталога на nobody и, наконец, не забудь запустить саму службу:
openwrt# /etc/init.d/samba enable
openwrt# /etc/init.d/samba start
Теперь перейдем к настройке торрент-клиента. В качестве его будет выступать transmission — не в последнюю очередь из-за того, что он поддерживает веб-интерфейс. Установка его стандартна:
openwrt# opkg update
openwrt# opkg install transmission-daemon transmission-web
Рассмотрим наиболее важные опции файла конфигурации /etc/config/transmission:
config transmission
<...>
# Включает демон
option enabled '1'
# Каталог генерируемого конфига
option config_dir '/etc/transmission'
# Пользователь, от которого запускается демон. Поскольку гостевой пользователь Samba — nobody, то ставим его и здесь
option user 'nobody'
# Каталог хранения загруженных файлов
option download_dir '/home/storage/torrents/done'
# Каталог недокачанных файлов
option incomplete_dir '/home/storage/torrents/incompl'
<...>
После этого ставим его в автозапуск и стартуем.
openwrt# /etc/init.d/transmission enable
openwrt# /etc/init.d/transmission start
Заходим в веб-интерфейс, по умолчанию находящийся на порту 9091, грузим торрент-файл и наслаждаемся.

ФС, используемые в роутерах
Из-за особенностей (и, как правило, малого объема) флеш-памяти, в основном и применяемой в роутерах, для них не подходят ФС для настольных компьютеров. Поэтому кратко опишу различия двух основных файловых систем, в них используемых.
  • SquashFS — только для чтения. Поддерживает сжатие, что немаловажно для систем с ограниченным объемом флеш-памяти.
  • JFFS2, в отличие от SquashFS, рассчитана на чтение/запись. Также поддерживает сжатие, но в меньшей степени. Журналируемая.
В случае OpenWrt эти две ФС разнесены по разным mtd-разделам и монтируются хитрым образом. Сперва SquashFS монтируется в /rom, а JFFS2 в /overlay. Затем с помощью overlayfs эти две ФС объединяются в одну и при попытке изменения файла в SquashFS изменяет его в JFFS3, обеспечивая таким образом поддержку не только чтения/записи, но и возможность загрузки в безопасном режиме для восстановительных работ.

Краткий обзор DD-WRT
DD-WRT необходимо шить с оригинальной заводской прошивки — возможность прошить из-под OpenWrt не предусмотрена. После прошивки и перезагрузки мы обнаруживаем в браузере требование сменить пароль. Оно, конечно, правильно, но непонятно — зачем скрывать под звездочками еще и имя пользователя. Установили его и сразу автоматически переходим на вкладку Status -> Sys-Info, где видим, что все отключено. Как только мы пытаемся перейти на другую вкладку, у нас спрашивают пароль. Беглый обзор вкладок дал следующую информацию о доступном ПО:
  • Samba и ProFTPD;
  • OpenVPN и PPTP;
  • nstx — позволяет создавать туннель IP over DNS, что позволяет в некоторых случаях использовать роутер как «окно» в интернет, если ты подключаешься через какую-нибудь платную точку доступа, а денежки тебе жаль;
  • несколько вариантов HotSpot-серверов — для того случая, если ты желаешь организовать свой хотспот;
  • SIP-прокси.
Чтобы включить доступ к optware (дополнительному ПО), придется повозиться. Замечу, что в некоторых версиях прошивки есть раздел JFFS2, а в некоторых нет, так что лучше для этой цели использовать флешку. DD-WRT подходит тому, кто хочет быстро получить доступ к отдельным функциям, которые в большинстве роутеров отсутствуют, но не желает заморачиваться с установкой дополнительного ПО. В общем-то, его возможности покрывают процентов 90 пользователей альтернативных прошивок. Те же, у кого потребности слишком специфичны или кто желает получить больший контроль над роутером, вполне могут разобраться и с другими прошивками.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Веб-интерфейс DD-WRT

Настройка DLNA-сервера
Да, твой роутер может выступать и в этом качестве. Если коротко, DLNA-сервер раздает различный медиаконтент в сети. Многие современные мультимедиаустройства, такие как телевизоры, игровые приставки, музыкальные центры и Blu-ray-плееры, поддерживают этот стандарт. В OpenWRT есть minidlna — легковесный и несложный в настройке DLNA-сервер, который мы сейчас и установим:
openwrt# opkg update
openwrt# opkg install minidlna
Файл конфигурации находится в стандартном для UCI-конфигов месте —/etc/config/minidlna. Разберем его основные параметры:
# Не опечатка — действительно зачем-то повторяется
config minidlna config
<...>
option enabled '1'
# Какой интерфейс слушаем
option interface 'br-lan'
# Каталог БД minidlna и логи
option db_dir '/home/storage/minidlna/db'
option log_dir '/home/storage/minidlna/log'
# Каталоги с медиафайлами
list media_dir 'A,/home/storage/audio'
list media_dir 'V,/home/storage/video'
list media_dir 'P,/home/storage/photo'
<...>
В принципе, после этого minidlna можно уже запускать, предварительно скопировав медиафайлы в нужные папки.
openwrt# /etc/init.d/minidlna enable
openwrt# /etc/init.d/minidlna start
Однако есть небольшой нюанс. Захотел ты добавить музыку или видео, скопировал — а на плеере она не появилась. Дело здесь в том, что по умолчанию minidlna использует inotify, который по загадочным причинам в нем не работает. Чтобы обновить список, необходимо остановить запущенный демон и произвести ручное сканирование, набрав следующую команду:
openwrt# minidlna -R -f /tmp/minidlna.conf

Сборка своего собственного образа OpenWRT
Если тебя по какой-то причине не устраивает стандартный образ OpenWRT, то можно собрать свой, для чего необходимо получить тулчейн и OpenWRT Buildroot. Прежде всего установим соответствующие пакеты:
$ sudo apt-get install subversion build-essential git-core libncurses5-dev zlib1g-dev gawk
Собирать мы будем текущую нестабильную версию OpenWRT и материалы (feeds). Скачаем их.
$ mkdir openwrt && cd $_
$ svn co svn://svn.openwrt.org/openwrt/trunk/
$ cd trunk
$ ./scripts/feeds update -a && ./scripts/feeds install -a
После этого проверим зависимости — мало ли, вдруг какой-нибудь необходимый для сборки пакет не установлен.
$ make prereq

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Сборка необходимых инструментов
Если все нормально, можем конфигурировать образ. Для чего вводим
$ make menuconfig
И выбираем, точно так же, как и при конфигурации ядра, нужные тебе вещи. Единственное отличие от «ядерного» menuconfig — звездочка означает, что объект будет встроен в образ, а M — что будет доступен в виде пакета ipk, который позже можно будет установить отдельно. Сильно увлекаться, однако, не советую — помни о том, что места на внутренней флеш-памяти не просто мало, а очень мало.
В основном процесс конфигурирования включает в себя следующие шаги:
  • Выбор конкретной целевой системы и профиля. Их необходимо указывать как можно точнее — если укажешь неправильно, ты рискуешь превратить роутер в кирпич.
  • Выбор пакетов. Здесь действует правило — чем меньше ты встроишь их в образ, тем лучше. Поэтому выбирай только самые необходимые. Я бы посоветовал включить LuCI.
  • Настройки сборки. Тут ты можешь разве что в разделе Global build settings включить/выключить IPv6. В Advanced configuration options стоит лезть, только когда ты четко знаешь, для чего, к примеру, служит та или иная опция GCC, достаточна ли мощность процессора для включения защиты стека и так далее.
  • Выбор модулей ядра. Тут те же самые рекомендации, что и при выборе пакетов. Загляни в секцию USB Support и включи опцию kmod-usb-storage. Остальные включай по желанию.
Если же тебе зачем-то понадобится подправить ядерный конфиг, используй
$ make kernel_menuconfig

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Выбор опций при сборке кастомной прошивки
Учти, что если ты потом сделаешь очистку, то конфиг ядра не очистится. Для его очистки набери
$ svn revert -R target/linux/
После всего этого можешь смело набирать команду
$ make
для сборки образа. Это займет длительное время, по истечении которого в каталоге bin/появятся файлы образа.
Существует несколько путей для того, чтобы залить прошивку. Самый легкий из них — через веб-интерфейс, и описывать его я смысла не вижу. Второй способ — использовать утилиту scp на хостовом компьютере вкупе с mtd на роутере для залития образа и его прошивки. Поскольку сейчас стоит уже OpenWRT, то можно прошивать как factory-, так и sysupgrade-образ. В моем случае команды были такими:
$ scp bin/ar71xx/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin [email protected]:/tmp
openwrt# mtd -r write /tmp/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin firmware
Вторая команда шьет (write) свежескачанную прошивку в раздел, именуемый firmware, и вслед за этим роутер перезагружается (-r). В случае обновления OpenWRT со стабильной версии до текущей я бы советовал не восстанавливать сохраненную конфигурацию, а настроить все заново — у меня по каким-то причинам старые конфиги не подошли к свежескомпилированной версии.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

Копирование прошивки в роутер

Безопасность альтернативных прошивок
В плане безопасности со стороны всяческих атак на сервисы из интернета роутеры нынче защищены по умолчанию. Тем не менее расслабляться не следует. Опишем несколько возможных векторов атак на роутеры с альтернативной прошивкой.
  • Отсутствие пароля в OpenWRT. И если в веб-интерфейсе (который обычно еще нужно устанавливать) хоть как-то предупреждают об этом, то при заходе по Telnet молчат. Хотя можно было бы написать скрипт, который требовал бы установки пароля, а после его установки отключал Telnet как таковой.
  • Отсутствие тайм-аута при неправильных попытках ввода пароля. В домашней сети это вроде и ни к чему… но можно подцепить малварь, которая атакует роутер и перешивает его. Пользователь может долгое время не подозревать, что он в ботнете, — и даже переустановка ОС, понятно, ничего не даст.
  • Отсутствие проверки подлинности пакетов в OpenWRT. Пакеты ipk не имеют цифровой подписи. В том случае, если репозиторий будет скомпрометирован (или хотя бы произойдет подмена DNS-адреса), это будет чревато заражением роутеров малварью.
  • В DD-WRT Wi-Fi по умолчанию включен и никак не шифруется, что само по себе рискованно, а при выключенном SSH рискованно вдвойне.
В общем-то, некоторыми из этих потенциальных уязвимостей страдают и стоковые прошивки роутеров. Тем не менее разработчикам альтернативных прошивок стоит озаботиться данным вопросом — думается, что подобные цели могут стать наиболее вкусными для разработчиков малвари из-за их слабой защищенности.

WWW
Всевозможная документация по OpenWrt:

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Заключение
Альтернативные прошивки дают большую свободу для пользователей. Некоторые из них, такие как DD-WRT, Tomato, прошивка от Олега, заточены под нужды большинства — в них есть поддержка NAS, VPN, есть принт-серверы… Другие же (Open/LibreWRT) содержат минимально необходимые возможности, но при этом позволяют их расширять и затачивать под свои нужды. Возможно, прочитав эту статью, ты захочешь стать одним из разработчиков прошивок, благо область довольно новая и толком до конца не освоенная. Дерзай.
 
Сверху