понедельник, 3 февраля 2014 г.

OpenWrt: прошивка и настройка роутера TP-Link TL-WR1043ND v2.1

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

Дома, до недавнего времени у меня работал дешевенький D-Link DIR-300 N150 (аппаратная ревизия D1), и, надо сказать, это та ещё дрянь. Во-первых, нормально он заработал только после заливки обновленной (v2.0.17) прошивки с официального сайта (при покупке на нем обреталась v1.0.4). Функционал этого девайса вполне себе нормальный для домашнего использования, но все же не хватало некоторых необходимых мне фич, как-то, например, клиент DDNS. Обычно я использую No-IP, но D-Link по дефолту предоставляет обслуживание только dyndns.com (который стал платным!), собственный кривой dlinkddns.com, и ещё некий мутный, и видимо тоже платный TZO. 

Попытки прошить DIR-300 прошивкой от OpenWrt успехом не увенчались, из-за того что в моем устройстве в качестве процессора установлен Realtek RTL8196E, и хоть я и нашел способ скачать исходники для него (в официальных ветках их нет), но собрать не удалось. Может быть я вернусь к этому вопросу позже а пока...


Пока душа жаждала экспериментов. Придушив жабу я пошел в магазин и купил TP-Link TL-WR1043ND. В наших краях стоит он не много не мало 2500 руб., но поверьте, сабж стоит этих денег. Но, обо всем по порядку.


1. Комплект поставки


Собственно сам девайс выглядит так
Вид сверху

 
Вид спереди: на срезанной передней кромке - светодиодные индикаторы, которые к сожалению не получились на фото :(
Вид сзади: интервейсы и органы управления.

Кроме самого устройства в комплекте идут три штыревые антенны для Wi-Fi адаптера,
Штыревые антены для Wi-Fi - подари соседям радость доступа в Интернет :)
блок питания
Блок питания
и коротенький LAN-кабель
Кабель LAN, идущий в комплекте
В общем, стильный и симпатичный девайс. К недостаткам дизайна можно отнести только разве глянцевый корпус - залапывается отпечатками пальцев и пылится. А при протирке царапается. Но для нас это вопрос второстепенный, перейдем к делу.

2. Получение прошивки и подготовка образа


Идем на официальный сайт OpenWrt. Первое, что нас должно заинтересовать - поддерживается ли наше устройство. Это можно выяснить, посмотрев список поддерживаемых устройств, это первая ссылка на главной странице. В списке справа, смотрим интересующую информацию.

Что касается моего девайса, то мне в руки попал 1043ND версии 2.1, прошивки для которого в стабильной ветке нет. Однако по данному устройству имеется весьма подробное описание (вплоть до распиновки печатной платы) где сказано, что прошивку именно для версии 2.x можно взять в ветке trunk, вот тут.

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

Я скачал готовую сборку, ибо не был уверен, что смогу грамотно собрать сам. Девайс для меня не дешевый, поэтому хотелось получить его в работоспособном виде, а уж потом доставить то, чего будет не хватать.

В итоге, прошив готовый образ, я получил работоспособное устройство, но без web-интерфейса. Доступен оказался только telnet-канал, через который я разруливал свои недоработки. Пришлось настраивать подключение к сети (у меня pppoe с вводом пароля) из командной строки. Для профи это не создаст проблем, я же в этом деле новичок, поэтому пришлось туговато. Выкрутился я подключив роутер к работающему в сети роутеру DIR-300 - просто подключил WAN-разъем поциента в свободный порт на D-Link'ке. По умолчанию в стандартной прошивке настроено подключение к сети с использованием DHCP, так что выход в сеть я получил, доставив все мне необходимое с помощью opkg - менеджера пакетов, доступного в OpenWrt. 

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

Итак, у нас эсть скачанный ImageBuilder. Распаковываем его и видим список всякой всячины.
Содержимое архива генератора прошивок (на момент после сборки - в начале некоторые каталоги будут отсутствовать)
Находясь в этом каталоге, даем команду

$ make info

в выхлопе которой нас интересует вот эта часть

TLWR1043:
    TP-LINK TL-WR1043N/ND
    Packages: kmod-usb-core kmod-usb2 kmod-ledtrig-usbdev

Это - профиль по умолчанию, доступный для нашего устройства. Здесь указана модель роутера (TP-LINK TL-WR1043N/ND) а так же список пакетов, включенных в образ. Данные пакеты - модули ядра (приставка kmod - Kernel Module говорит сама за себя) драйверы USB, что хорошо, но для нашей цели недостаточно. Нам потребуется как минимум следующее

  1. uhttpd - миниатюрный web-сервер, на котором крутится web-интерфейс
  2. luci - сам web-интерфейс, стандартный для OpenWrt, построенный на Lua-скриптах.
  3. luci-i18n-russian - пакет русификации, ставим сразу.
  4. kmod-usb-storage - модуль ядра для поддержки флеш-накопителей.
  5. kmod-fs-ext4 - модуль ядра для поддержки файловой системы ext4.
  6. block-mount - утилиты для монтирования блочных устройств.
Последние три пакеты нужны, чтобы организовать работу с флешкой, используя её в качестве основного накопителя для роутера. Встроенная флеш-память девайса имеет объем в 8 Мб, которых маловато для реализации разнообразных хитрых штуковин :). 

Чтобы собрать прошивку именно в такой конфигурации, выполняем команду

$ make image PROFILE="TLWR1043" PACKAGES="uhttpd luci luci-i18n-russian kmod-usb-storage kmod-fs-ext4 block-mount" -j8

где указываем выбранный профиль и список необходимых нам пакетов. Ключик -j8 означает что собираю я в восемь потоков - у меня Intel Core i7, поэтому грех не воспользоваться его четырьмя ядрами с гипертрейдингом - это существенно ускорит процесс. В вашем случае нужно указать число потоков, поддерживаемых установленным у вас процессором. Ждем пока прошивка соберется...

На выходе, в директории с ImageBuilder'ом, получаем каталог bin/ar71xx с набором файлов
Результат сборки прошивки.

 Нас интересует файл openwrt-ar71xx-generic-tl-wr1043nd-v2-squashfs-factory.bin, соответствующий прошивке под имеющийся девайс (обращаем внимание на слова factory и v2 - прошивка именно для версии 2.x!!!)

Все готово, теперь можно приступить к самой прошивке

3. Прошивка через "родной" web-интерфейс


ВНИМАНИЕ: Всё нижеследующее Вы выполняете на свой страх и риск! Даже получение работоспособного устройства лишает Вас гарантии производителя! Автор не несет ответственности за порчу оборудования, вызванную действиями, описанными в данной статье!

Итак, приступим. Подключаем девайс к питающей сети через блок питания, соединяем любой LAN-порт устройства с сетевой картой компьютера, используя идущий в комплекте кабель.

Открываем браузер и заходим на http://192.168.0.1 - стандартный адрес веб-интерфейса TP-Link роутеров. Вводим логин - admin и пароль - admin, и видим такую картинку
Стандартный веб-интерфейс TP-Link

Приведенный скрин - это эмулятор TP-Link, любезно предоставленный на сайте производителя. Мой стандартный интерфейс умер быстро, я даже не посмотрел его как следует, хотя там достаточно много "вкусного". Так что пояснять процесс установки кастомной прошивки я буду используя эмулятор.

Идем в раздел System Tools, выбираем там Firmware Upgrade, и имеет следующую станичку
Диалог обновления ПО.

Жмем "Обзор" выбираем наш файлик с прошивкой (будьте внимательны на этом этапе!). Прошу обратить внимание на несоответствие - в эмуляторе указана версия железа v1, мы же прошиваем v2.1, так что пусть этот небольшой ляп вас не смущает - у вас всё будет верно, версии должны соответствовать.
Выбор собранной нами прошивки.
и жмем Upgrade, соглашаемся в ответе на вопрос "а действительно ли мы хотим..." и ждем пока закончится процесс, иллюстрируемый на экране подставными (как сказал Дмитрий Бачило) прогресс-барами.

После окончания прошивки страница попытается обновится, но окажется недоступна - теперь веб интерфейс будет доступен нам по адресу http://192.168.1.1, который надо набрать в адресной строке. Набираем, заходим и видим

Веб-интерфес LuCI.
 По умолчанию не задан пароль суперпользователя root, поэтому первым делом зададим его. Идем в меню "Система->Управление"
Создание пароля администратора.
и задаем пароль. После этого становится доступен ssh-интерфейс, а при заходе на веб-интерфес будет выскакивать экран авторизации
Экран авторизации LuCI.
Теперь можно настроить подключение к Интернет, в соответствии с учетными данными и инструкцией провайдера (в моем случае это pppoe с авторизацией) и в принципе - можно работать! Настраивать Wi-Fi и всё остальное что требуется вам для счастья ).

Из приятного стоит отметить, что имеющийся в OpenWrt name-сервер без проблем дает возможность установить статические ip для ваших компьютеров, и без бубнов с /etc/hosts получить возможность использовать разумные имена хостов, чего от оригинальных прошивок того же D-Link мне добиться не удалось. Вообще от богатства функционала тут с непривычки рябит в глазах.

Однако, оставлю читателя изучать веб-интерфейс самостоятельно, и перейду к следующему вопросу, который хотел бы рассмотреть

4. Настройка флешки в качестве системного диска


Располагаемых 8 мегабайт встроенной памяти может не хватить, если вы захотите устанавливать на роутер дополнительное ПО. Поэтому, попробуем расширить доступное дисковое пространство.

Для этого мной была приобретена вот такая небольшая "флешунечка"

Флешка для эксперимента - Sandisk 16 Gb
Дико извиняюсь за качество фото - снимаю телефоном с порядком "ушатанной" камерой, но думаю понятно, что (по опыту Дмитрия) выбран миниатюрный форм-фактор - так сабж прекрасно интегрируется с роутером.
Накопитель на рабочем месте - выглядит как "родной".
Если же отбросить эстетику - подойдет любая флешка.

Заходим в shell на роутере

$ ssh root@192.168.1.1

Поулчаем приглашение такого оригинального вида, с рецептурой ацкого коктейля, которая отличается в каждой из веток исходников прошивки).

BusyBox v1.19.4 (2014-01-30 20:48:26 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 BARRIER BREAKER (Bleeding Edge, r39424)
 -----------------------------------------------------
  * 1/2 oz Galliano         Pour all ingredients into
  * 4 oz cold Coffee        an irish coffee mug filled
  * 1 1/2 oz Dark Rum       with crushed ice. Stir.
  * 2 tsp. Creme de Cacao
 -----------------------------------------------------
root@OpenWrt:~#
Для начала кое-что доустановим, чтобы сделать нашу жизнь более комфортной. Обновим список доступного ПО из репозитария OpenWrt

# opkg update

После чего дадим команду

# opkg install nano mc

установив редактор nano (ну не люблю я дефолтный vi, ну что поделать...) и наш любимый Midnight Commander (да-да, командер на роутере), после чего мы получаем довольно дружественный интерфейс
Согласитесь - так намного лучше!
Почва на роутере готова, теперь готовим её на флешке. Для начала надо убить на ней стандартный раздел с FAT32 и создать необходимые Linux-разделы с помощью доступных интсрументов (gparted, cfdisk, fdisk). Подробно об этом рассказывал Дмитрий Бачило, я же ограничусь описанием своей схемы разметки

sda1 - 4 Гб - корневой раздел / (ext4)
sda2 - 128 Мб - раздел подкачки (swap)
sda3 - все остальное место, чуть менее 12 Гб - /home (ext4)  

Подготовленную флешку вставляем в роутер, и прежде всего убеждаемся, что флешка видится системой как надо

# ls /dev/sd*

должно показать

/dev/sda   /dev/sda1  /dev/sda2  /dev/sda3
что говорит о том, что система нашла флешку и её разделы. Теперь приступим к настройке. Её можно выполнить через веб-интерфейс, но я предпочел настроить монтирование через /etc/config/fstab, руководствуясь мануалом

Открываем указанный конфиг для редактирования

# nano /etc/config/fstab

удаляем всё что там есть (осторожно!!!) и набиваем следующее


# Общие параметры монтирования
config global
        option anon_swap '0'
        option anon_mount '0'
        option auto_swap '1'
        option auto_mount '1'
        option delay_root '5'
        option check_fs '0'
 
# Монтирование корневой ФС
config mount
        option device '/dev/sda1' # Нода раздела
        option enabled '1'        # Разрешаем монтирование
        option fstype 'ext4'      # Тип файловой системы
        option is_rootfs '1'      # Использовать как корневую ФС

# Монтирование раздела подкачки
config swap
        option device '/dev/sda2'
        option enabled '1'

# Монтирование домашней директории
config mount
        option enabled '1'
        option device '/dev/sda3'
        option target '/home'
        option fstype 'ext4'

Наверное вы обратили внимание, что fstab выглядит несколько непривычно - это используемый в OpenWrt стандарт uci. Сохраняем конфиг.

Теперь необходимо (обязательно!!!) перенести содержимое текущего корня на флешку. Для этого монтируем корневой раздел накопителя

# mkdir /mnt/sda1
# mount /dev/sda1 /mnt/sda1

и переносим корень на неё

# tar -C /overlay -cvf - . | tar -C /mnt/sda1 -xf -

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

# reboot

Когда устройство перезагрузится, можно вглянуть что получилось у нас. В веб-интерфейсе идем в "Система -> Точки монтирования" и видим картину
Точки монтирования после настройки.
Как видим, всё на месте. Теперь у нас есть достаточный объем дискового пространства для экспериментов.

Окончательно собираем роутер, наводим порядок на рабочем месте
Перешитый и настроенный TP-Link TL-WR1043ND на месте постоянной прописки.

5. Расшариваем удаленный доступ


Мне, по роду деятельности, приходится работать удаленно на домашней машине - выполнять трудоемкие вычисления на своей мощной "числодробилке". Поэтому вопрос удаленного доступа стоит как никогда остро.

Таковой доступ у меня был, но захотелось немного более продвинутых вкусностей, например удаленного включения домашних машин. Поэтому встал вопрос о расшаривании роутера из внешней сети. Провайдер выдает мне динамический ip, который я связываю с доменом 3-го уровня на http://noip.com. Как я говорил выше, старый роутер не поддерживал возможности использовать указанный сервис. OpenWrt (да и стандартная прошивка TP-Link, к слову) такую возможность предоставляет.

Итак, прежде всего доустановим некоторые пакеты

# opkg install luci-app-ddns sudo shadow


 Поясню:

  1. luci-app-ddns - плагин для веб-интерфейса - позволяет настраивать DDNS-сервис
  2. sudo - утилита, для получения прав суперпользователя под обычным аккаунтом
  3. shadow - пакет системных утилит для администрирования (добавление/удаление пользователей и групп, назначение прав и т.п.)

Первое понятно - настройка DDNS-клиента на роутере. Имея аккаун на noip.com с зарегистрированным там хостом, идем в меню "Сервисы -> Динамический DNS"
Настройка DDNS-клиента
Параметры своего аккаунта по понятным причинам не показываю. Обратите внимание на список доступных сревисов - он гораздо шире, чем в "родной" прошивке.

Теперь наш роутер станет доступен по указанному адресу хоста. Теперь мы должны сделать следующее - запретить вход по ssh-протоколу для пользователя root. Делаем это для защиты от банального брутфорса - при открытом доступе к рут-шеллу злоумышленнеку известно имя пользователя, что несколько облегчает ему задачу. Поэтому ограничимся доступом для обычного юзера, которого надо создать

# useradd -d /home/<имя пользователя> -s /bin/ash -m

обращаем внимание, что шелл по умолчанию - ash, а не bash как в большинстве домашних линуксов. Задаем пароль нашему юзеру

# passwd <имя пользователя>

Теперь запрещаем root-у заходить по ssh. Идем в "Система -> Управление" и снимаем галку 
Убираем возможность удаленного входа под root-ом
взведенную по умолчанию. Можно так же сменить порт, на котором прослушивается ssh с 22 на другой.



Администраторский доступ мы можем получисть через su уже после входа в систему (для этого ставили shadow) или можем настроить sudo. Теперь у нас есть возможность для удаленного администрирования всей нашей домашней сети :)



Заключение


Итак, мы превратили наш роутер в настоящую линукс-машину, обеспечив себе неисчерпаемые возможности для разного рода экспериментов и реализации интересных возможностей в домашней сети. Спасибо за внимание и успехов :)