Содержание
Отказ от ответственности
Автор не несет никакой
ответсвенности, за Ваши действия или бездействия, за физический,
финансовый, моральный или любой другой ущерб. Помните, вскрывая
рассмотренный в этой статье маршрутизатор, Вы лишаетесь
гарантии. Статья не является пошаговым руководством: Вы должны
понимать, что Вы делаете.
Введение
Недавно ко мне в руки попало устройство Edimax
BR-6104K (а позже и Edimax BR-6104KP). Оно представляет собой
маршрутизатор, размером с маленький восьмипортовый switch.
Возможности
- 1 WAN Ethernet
порт
- 4 LAN Ethernet порта
- Встроенный коммутатор Fast Ethernet
- Общий доступ с помощью NAT/NAPT
- Межсетевой экран SPI (Stateful Packet Inspection) с защитой от
DoS-атак
- Поддержка виртуальных серверов и DMZ
- Поддержка DDNS (DynDNS/TZO)
- Поддержка специальных приложений (conntrack)
- Свободное прохождение туннелей VPN (IPSec/PPTP/L2TP)
- Получение WAN IP
через PPPoE/Static IP/PPTP/DHCP/L2TP
- Сервер DHCP
- Поддержка UPNP
- Возможность работы в режиме моста
- Конфигурирование через web-интерфейс
- Возможность получения информации о подключении к портам и
работы DHCP.
- Журнал событий
- Возможность обновления программного обеспечения
Маршрутизатор имеет flash память объемом 2М и SDRAM память
объемом 16М.
Но самое интересное, что операционной системой устройства
является Linux. Эта мысль у меня возникла при ознакомлении с его
возможностями, и подтвердилась после внимательного изучения его
прошивки.
Точно такое же устройство изготавливает компания Sweex (Sweex
LB000021), и говорят, что платы Edimax и Sweex отличить друг от
друга невозможно1) (прошивки отличаются только логотипами и
оформлением (CSS)
).
Существуют модификации
- BR-6104K
- Маршрутизатор 1 WAN
порт, 4 LAN порта (~$35)
- BR-6104KP
- Маршрутизатор 1 WAN
порт, 4 LAN порта, 2 порта USB (~$45)
- BR-6524K
- Маршрутизатор 2 WAN
порта, 4 LAN порта (подключение к 2 провайдерам)
- BR-6524WP
- Маршрутизатор Wireless 802.11g, 2 WAN порта, 4 LAN порта, 2
порта USB (подключение к 2 провайдерам) ($158.00)
- BR-6541K
- Маршрутизатор 4 WAN
порта, 1 LAN порт (подключение к 4 провайдерам)
- BR-6541WP
- Маршрутизатор Wireless 802.11g 4 WAN порта, 1 LAN порт, 2 USB
порта (подключение к 4 провайдерам)
Фото
Внешний вид BR-6104K Вид внутри BR-6104K
Web Интерфейс
Основные возможности
-
Общий доступ
Функция NAT/NATP позволит организовать общий доступ к одному
широкополосному подключению (через кабельный или ADSL-модем).
Возможна одновременная работа до 253 пользователей. Маршрутизатор
обеспечивает функцию DMZ для осуществления доступа из интернет к
серверам, расположенным во внутренней сети.
-
Поддержка специальных приложений
Маршрутизатор позволяет использовать специальные приложения
(H.323, IRC, MSN,
MMS, PPTP, Quake3, starcraft, tftp и другие).
-
Межсетевой экран
Межсетевой экран SPI (Stateful Packet Inspection) защитит вашу
внутреннюю сеть от несанкционированного доступа и различного рода
DoS-атак (атаки типа “Отказ в обслуживании”), а также сразу
оповестит вас об этом по электронной почте. С его помощью вы также
можете контролировать доступ к интернет из внутренней сети.
-
Поддержка виртуальных серверов и DMZ
Функция поддержки виртуальных серверов и DMZ обеспечит доступ
из интернет к ресурсам ваших серверов, расположенных во внутренней
сети.
-
Поддержка UPnP
Функция UPnP поможет быстро настроить маршрутизатор.
-
DHCP
Встроенный сервер DHCP даст возможность клиентам из внутренней
сети получать сетевые параметры автоматически.
-
Настройка через web-интерфейс
Вы можете легко настроить маршрутизатор через обычный
веб-браузер.
Варианты использования
Конечно на 2 мегабайтах flash и 16 мегабайтах RAM памяти в модели
без USB порта сильно не разгуляешься, но в умелых руках со своими
технико-экономическими показателями, данное устройство может занять
свою нишу. Навряд ли получится его использовать как почтовый или Web
сервер, да он для этого и не предназначен. Это маршрутизатор: без
вращающихся механических элементов, с малыми габаритами, питанием
12V, пропускной способностью WAN-LAN около 25 МБит/сек.
Поэтому он может быть установлен как в офисе, в квартире, так и на
крыше дома. Но! Имея USB Flash (USB-HDD) мы запросто можем
превратить маршрутизатор в полноценный сервер
Возможности, которые сразу приходят в голову:
- Маршрутизатор
- iptables (firewall, dnat, snat, policy routing, etc)
- shaper (cbq, htb, etc)
- VPN шлюз
- dhcp сервер
- ssh/telnet доступ (dropbear/busybox)
- snmpd (большой размер для ramdisk’а)
- ftp/tftp update
- не вижу препятствий для того, чтобы подключить dial-up модем
или другое коммуникационное оборудование
- + широкая гамма USB устройств
- и все остальное в рамках Вашей фантазии, аппаратных и
программных ограничений
На досуге хочу
- Из BR-6104KP сделать файловый сервер для USB flash/hdd
- подключить USB звук/web-камеру
Ограничения/Огорчения
Так как процессор довольно специфический, то Linux ядро изменено
именно под него и оно относительно старое - 2.4.18. Совсем недавно
компания Edimax предоставила исходные тексты ядра для скачивания, до
этого момента приходилось пользоваться или уже скомпилированным
ядром из ‘родной’ прошивки, или собирать ядро предоставленное
компанией OvisLink (с некоторыми ограничениями - не работает mtd и
switch).
Также есть ограничение связанное с размерами flash памяти - ее
нельзя использовать как полноценную файловую систему, так как ядро с
ramdisk’ом почти не оставляет свободного места (на досуге надо будет
поэкперементировать с JFFS). Чтобы обойти это ограничение, мною был
написан простой скрипт, который после загрузки загружает другой
скрипт, который в свою очередь обновляет систему (содержимое
ramdisk’а). Также можно через определенные промежутки времени
выгружать изменившиеся файлы на tftp/ftp сервер.
Вид внутри BR-6104KP (включенная USB flash, и
подпаянный консольный кабель)
Второе и более красивое решение состоит в приобретении устройства
с USB портом и USB-Flash к нему. По моему опыту это наиболее
безхлопотное решение, позволяющее настроить полноценный linux
сервер.
Есть отличная страница http://www.norocketscience.com/router/upgrade.htm
и форум, где владельцы маршрутизаторов исправляют ошибки допущенные
производителем.
Теперь, если Вы заинтересовались этим устройством, то Вы можете:
- Использовать роутер без изменений
- Для обычных пользователей подключенных через xDSL модем -
то, что доктор прописал.
- Использовать ядро и ramdisk от производителя изменяя под свои
нужды скрипты/бинари, для этого Вам потребуется:
- Изучить структуру прошивки, научится разбирать и собирать
ramdisk
- Подключить консольный кабель - получить доступ к консоли
- Установить MIPS toolchain
- Использовать самосборное ядро и самосборный ramdisk, для этого
Вам потребуется:
- Тоже что и в предыдущем пункте
- Скачать, собрать, установить ядро, buildroot ;)
- Полностью пересобрать родную прошивку
- Через web интерфейс залить прошивку
root система которой находится на первом разделе USB
Flash диска.
- плюс: Это ‘живая’ система, с изменяемой в любой момент
конфигуруцией, а не ramdisk.
- плюс: не требуется вскрывать роутер, чтобы подключиться
через RS232 порт
- плюс: в любой момент можно изменить файловую систему на
настольном компьютере
Поделюсь заметками и рекомендациями.
Различная информация
Hardware
Данный маршрутизатор построен на чипе ADM5120 фирмы AdmTek (Infineon) который представляет
собой высокопроизводительную и очень гибкий систему System On Chip
(SOC) которая может использоваться для SOHO Gateway, NAT роутер,
принт сервер, точки доступа WLAN, VPN шлюза, ядром VoIP
шлюза
Внутри себя этот чип содержит высокопроизводительный процессор
175 MHz/227 MIPS, сетевую
подсистему, switch engine, поддержку PCI, USB, UART
Структурная схема Фотография ADM5120
Сетевая подсистема
Содержит 6 портов и обладает следующими возможностями:
- IEEE 802.3 Fast Ethernet
- 5 auto-MDIX (auto-crossover) twisted paired LAN interfaces,
embedded 10/100M PHY
- 1 GMII2)/MII interface
- Flexible WAN port
selection
Встроенный switch engine
- Embedded Data-buffer/Address-look-up table
- Look-up table read/write-able
- MAC layer security
- MAC clone solution
- Multicast grouping (IGMP)
- MAC filtering, Bandwidth control
- Class of Services (CoS) with two priority levels
- Shared dynamic data buffer management, embedded SSRAM
- Port grouping VLAN (overlap-able)
- TCP/IP accelerator
Memory interface
SDRAM
- Two bank support (2 chip select pins)
- Each bank can support – 1Mx32 up to 32Mx32bit (128M-byte)
Flash
- NAND Flash boot3)
- NOR Flash boot: Two bank support (2 chip select pins)
- NOR Flash boot: Each bank can support - 1Mx8-bit, up to
1Mx32-bit (4M-byte)
System
- UART interface (support MODEM interface)
- PCI bridge that supports 3 master devices (только в BGA
корпусе)
- GPIO4)
- USB 1.1 host
- Clock source
- 25MHz crystal for 10/100
- 48MHz crystal for USB
- 0.18u CMOS process
- 1.8V/3.3V dual power
- BGA/PQFP
и все это удовольствие за ~$35.
Консольный порт
Консольного порта в его привычном виде нет. Для него предусмотрен
разъем на плате обозначенный JP2. И для того, чтобы
иметь доступ к консоли и возможность прошивать маршрутизатор через
кабель, Вам необходимо будет собрать переходник с ~12V (RS232) на
3.3V. Для этого потребуется микросхема MAX232 или ей
подобная.
IMHO проще всего
взять шнурок к мобильному телефону, обычно они все на 3.3V, но Вы
это должны проверить самостоятельно.
На плате маршрутизатора имеется разъем подписанный как JP2. К
нему необходимо подключать кабель согласно разводки: JP2
2-o o o o-8
1-o o o o-7
1 - Rx
7 - Tx
8 - Gnd
Внимание: подключение COM порта напрямую к
маршратизатору непременно выведет последний из
строя. Подключайтесь любой терминальной программой на скорости
115200 бит/сек, 8 бит, No parity, 1 stopbit
Tip: Консольный вход очень чувствительный к
различным шумам и наводкам, поэтому, если они у Вас появляются -
проверьте кабеля, не приближайте их к источникам помех. Как вариант
можно установить конденсатор 0.1 мкф между 1 и 8 контактами.
USB порт
Jeroen Domburg написал прекрасное HOWTO
по установке компонентов для поддержки USB.
JTAG порт
JTAG порт предназначен для отладки, тестирования устройства. На
плате он обозначен как JP1. Через него возможна чтение/запись
flash/sdram памяти напрямую, но информации по этому поводу у меня
нет. 1 /TRST 2 gnd
3 TDI 4 gnd
5 TDO 6 gnd
7 TMS 8 gnd
9 TCK 10 gnd
11 ??? 12 not connected
13 ??? 14 +3.3 volt
приветствуется информация по JTAG
Заметки по родной прошивке
В основном вся логика представлена набором shell
скриптов, все относительно просто.
HTTP
сервером является пропатченный GoAhead WebServer, в котором
находится логика работы с пользователем.
Программа /bin/flash реализует функциональность
сохранения/восстановления параметров. Параметры предопределены и
привязаны (внутри программы) к определенным областям flash
памяти.
К сожалению, при загрузке на консоли, запускается программа
требующая ввести username/password, которые известны только
производителю. Поэтому, чтобы получить shell доступ, нужно как
минимум прошить модифицированную прошивку.
Также запускается демон diagd слушающий TCP порт
31727, который позволяет локально устанавливать MAC адреса и
количество интерфейсов, а также удаленно: получать информацию о
устройстве, менять MAC адреса, устанавливать частотный диапазон
WLAN, и другие функции, которые скорей всего будут включены в
слудующих версиях.
Разработчиками написан модуль для ядра реализующий URL blocking, имеются
файлы /proc/url_blocking_list и
/proc/trigger_port_list
-
/dev/mtd
Блочное устройство, предоставляющее доступ к flash памяти.
Крайне не советую что-либо записывать в диапазон 0x000000 -
0x008000, иначе велика вероятность превратить маршрутизатор в
кирпич.
-
/dev/switch
Кнопка reset. В цикле опрашивается скриптом
monitor.sh, в случае нажатия делает
reboot
-
/dev/led0
Светодиод питания.
echo "led off" > /dev/led0 # turn on
echo "led on" > /dev/led0 # turn off
echo "led blink 100" >/dev/led0 # blink with freq 0.1
-
/dev/led_wlan
неизвестно, возможно светодиод WLAN
-
/dev/ttyS0, /dev/console
консоль
Структура Flash памяти 0x000000 - 0x0004ff interrupt handlers
0 Reset
100
180 General
200 Cyclic loop
280
0x000500 - 0x007fff boot loader
0x008000 - 0x0083ff 'HS' section = hardware setting
(ethernet MAC addresses, etc.)
0x008400 - 0x009fff 'DS' section = default config
0x00a000 - 0x00bbff 'CS' section = current config
0x00bc00 - 0x00ffff empty
0x010000 - 0x01ffff WB4K web image (webpages-6104k.bin.gz)
0x020000 - 0x1fffff CSYS system image (vmlinux.bin.bz2)
HS, DS и CS секции начинаются с 6-ти байтного заголовка: char tag[2]; /* "HS", "DS" or "CS" */
char version[2]; /* currently HS = "01", DS = CS = "08" */
uint16_t length;
WB4K и CSYS секции начинаются с 12
байтного заголовка:
char signature[4];
uint32_t startAddress;
uint32_t length;
17KB неиспользуемого места + 64KB занимаемые
webpages.bin, так что потенциально выигрываем 81KB.
Структура официальной прошивки
Прошивки от Edimax и Sweex (версий 2.65/2.75) имееют следующий
формат V2.65 Block name V2.75
+--------------------+ 0x00 + 0x00+--------------------+
| Header | | | Header |
+--------------------+ 0x0c | 0x0c+--------------------+
| | | | |
| | | | |
| webpages-6104k.bin | webpages.bin | webpages-6104k.bin |
| gzipped | | | gzipped |
| | | | |
+--------------------+ | +--------------------+
| padding | | | padding |
+--------------------+ 0x20000 + 0x10000+--------------------+
| CSYS header | csys.bin | CSYS header |
+--------------------+ 0x2000c + 0x1000c+--------------------+
| | | | |
| | | | |
| vmlinux.bin | vmlinux.bin.gz | vmlinux.bin |
| gzipped | | | gzipped |
| | | | |
| | | | |
+--------------------+ + +--------------------+
-
''CSYS header''
Заголовок ‘CSYS header’ описанный выше
-
''vmlinux.bin''
(unzipped) имеет следующий формат V2.65 V2.75
+-------------+ 0x00 + 0x00+------------+
| | | | |
| Kernel | kernel.bin | Kernel |
| | | | |
+-------------+ 0x16d000 + 0x172000+------------+
| tmpimg.img | | | tmpimg.img |
| gzipped | --> ram image tmpimg.img.gz (bz2) | bzip2 |
| +padding | | | +padding |
+-------------+ 0x28f000 + 0x27c000+------------+
Offset Length
0x00 0x20000 web pages block containing
webpages-6104k.bin (gzipped)
0x20000 0x0c CSYS header
0x2000c eof kernel block containing vmlinux.bin (gzipped)
После распаковки vmlinux.bin мы имеем 2
дополнительных блока: Offset Length
0x00 0x16d000 kernel
0x16d000 0x122000 RAM image block containing tmpimg.img
(gzipped) (RAMDISK)
Tip1: Отмечу, что ramdisk может быть сжат не
gzip, а и bzip2. Tip2: На самом деле,
загрузчик ищет заголовок CSYS header в памяти по
адресам 0x10000 + n*0x10000 (где n 0,1,2). Т.е можно
располагать ядро и без webpages-6104k.bin (я так и не
понял зачем он нужен), и без главного заголовка.
boot
При загрузке, на консоле появляется следующее сообщение: ADM5120 Boot:
Если нажать 3 раза пробел в течении около 1 сек, то появится
загрузочное меню: ADM5120 Boot: <--- press space 3x times
Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key :
- Пункт
a предназначен для загрузки
firmware в flash. Требуется прошивка с
CSYS заголовком
- Пункт
b для загрузки в RAM. Передавать нужно
vmlinux.bin.gz (запакованные ядро+ramdisk)
Протокол передачи - XMODEM Например загружаем
прошивку в flash: Создаем firmware.bin ../bin/mksyshdr csys.bin vmlinux.bin.gz
cat csys.bin vmlinux.bin.gz >firmware.bin
Upload with XMODEM Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key : a
Downloading...........PASS
Eraseing nor flash.......PASS
Programming nor flash...PASS
Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key : c
jump to linux code!!
LINUX started...
Tip: передавать следует не сразу после выбора
меню, а через 5-7 сек.
MIPS toolchain
Для того, чтобы иметь возможность собирать программы под MIPS
архитектуру, Вам необходим кросс-компилятор и собранная uclibc5) для этой архитектуры. Есть 4 способа
использовать MIPS toolchain:
- Скачать и установить готовый пакет ( см Ссылки )
- Скачать и собрать ‘вручную’
gcc и
uclibc для платформы MIPS
- Использовать собранный
MIPS toolchain из
собранного buildroot
- Если у Вас замечательный дистрибутив Debian, то рекомендую
использовать пакет
toolchain-source ( см Ссылки )
Я использую третий способ, так как все равно использую buildroot.
При использовании USB накопителей можно использовать и более
тяжеловесный (но стандартный) вариант библиотеки C -
glibc
buildroot
Buildroot - замечательный пакет, являющийся частью проекта uClibc специально предназначенный
для сборки ramdisk’ов для встроенных и микро систем. Именно то, что
нам необходимо!
Задачи buildroot:
- загрузить и скомпилировать пакеты необходимые для построения
(
gcc, binutils, ccache,
etc)
- загрузить и скомпилировать пакеты которые войдут в состав
ramdisk’а (
uclibc, busybox, etc)
- построить ramdisk требуемого формата (
ext2,
cramfs, jffs)
При первом построении buildroot загрузит с сети
необходимые компоненты для построения (gcc, binutils,
etc), а далее те пакеты которые Вы выбрали в
TARGETS. Отмечу, что список пакетов, которые
buildroot собирает простым добавлением в достаточно
велик, перечислю некоторые:
- bash, busybox
- bzip2, gzip
- coreutils, diffutils, findutils
- dropbear_sshd
- autoconf/automake, gcc, flex, gdb, gdbserver, ltrace, strace
- iproute2, iptables, mrouted, netsnmp, netkitbase,
netkittelnet, openssh, openssl, vtun, links, ltp
Написать Makefile для другого пакета большой сложности не
составляет.
Настройка и сборка buildroot крайне проста:
- в
Makefile определяем архитектуру:
ARCH:=mipsel
- далее по вкусу включаем определения
TARGETS
Небольшое описание структуры каталогов
buildroot:
build_mipsel/package-name/ лежат исходные тексты
пакетов
build_mipsel/root/ - готовая файловая система,
которая превратится в ramdisk
build_mipsel/staging_dir/ - скомпилированные
утилиты для построения
make/ содержит Makefile’s для
загрузки, распаковки, конфигурации, компиляции, установки.
sources/ содержит патчи и конфиги.
sources/dl/ содержит загруженные с сети пакеты.
sources/target_skeleton/ скелет файловой системы
sources/device_table.txt файл с описанием какие
каталоги, файлы, устройства, сокеты нужно создать в готовой
файловой системе
root_fs_mipsel - готовый образ файловой системы
ramdisk’а
Для конфигурации busybox: cd build_mipsel/busybox/
make menuconfig
cp .config ../../sources/busybox.config
cd -
Аналогичная процедура для uClibc.config
kernel
Процесс компиляции ядра мало чем отличается от компиляции для
платформы x86, конечно это должен быть MIPS
кросс-компилятор и ядро специально для этого чипсета. Перед
компиляцией я устанавливаю переменные окружения: export ARCH=mips
export CC=mipsel-linux-gcc
export CPP=mipsel-linux-cpp
export CXX=mipsel-linux-g++
export AR=mipsel-linux-ar
export CXXCPP=mipsel-linux-cpp
export RANLIB=mipsel-linux-ranlib
Если использовать компиляторы из buildroot: export PATH=/path/to/buildroot/build_mipsel/staging_dir/bin/:$PATH
Замечу, что в этом случае нет смысла вручную ‘собирать’ образ
ядра с initrd - пусть за Вас это сделает make
vmlinux. Для этого готовый ramdisk требуется
положить в arch/mips/ramdisk/ramdisk_el.gz6) и установить [*] Embed root
filesystem ramdisk into the kernel в меню конфигурации ядра.
Подробности см. в arch/mips/ramdisk/Makefile
В составе архива находящегося на сайте производителя
(Linux-SC.zip) входят утилиты для построения образа для Flash
USB root
Для того, чтобы иметь возможность распологать корневую файловую
систему на USB носителе, требуется наложить патч
смысл которого сводится в некоторой задержке монтирования, чтобы USB
подсистема увидела и проинициализировала носитель.
Ссылки
NoRocketScience
Forum http://vlad.org.ua/adm5120/firmware/
http://www.linux-mips.org/wiki/index.php/ADMtek
Благодарности
Компании ‘Агатис’ http://www.agatis.biz/ , которая
является официальным дистрибутором фирм SWEEX и EDIMAX в Украине. А
особенно Шафаренко Дмитрию - менеджеру по сбыту Большое спасибо
Андрею Ищенко и Адилю Изидинову за наводку, а также Игорю Залатову
другу и “HAM’у”.
(с)
Vladislav Moskovets (Владислав Московец) mail: adm5120 {at}
vlad . org . ua icq: 3703834 Буду рад любым замечаниям,
конструктивной критике, предложениям, дополнительной информации.
- 1) также есть подмодификации плат Edimax
(Sweex) BR-6104K(P) отмеченные в левом верхнем углу как “Rev A” и
“Rev B”
- 2) только в BGA корпусе
- 3) только в BGA корпусе
- 4) PQFP has 4 GPIO pins v.s. BGA has 8
pins
- 5) uClibc - библиотека языка
C, оптимизированная для микроконтроллеров и embedded
систем.
- 6) может отличаться
|