Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #106, ОКТЯБРЬ 2007 г.

Level-up для точки доступа

Степан «Step» Ильин

Хакер, номер #106, стр. 026

(step@gameland.ru)

Как поднять многофункциональный сервер на обычной access point

Что ты думаешь насчет того, чтобы взять самую обыкновенную точку доступа и сделать из нее сервер? Выкинуть, наконец, тот старый хлам, что гудит и пылится в углу, а на видное место поставить небольшую симпатичную коробочку. Провести несколько часов за настройкой и потом смело спорить с друзьями, утверждая, что на ней одновременно крутятся веб-сервер с поддержкой скриптов, файловое хранилище гигабайт так на 500, BitTorrent-клиент, сутками качающий варез, IRC-бот - да что угодно еще! Смотрю, ты уже и сам готов поспорить? А вот и зря :).

Не секрет, что любой аппаратный роутер, точка доступа или тот же самый ADSL-модем - это небольшой компьютер. Те самые коробочки разных цветов и форм, которые в изобилии представлены на прилавках магазинов, на самом деле имеют процессор, оперативную и флеш-память и работают под управлением операционной системы. Причем не какой-то специальной ОС, а как правило, самой что ни на есть обычной операционки, которая установлена на миллионах компьютеров по всему миру, - Linux’а! Так что же нам мешает, чуть покопавшись, залезть в дебри системы и чуть-чуть там повеселиться? Да ничего! Вот этим и займемся – проведем эксперимент!

Подопытный образец

В качестве подопытного образца мы взяли точку доступа ASUS WL500gP. Бедняга уже больше года стояла у меня на полке и занималась только тем, что раздавала инет на одно единственное беспроводное устройство в квартире - мой ноутбук :). Отличный случай разобраться, за что же я в свое время выложил $100, тем более что девайс как нельзя лучше подходил для экспериментов за счет поддержки USB-устройств, позволяющей воплотить наши даже самые извращенные фантазии.

Расковыряв корпус, я заглянул внутрь. Центральный процессор, микросхемы оперативной и флеш-памяти находятся под алюминиевым экраном. В качестве CPU используется чип от Broadcom BCM4704, работающий на вполне достаточной частоте 266 МГц. Рядом установлены две микросхемы памяти Hynix HY5DU281622ETP по 16 Мб каждая. Флеш-память объемом 8 Мб представляет собой чип Spansion S29GL064M. Вот тут-то и хранится ОС, настройки, а также всевозможные программы. Кстати говоря, 8 Мб — это чрезвычайно мало и явно недостаточно для установки даже нескольких программ, поэтому контроллер USB 2.0, позволяющий помимо принтера и веб-камеры, подключить внешний HDD или флешку, нам очень кстати. Интегрированный свитч построен на процессоре Broadcom BCM5325 и является управляемым (10/100 Мбит/с) с возможностью создания VLAN'ов и управления очередями QoS. Модуль беспроводной связи установлен в miniPCI-слот и представляет собой микросхему WL-120G V2, также построенную на чипе Broadcom. Вот об этом я и говорил: самый обычный компьютер!

Тут надо сказать, что на месте WL500gP могло быть все что угодно: аналогичные гаджеты от LinkSys (например, нашумевший WRT54G), D-Link и прочих производителей. Все они работают под управлением модифицированного Linux'а - везде разного по настройке, но одинакового по сути. Правда, в стандартной поставке (прошивке) такой пингвин обычно ни на что не годится. Производители и разработчики прошивок намеренно сильно ограничивают его функциональность. Еще бы - любой дополнительный модуль может привести к нестабильности работы системы, что для любого, и особенно сетевого, оборудования недопустимо! Поэтому делаем вывод: операционную систему внутри коробочки для проведения экспериментов надо поменять!

Существует специальный проект, который называется OpenWrt (http://openwrt.org) и основан на базе исходного кода, опубликованного компанией LinkSys. Это бесплатный Linux-дистрибутив, совместимый с огромным количеством разнообразных аппаратных роутеров, который позволяет реализовать функциональность несоизмеримо большую, чем «родные» прошивки. Если на устройство можно залить OpenWrt, это уже почти гарантированно означает, что оно способно на большее, нежели заявляет производитель. Поэтому перед покупкой девайса для экспериментов советую тебе посмотреть таблицу совместимости - http://toh.openwrt.org. Наша точка - WL500gP - в этой таблице, разумеется, есть. Но! Заливать OpenWrt мы в нее не будем! Дело в том, что специально для этой модели нашим соотечественником (неким Oleg’ом) создана изумительная firmware, от которой пользователи просто без ума. Вот ее-то и я задействовал.

Заливаем прошивку

Залить новую прошивку можно двумя путями: через веб-интерфейс или через утилиту восстановления от ASUS. По большому счету разницы никакой нет, поэтому я, взяв инструкцию, воспользовался первым вариантом. Последняя версия firmware всегда доступна на сайте http://oleg.wl500g.info (на момент публикации — WL500gp-1.9.2.7.7g). Перед установкой прошивки рекомендуется отсоединить патч-корд от WAN-порта (активность из внешней сети не должна влиять на процесс) и кабели от USB-портов. Далее я перегрузил AP через веб-интерфейс и перешел на страницу администрирования: «System Setup -> Firmware Upgrade», где оставалось только выбрать файл с прошивкой. Через 2 минуты роутер перезагрузился, и, судя по всему, все было хорошо.

Надо сказать, что убить точку от ASUS довольно сложно. Даже если в момент перешивки выключилось питание или перешивка не удалась, ее можно восстановить с помощью стандартной программы rescuer.exe. Через минуту я нажал на кнопку RESET, чтобы сбросить все настройки и установить им дефолтные значения на случай, если моя оригинальная прошивка слишком старая. Очень важный момент: минуту-другую перед нажатием RESET нужно выждать обязательно - это время требуется для загрузки роутера.

Раз-два-три, проверка!

Управлять работой «коробочки» через веб-интерфейс довольно просто и удобно, но для экспериментов его явно маловато. Поэтому я почти сразу попробовал подсоединиться к устройству через telnet, набрав через «Пуск -> Выполнить» команду: telnet 192.168.1.1. В окне тут же появилось приглашение для входа в систему и после ввода стандартного логина/пароля (admin/admin), я оказался в знакомой никсовой консоли.

Последня сомнения по поводу того, какая система использовалась в качестве базовой, отпали после ввода команды uname -a:

Linux (none) 2.4.20 #75 Fri Apr 6 00:12:23 MSD 2007 mips unknown

Это был Линукс! На ядре 2.4.x. Я поигрался со стандартными командами top, ps, df, free и стал заморачиваться дальше.

Настройка безопасного соединения по SSH

Поддержка протокола telnet осталась для упрощения процедуры настройки, но использовать такой протокол постоянно не хотелось, поскольку данные летели по сети в открытом виде. Было решено не откладывать этот вопрос в долгий ящик и сразу поднять SSH-демон, чтобы шифровать весь поток данных. К счастью, рецепт нашелся очень быстро. В прошивке Oleg'а был включен известный SSH2-сервер и клиент - Dropbear, а настроить его оказалось проще простого.

Сначала создаем директорию для рабочих файлов Dropbear:

mkdir -p /usr/local/etc/dropbear

Генерируем пары ключей командами:

dropbearkey -t dss -f /usr/local/etc/dropbear/dropbear_dss_host_key

dropbearkey -t rsa -f /usr/local/etc/dropbear/dropbear_rsa_host_key

Создаем post-boot, предварительно создав для него папку:

mkdir -p /usr/local/sbin/

echo "#!/bin/sh" >> /usr/local/sbin/post-boot

Добавляем в скрипт команду для запуска dropbear:

echo "dropbear" >> /usr/local/sbin/post-boot

Делаем скрипт выполняемым:

chmod +x /usr/local/sbin/post-boot

Теперь сохраняем изменения во flash, и «коробочка» уходит в ребут:

flashfs save && flashfs commit && flashfs enable && reboot

Как только устройство загрузилось, я тут же подключился по SSH с 192.168.1.1 по 22-му порту с помощью знакомого тебе PuTTY. Для корректной работы с кириллицей в настройках «Windows -> Transtation» нужно выбрать кодировку Win1251.

Русификация

Как выяснилось, с русским названиями файлов и папок у устройства имеются проблемы. Чтобы решить их, пришлось немного поэкспериментировать с системными переменными:

nvram set usb_vfat_options=codepage=866,iocharset=cp1251

nvram set usb_ntfs_options=iocharset=cp1251

nvram set usb_smbcpage_x=866

nvram set usb_smbcset_x=1251

nvram set regulation_domain=0x00ALL

nvram commit

Для того чтобы установить значение переменной, используется команда nvram set. nvram unset, соответственно, имеет обратное действие. Выяснить текущее значение можно с помощью команды «nvram get имя» или «nvram show | grep имя». Важно записать все изменения во флеш, чтобы они восстановились после перезагрузки «коробочки». Это делается командной nvram commit.

Подсоединяем жесткий диск или флешку

Далее я решил подключить к устройству USB жесткий диск. Это нужно не только потому, что я собираюсь сделать из этого устройства файловый сервер и вечную качалку файлов, но еще и с системной точки зрения. Как я уже говорил, флешевой памяти устройства очень мало, и поэтому установить туда даже несколько программ уже не получится. А вот на внешний накопитель - запросто.

Хотя и тут есть некоторые нюансы. Системные файлы, как это вводится, должны располагаться в соответствующей файловой системе, а конкретно - в ext3. Флешка, в отличие от USB-HDD, обычно имеет один-единственный раздел, и поменять его нельзя. Я смог отформатировать ее в нужную файловую систему прямо с точки доступа:

mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1

Но, чуть подумав, я решил, что флешка — это не лучший вариант. Что с нее можно взять? Вот жесткий диск гигов так на 300-500 - совсем другое дело. Но для начала его нужно поделить, создав основной раздел и раздел для swap'а. Чтобы не геморроиться с разбивкой посредством консольного fdisk'а, я все сделал с помощью LiveCD Knoppix'а на ноутбуке и подключил жесткий диск обратно к точке доступа. Теперь можно было создать файловые системы:

mke2fs -j /dev/discs/disc0/part1

mkswap /dev/discs/disc0/part2

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

touch /usr/local/sbin/post-firewall

touch /usr/local/sbin/post-mount

touch /usr/local/sbin/pre-shutdown

chmod +x /usr/local/sbin/*

Эти скрипты, соответственно, будут выполняться после загрузки файрвола, монтирования устройства и перед выключением компьютера. Мы же сейчас поправим post-boot с помощью текстового редактора vi:

#Wait for /opt to mount

mount /dev/discs/disc0/part1 /opt

i=0

while [ $i -le 30 ]

do

if [ -d /opt/etc ]

then

break

fi

sleep 1

i=`expr $i + 1`

done

# Активируем своп

swapon /dev/discs/disc0/part2

# Запускаем все активные сервисы

/opt/etc/init.d/rc.unslung

Сохраняем изменения уже знакомой командой — и точка доступа перегружается.

Устанавливаем программы

Уф. Теперь, когда все проблемы с жестким диском были решены, можно было приступать к следующему, чуть ли не самому важному этапу – к установке программ. Компилировать и собирать никакие пакеты не нужно, потому что специально для таких ОС есть менеджер пакетов - ipkg. В прошивку от Oleg'а он входит по умолчанию, поэтому я немедля приступил к созданию необходимых для него директорий и непосредственно к установке:

mkdir /opt/tmp

mkdir /opt/tmp/ipkg

ipkg.sh update

ipkg.sh install ipkg

ipkg update

А что в результате? Очень многое! Огромное количество программ теперь можно заинсталлить в систему одной лишь командой. Например, тестовый редактор nano - ipkg install nano. Я очень привык к файловому менеджеру Midnight Commander, поэтому я тут же установил и его: ipkg install mc. К моему великому сожалению, заработал он не сразу, а лишь после того, как я добавил пару строк в файл post-boot:

echo "export TERMINFO=/opt/share/terminfo">>/etc/profile

echo "alias mc="mc -c"">>/etc/profile

 

Настраиваем Samba

Вот теперь, когда мы сделали из точки полноценный сервер с привычной средой и инструментами, можно приступать к наращиванию функциональности. Напомню, что одним из конечных пунктов было создание файлового сервера. Можно было, конечно, настроить уже работающий FTP-сервер, но это неудобно. В этом случае, чтобы просмотреть какой-либо фильм, пришлось бы скачивать себе его на винчестер. Но зачем это делать, если к файлам можно обратиться через стандартное сетевое окружение? Нужно лишь настроить на точке доступа демон Samba, чтобы та смогла отдавать файлы по привычному для Windows протоколу SMB. Поехали?

Создаем директорию для Samba:

mkdir /opt/etc/samba

Далее с помощью nano (vi или любого другого текстового редактора) редактируем конфигурационный файл Samba (/opt/etc/samba/smb.conf). Вот что нужно туда добавить:

[global]

workgroup = НАЗВАНИЕ_РАБОЧЕЙ_ГРУППЫ

guest account = nobody

security = share

browseable = yes

guest ok = yes

guest only = no

log level = 1

max log size = 100

encrypt passwords = no

dns proxy = no

[smbshare]

path=/opt/share

writeable = yes

browseable = yes

force user = admin

Понятно, что это всего лишь пример. С этим конфигом система сделает доступной по сети директорию /opt/share под именем smbshare. Под Виндой к ней можно обратиться, набрав в адресной строке UNC-путь: \192.168.1.1smbshare. Попробовал? Ага, не работает. Все потому, что надо указать демону, что следует использовать именно этот конфиг, и добавить Samba в автозагрузку. Создаем init-файл для демона - nano /opt/etc/init.d/S97Samba - со следующим содержанием:

#!/bin/sh

/usr/sbin/smbd -D -l /opt/var/log/smbd.log -s /opt/etc/samba/smb.conf

/usr/sbin/nmbd -D -n myasus -o -l /tmp -s /opt/etc/samba/smb.conf

Делаем его исполняемым: chmod 755 /opt/etc/init.d/S97Samba. И сохраняем изменения. Теперь все работает!

Поднимает Torrent-клиент

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

Пакет для работы Torrent уже был в репозитарии и установился стандартной командой:

ipkg install torrent

Однако стандартное управление закачками было ужасно и, по правде говоря, у меня так и не разработало. Поэтому я почти сразу стал искать вариант получше и... нашел. Товарищ oleo, эдакий молодец, разработал специальный cgi-скрипт, позволяющий управлять закачками прямо через веб-интерфейс. Короче говоря, самый обычный клиент, но с управлением через браузер. Правда, для работы потребовалось установить еще одну утилиту:

ipkg install ctorrent

Далее надо было создать 4 директории:

mkdir /opt/share/torrent

mkdir /opt/share/torrent/source

mkdir /opt/share/torrent/work

mkdir /opt/share/torrent/target

И приступить к настройке HTTP-сервера, который установлен в прошивку от Oleg'а по умолчанию. Лезем в конфиг с помощью текстового редактора:

nano /usr/local/root/httpd.conf

И вот что нужно туда прописать:

A:* /cgi-bin:admin:admin

.au:audio/basic

.asp:text/html

HTTP-демон должен стартовать в одном из скриптов автозапуска, поэтому я добавил в файл /usr/local/sbin/post-mount следующую строку:

#!/bin/sh /usr/sbin/busybox_httpd -p 8008 -h /opt/share/www

Последний шаг - настройка Torrent-клиента через текстовый конфиг /opt/etc/torrent.conf. Свой вариант конфига я выложил на DVD, здесь приведу несколько строчек:

SOURCE=/opt/share/torrent/source

WORK=/opt/share/torrent/work

TARGET=/opt/share/torrent/target

Эти переменные указывают соответственно на расположение torrent-файлов, временную директорию и папку для скачанных файлов. В принципе, на этом настройка завершена. Чтобы начать закачку, необходимо кинуть torrent-файлы в папку, указанную переменной SOURCE. Для этого я расшарил ее с помощью Samba (как это показано выше) и затем просто кинул файлы через сетевое окружение. А закачками стало можно управлять через браузер, обратившись к замечательному скрипту по адресу http://192.168.1.1:8008/cgi-bin/torrent.cgi. Просто чума!

А хочешь клиент для e2K и качать файлы через Осла? Вот решение — http://eko.one.pl/index.php?page=openwrt-amule.

Что еще можно установить

Список всех доступных пакетов для установки через ipkg доступен по адресу http://ipkg.nslu2-linux.org/feeds/unslung/wl500g/. Синтаксис для установки программ стандартный: ipkg install <название пакета>. Приведу несколько наиболее интересных пакетов:

  • php-thttpd – веб-сервер с поддержкой PHP5;
  • mc - файловый менеджер;
  • adduser – программа для добавления пользователей;
  • lynx – текстовый браузер;
  • gzip – архиватор gzip;
  • tar - архиватор tar;
  • unzip – программа для распаковки zip-архивов;
  • ncftp — клиент FTP;
  • whois – программа whois;
  • tcpdump - снифер;
  • proftpd – известный FTP-сервер;
  • microperl – реализация Perl;
  • eggdrop – IRC-бот;
  • bind — DNS-сервер;
  • nylon — сокс-сервер;
  • sqlite – БД sqlite.

Если установка пакетов повредит предыдущие, можно переустановить поврежденный с помощью команды: ipkg install -force-reinstall <название пакета>.

WWW

WARNING

В NTFS форматировать нет смысла - ее можно только читать. При желании информацию с раздела ext3 можно будет считать под Windows бесплатной программой explore2fs.

INFO

У проекта OpenWrt существует много модификаций, для различных нужд и различного оборудования. Например, PacketProtector включает в себя всевозможные утилиты для обеспечения безопасности, а Coova предназначена для создания hotspot'а.

- На что еще способна точка доступа с USB?

- Заряжать телефон! :)

Содержание
ttfb: 7.7009201049805 ms