обзор OpenWRT
еще один дистрибутив?
Недавно у меня возникла задача раздачи WiFi-интернета в квартире. После недолгих сомнений я остановил выбор на маршрутизаторе WRT54GL. Основными критериями была достаточная для меня функциональность, сравнительно малая стоимость и поддержка OpenWRT. OpenWRT - это бесплатный Linux- дистрибутив, который поддерживает множество разнообразных аппаратных роутеров и позволяет реализовать функциональность несоизмеримо большую, чем родные прошивки.
Проект появился в 2004 году, на базе GPL-кода опубликованного компанией LinkSys. На момент написания последний «стабильный» релиз - 0.9, кодовое название - White Russian. О нем далее и пойдет речь.
Сама же железка представляет из себя коммутатор на 4 порта + порт для подключения провайдера (WAN) + точка доступа WiFi.
установка
После приобретения устройства я проверил его работоспособность с использованием родной прошивки. В простейшем случае задача выглядела как подключение к WAN с использованием PPPoE, раздача интернета на встроенный свич и WiFi. После несложных настроек в веб интерфейсе все заработало. Встроенный веб-интерфейс достаточно простой и понятный, но функциональность крайне ограниченна.
Установка OpenWRT поражает своей простотой - все, что потребовалось для миграции на эту прошивку – это скачать дистрибутив для моей модели с сайта OpenWRT и обновить flash, используя встроенный веб-интерфейс. После перезагрузки устройства необходимо телнетом подключиться к 192.168.1.1 и задать пароль суперпользователя. Это позволит использовать HTTP- и ssh-подключения для управления ОС. Приятным сюрпризом было и то, что большую часть настроек, которые я сделал в родном веб-интерфейсе, OpenWRT успешно прочитал и использовал.
конфигурирование
Для конфигурации можно использовать встроенный веб-интерфейс (достаточно убогий, но основные настройки позволяет менять) или ssh-консоль, что, на мой взгляд, значительно удобнее. OpenWRT предоставляет для администратора полноценный Linux с привычным набором утилит (grep, awk, wget, mv, cp и т. п.), debian-подобной системой управления пакетами ipkg, позволяющей удалять или добавлять подготовленные разработчиками пакеты. Также присутствуют все стандартные для Linux средства для работы с сетевым стеком - ifconfig, route, netstat, iptables и т. д. И все это на платформе с 4 Mb Flash и 16 Mb 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) аппаратно объединены в управляемый коммутатор, при этом каждый порт этого коммутатора тегирован, что позволяет объединять их в VLAN’ы. В конфигурации по умолчанию создано 2 VLAN’а, в 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 позволяет получить невероятно гибкое решение даже в условиях крайне ограниченных аппаратных ресурсов. Кроме того, подобные проекты уменьшают зависимость администратора от компании-производителя устройства, предоставляя пользователю настоящую свободу выбора.
Алексей Саморуков
Недавно у меня возникла задача раздачи WiFi-интернета в квартире. После недолгих сомнений я остановил выбор на маршрутизаторе WRT54GL. Основными критериями была достаточная для меня функциональность, сравнительно малая стоимость и поддержка OpenWRT. OpenWRT - это бесплатный Linux- дистрибутив, который поддерживает множество разнообразных аппаратных роутеров и позволяет реализовать функциональность несоизмеримо большую, чем родные прошивки.
Проект появился в 2004 году, на базе GPL-кода опубликованного компанией LinkSys. На момент написания последний «стабильный» релиз - 0.9, кодовое название - White Russian. О нем далее и пойдет речь.
Сама же железка представляет из себя коммутатор на 4 порта + порт для подключения провайдера (WAN) + точка доступа WiFi.
установка
После приобретения устройства я проверил его работоспособность с использованием родной прошивки. В простейшем случае задача выглядела как подключение к WAN с использованием PPPoE, раздача интернета на встроенный свич и WiFi. После несложных настроек в веб интерфейсе все заработало. Встроенный веб-интерфейс достаточно простой и понятный, но функциональность крайне ограниченна.
Установка OpenWRT поражает своей простотой - все, что потребовалось для миграции на эту прошивку – это скачать дистрибутив для моей модели с сайта OpenWRT и обновить flash, используя встроенный веб-интерфейс. После перезагрузки устройства необходимо телнетом подключиться к 192.168.1.1 и задать пароль суперпользователя. Это позволит использовать HTTP- и ssh-подключения для управления ОС. Приятным сюрпризом было и то, что большую часть настроек, которые я сделал в родном веб-интерфейсе, OpenWRT успешно прочитал и использовал.
конфигурирование
Для конфигурации можно использовать встроенный веб-интерфейс (достаточно убогий, но основные настройки позволяет менять) или ssh-консоль, что, на мой взгляд, значительно удобнее. OpenWRT предоставляет для администратора полноценный Linux с привычным набором утилит (grep, awk, wget, mv, cp и т. п.), debian-подобной системой управления пакетами ipkg, позволяющей удалять или добавлять подготовленные разработчиками пакеты. Также присутствуют все стандартные для Linux средства для работы с сетевым стеком - ifconfig, route, netstat, iptables и т. д. И все это на платформе с 4 Mb Flash и 16 Mb 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) аппаратно объединены в управляемый коммутатор, при этом каждый порт этого коммутатора тегирован, что позволяет объединять их в VLAN’ы. В конфигурации по умолчанию создано 2 VLAN’а, в 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 позволяет получить невероятно гибкое решение даже в условиях крайне ограниченных аппаратных ресурсов. Кроме того, подобные проекты уменьшают зависимость администратора от компании-производителя устройства, предоставляя пользователю настоящую свободу выбора.
Алексей Саморуков
Сетевые решения. Статья была опубликована в номере 07 за 2007 год в рубрике лабораторная работа