Возможности стандартных прошивок часто не удовлетворяют всем требованиям пользователей. Кому-то надо качать торренты, кому-то необходим DLNA/VoIP/принт-сервер, а кто-то просто любит экспериментировать. Во всех этих случаях можно поставить ту или иную прошивку, а если ни одна из них не подходит, то и собрать ее самому.
SOHO-роутеры у большинства обычных пользователей, как правило, ставятся по принципу «настроил и забыл». Основное их предназначение в раздаче интернета для домашней сети, однако в отдельных случаях возникает необходимость в чем-нибудь более экзотическом, к примеру — в файловом сервере. В стандартных прошивках таких возможностей может и не быть. Но, поскольку ПО абсолютного большинства современных роутеров для домашнего использования (исключая, быть может, Huawei, где используется ОС собственной разработки) основано на ядре Linux, а некоторые фирмы в свое время даже открыли часть исходников, не исключено, что для твоего роутера существуют и кастомные прошивки, в одной из которых может найтись столь желанная возможность — как знать? А если даже и не найдется, то при некоторых усилиях ты можешь эту возможность добавить самостоятельно.
WARNING
Будь внимателен! Неправильная прошивка роутера может превратить его в бесполезный кусок железа и пластмассы.
На данный момент наиболее популярными прошивками считаются следующие:
- OpenWRT — пожалуй, самая известная из альтернативных прошивок. Возможности ее включают, например, ФС с функцией записи (как правило, реализуется путем создания раздела jffs2 и использования overlayfs для объединения со squashfs), пакетный менеджер opkg с репозиторием, в котором более 3000 пакетов, способностью использовать внешний накопитель для увеличения свободного пространства в /. При этом основная часть прошивки очень маленькая. Фактически это даже не прошивка, а полноценный дистрибутив для роутеров с соответствующими возможностями.
- DD-WRT — тоже достаточно популярная прошивка. В отличие от предыдущей, заточена для тех, кто не хочет ковыряться в конфигурационных файлах, устанавливать программы… Разумеется, там есть возможность это сделать, но придется столкнуться с некоторыми затруднениями.
- Прошивка от Олега. В основном предназначена для роутеров Asus. Отличается, по мнению некоторых, довольно неплохой поддержкой принтеров и достаточно странной на первый взгляд системой сохранения файлов в прошивке — после каждого изменения файловой системы необходимо давать две-три команды.
- Tomato предназначена для роутеров на чипе Broadcom. Одно из преимуществ данной прошивки — при обновлении сохраняется старая конфигурация.
- LibreWRT — совершенно свободная прошивка от FSF. Как водится, отпочковалась от OpenWRT и практически ничем, кроме отсутствия проприетарных драйверов, от последней не отличается. Примечательна тем, что из-за нее FSF немного изменил свои принципы: если до этого одним из условий «свободы» была необходимость иметь возможность компиляции приложения на том же устройстве, на котором оно запускается, то теперь это необязательно.
Разумеется, в списке упомянуты не все прошивки, но их настолько много, что всех и не упомнишь. Дальше я буду рассматривать роутер TP-LINK TL-WDR4300 и прошивку OpenWRT, как наиболее гибкую.
Установка и начальная конфигурация 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. Теперь зайди в веб-интерфейс и настрой необходимые тебе параметры.
В общем-то, на этом настройку роутера можно и закончить. Однако я не нахожу особого смысла перешивать роутер, если ты не будешь использовать дополнительные возможности прошивки. Поэтому идем дальше…
Создание 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.
Качаем торренты и настраиваем 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 пользователей альтернативных прошивок. Те же, у кого потребности слишком специфичны или кто желает получить больший контроль над роутером, вполне могут разобраться и с другими прошивками.
Настройка 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 рискованно вдвойне.
В общем-то, некоторыми из этих потенциальных уязвимостей страдают и стоковые прошивки роутеров. Тем не менее разработчикам альтернативных прошивок стоит озаботиться данным вопросом — думается, что подобные цели могут стать наиболее вкусными для разработчиков малвари из-за их слабой защищенности.
Заключение
Альтернативные прошивки дают большую свободу для пользователей. Некоторые из них, такие как DD-WRT, Tomato, прошивка от Олега, заточены под нужды большинства — в них есть поддержка NAS, VPN, есть принт-серверы… Другие же (Open/LibreWRT) содержат минимально необходимые возможности, но при этом позволяют их расширять и затачивать под свои нужды. Возможно, прочитав эту статью, ты захочешь стать одним из разработчиков прошивок, благо область довольно новая и толком до конца не освоенная.
Всевозможная документация по OpenWrt: wiki.openwrt.org/doc/start
1 comments On Альтернативная прошивка для домашних роутеров
Pingback: Как посещать рутрекер через торент - Cryptoworld ()