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

 

Введение

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

 

WARNING

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

На данный момент наиболее популярными прошивками считаются следующие:

  • OpenWRT — пожалуй, самая известная из альтернативных прошивок. Возможности ее включают, например, ФС с функцией записи (как правило, реализуется путем создания раздела jffs2 и использования overlayfs для объединения со squashfs), пакетный менеджер opkg с репозиторием, в котором более 3000 пакетов, способностью использовать внешний накопитель для увеличения свободного пространства в /. При этом основная часть прошивки очень маленькая. Фактически это даже не прошивка, а полноценный дистрибутив для роутеров с соответствующими возможностями.
  • DD-WRT — тоже достаточно популярная прошивка. В отличие от предыдущей, заточена для тех, кто не хочет ковыряться в конфигурационных файлах, устанавливать программы… Разумеется, там есть возможность это сделать, но придется столкнуться с некоторыми затруднениями.
  • Tomato предназначена для роутеров на чипе Broadcom. Одно из преимуществ данной прошивки — при обновлении сохраняется старая конфигурация.
  • LibreWRT — совершенно свободная прошивка от FSF. Как водится, отпочковалась от OpenWRT и практически ничем, кроме отсутствия проприетарных драйверов, от последней не отличается. Примечательна тем, что из-за нее FSF немного изменил свои принципы: если до этого одним из условий «свободы» была необходимость иметь возможность компиляции приложения на том же устройстве, на котором оно запускается, то теперь это необязательно.

Разумеется, в списке упомянуты не все прошивки, но их настолько много, что всех и не упомнишь. Дальше я буду рассматривать роутер TP-LINK TL-WDR4300 и прошивку OpenWRT, как наиболее гибкую.

Прошивка TP-LINK TL-WDR4300 из «родного» firmware
Прошивка 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
Веб-интерфейс 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
Редактирование файла /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
Веб-интерфейс 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 root@192.168.1.1:/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: wiki.openwrt.org/doc/start

 

Заключение

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

 

 

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии