From: Alex Samorukov
Newsgroups: email
Date: Mon, 21 May 2007 14:31:37 +0000 (UTC)
Subject: обзор OpenWRT
OpenWRT - ещё 1 дистрибутив?
Недавно у меня возникла задача раздачи wifi интернета в квартире. После
недолгих сомнений я остановил выбор на маршрутизаторе WRT54GL. Основными
критериями была достаточная для меня функциональность, сравнительно
малая стоимость и поддержка OpenWRT. OpenWRT
- это бесплатный linux дистрибутив, который поддерживает множество
разнообразных аппаратных роутеров и позволяет реализовать
функциональность несоизмеримо большую чем "родные" прошивки.
Проект появился в 2004 году, на базе GPL кода опубликованного компанией
LinkSys. На момент написания последний "стабильный" релиз
- 0.9, кодовое название "White Russian", он нём далее и
пойдёт речь. Сама же железка представляет из себя switch на 4 порта +
порт для подключения провайдера (WAN) + WIFI точка доступа.
Установка.
После приобретения устройства я проверил его работоспособность с
использованием родной прошивки. В простейшем случае задача выглядела как
подключение к WAN используя PPPoE, раздача интернета на встроенный
switch и wifi. После несложных настроек в веб интерфейсе все
заработало. Встроенный веб интерфейс достаточно простой и понятный, но
функциональность крайне ограниченна. Установка OpenWRT поражает своей
простотой - все, что потребовалось для миграции на эту прошивку - это
скачать дистрибутив для моей модели с сайта OpenWRT
и обновить flash используя встроенный web интерфейс. После
перезагрузки устройства необходимо используя телнет подключиться к
192.168.1.1 и задать пароль суперпользователя. Это позволит использовать
http и ssh подключения для управления ОС. Приятным сюрпризом было и то,
что большую часть настроек, которые я сделал в "родном" web интерфейсе
OpenWRT успешно прочитал и использовал.
Конфигурирование
Для конфигурации можно использовать встроенный веб интерфейс (достаточно
убогий, но основные настройки позволяет менять) или ssh консоль, что, на
мой взгляд, значительно удобнее. OpenWRT предоставляет для
администратора полноценный linux дистрибутив, с привычным набором утилит
(grep, awk, wget, mv, cp и т.п.), debian-подобной системой управления
пакетами ipkg позволяющей удалять или добавлять подготовленные
разработчиками пакеты. Также присутствуют все стандартные linux средства
для работы со стеком - ifconfig, route, netstat, iptables и т.д. И все
это на платформе с 4Mb Flash и 16Mb RAM! В качестве замены стандартным
unix утилитам используется проект busybox, а вместо GNU libc -
минималистская uClibc.
В моём случае настройка OS заключалась в уменьшении mtu PPPoE интерфейса
nvram set wan_mtu=1400; nvram set ppp_mtu=1400; nvram commit
и настройке шифрования WPA-PSK
ipkg install nas; nvram set wl0_akm=psk;nvram set wl0_crypto=aes;
nvram set wl0_wpa_psk=12345678;nvram set wl0_auth=0;nvram commit
После перезагрузки все заработало без проблем. Для изменения параметров
wlan интерфейса и получения информации о его работе используется утилита
wl (ipkg install wl).
Возможности и внутренняя архитектура
Все ethernet порты (включая WAN) аппаратно объединены в управляемый
switch, при этом каждый порт этого switch`а тегирован, что позволяет
объединять их в VLAN`ы. В конфигурации по умолчанию создано 2 влана, в
vlan0 находятся все LAN порты, а в vlan1 - единственный WAN порт. vlan0
объединён с интерфейсом wifi (eth0) в мост br0, на котором и прописан
IP адрес маршрутизатора. Эта схема подходит для большинства
конфигураций, но при желании её можно легко изменить, например, создав
отдельный vlan для DMZ, или выделив порт для подключения резервного
канала (WAN2). На самом деле варианты ограничены только вашей фантазией.
Рюшечки и бантики
Ну куда же без них, особенно после того как все успешно заработало. При
первом знакомстве с устройством мне весьма понравилась кнопка "Cisco",
которая при использовании родной прошивки мигала разными цветами при
нажатии, а может делала что-то и более полезное, кто знает. После
установки OpenWRT её нажатие молча игнорировалось. После длительных,
многолитровых, мыслей о её предназначении, я решил, что наиболее полезно
было бы отключать ей wifi. Чтение wiki показало, что для управления
лампочками используются специальные файлы в каталоге /proc/diag/led.
Так, например, echo 1>/proc/diag/led/power включает светодиод, echo 0 -
выключает, echo f переводит в мигающий режим. Для того, чтобы
перехватывать нажатие кнопок (reset и cisco) необходимо создать скрипт и
поместить его в каталог /etc/hotplug.d/. Скрипту передаются переменные
$BUTTON и $ACTION, через которые можно узнать название кнопки и тип
события. В итоге скрипт выглялит так:
#!/bin/sh
# Cisco Button
if [ $BUTTON = "ses" -a $ACTION = "released" ]
then
if [ "$(nvram get wl0_radio)" = "0" ]
then
echo "f" > /proc/diag/led/ses_white
logger -t wifi "Activating wi-fi"
nvram set wl0_radio=1
wifi
else
echo "f" > /proc/diag/led/ses_orange
logger -t wifi "Dectivating wi-fi"
nvram set wl0_radio=0
wifi
fi
sleep 1
echo "0" > /proc/diag/led/ses_white
echo "0" > /proc/diag/led/ses_orange
echo "1" > /proc/diag/led/power
fi
Разобравшись с кнопкой я решил установить на роутер dyndns клиент, для
автоматического обновления IP адреса dyndns зоны. Для этого требуется
добавить package ez-ipupdate (ipkg install ez-ipupdate), отредактировать
конфигурационный файл и добавить в /etc/init.d стартовый скрипт для
работы в режиме демона. Также рекомендую установить ntp клиент
(ntpclient package) для того, чтобы роутер всегда показывал точное
время. Если у вас в сети есть постоянно включённый компьютер с
запущенным syslogd - будет нелишним перенаправить сообщения syslog на
него. Также, при необходимости, можно настроить чтобы роутер посылал на
компьютеры Wake Up on LAN пакеты, включая их в указанное время.
Разработка и компиляция программ.
Если вам потребовалось написать или портировать программу для OpenWRT -
необходимо установить SDK.
В требованиях к SDK был указан "любой современный linux". Так как
на домашнем PC установлена FreeBSD, а никаких вменяемых livecd для
запуска в qemu под рукой не оказалось - я решил попытаться запустить SDK
в "линуксяторе" FreeBSD. Для работы скриптов вам потребуется установить
bash, GNU TAR (gtar), GNU Make и GNU wget (возможно, что и ещё что-то,
на что я не наткнулся). Также, из-за некоторых недоработок в скриптах
SDK вам потребуется применить созданный мной патч
(http://dev.openwrt.org/ticket/1720), после чего SDK будет работать без
каких либо проблем. Создание и портирование программ неплохо описано в
wiki. В итоге у меня получилось без особых проблем и изменений
портировать ngrep (http://dev.openwrt.org/ticket/1719) - удобный grep
для tcp сессий. Важный момент - вы не можете запускать полученные в
результате кросс-компиляции приложения непосредственно на рабочей
машине, так как они слинкованы под MIPS архитектуру. В форуме
разработчиков обсуждаются также варианты запуска в qemu-mips, но я их не
проверял, да и судя по сообщениям этот вариант пока ещё крайне "сырой" и
нестабильный. Для удобной работой с роутером я смонтировал её файловую
систему в локальный каталог freebsd. Для того, чтобы сделать это я
использовал со стороны bsd fuse-sshfs, а на роутер потребовалось
установить openssh-sftp-server (ipkg install openssh-sftp-server).
Затем - "sshfs root@192.168.1.1:/ /mnt/router" на нашем хосте, вводим
пароль и получаем удобный доступ ко всем файлам устройства. Для проверки
ваших программ лучше закидывать их в tmp (виртуальный диск), чтобы не
записывать лишний раз на flash микросхему.
Заключение
На мой взгляд, OpenWRT - прекрасный пример того, как OpenSource OS
позволяет получить невероятно гибкое решение даже в условиях крайне
ограниченных аппаратных ресурсов. Кроме того, подобные проекты уменьшают
зависимость администратора от компании-производителя устройства,
предоставляя пользователю настоящую свободу выбора.
Как всегда, буду рад дополнениям, исправлениям и советам.