Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Дмитрий Столяров
OpenWRT – Linux для встраиваемых систем
Если вы сталкиваетесь с постоянными зависаниями, неудобством управления или нехваткой функционала вашего роутера, и именно поэтому он вам не нравится – возможно, стоит попробовать установить OpenWRT.
OpenWRT – это дистрибутив для встраиваемых устройств, основанный на GNU/Linux. Изначально OpenWRT был создан для Linksys WRT54G и подобных моделей, но со временем он включил поддержку многих других архитектур от различных производителей. К самым популярным моделям маршрутизаторов, на которых он используется, относятся Linksys WRT54G и ASUS WL-500g (см. «Поддерживаемые модели маршрутизаторов»). Оборудование, на котором устанавливается OpenWRT, следует концепции SOC (System-on-a-chip), при которой все компоненты компьютера интегрируются в один чип. То есть фактически описываемые модели маршрутизаторов являются небольшими компьютерами. Далее везде под понятиями «маршрутизатор» и «роутер» будут пониматься устройства именно такого класса.
Появление OpenWRT стало возможным благодаря тому, что многие производители роутеров в качестве базового программного обеспечения использовали свободное ПО, что обязывало их опубликовывать собственные наработки на аналогичных правах.
Первое время единственным интерфейсом управления OpenWRT была командная строка (SSH/telnet), позже появился веб-интерфейс (webif). Сейчас на замену webif пришел webif^2, отдельно разрабатываемый в рамках проекта X-Wrt (см. «Установка веб-интерфейса»). Веб-интерфейс, как это часто бывает, не дает доступа к управлению всем имеющимся функционалом, но зато более удобен для многих конечных пользователей.
Одна из ключевых особенностей OpenWRT – использование файловой системы, поддерживающей запись и специально созданной для flash-накопителей – JFFS2. Эта ФС учитывает специфику перезаписи flash-памяти, относясь к ней гораздо бережнее.
Ее наличие дало возможность использования системы управления пакетами – ipkg (см. «Общие сведения о работе в OpenWRT»). ipkg – это версия пакетного менеджера Debian (dpkg), адаптированная для использования во встраиваемых системах и КПК.
Текущая стабильная версия OpenWRT – White Russian 0.9. Все примеры будут приводиться именно для этой версии.
Мотивация к использованию
Прежде всего надо понять, что, собственно, нужно. Если требуется маршрутизатор, подключающийся к провайдеру и предоставляющий доступ нескольким компьютерам посредством NAT, и он вполне стабильно работает, OpenWRT – это не ваш случай.
OpenWRT будет интересен, если вы хотите добиться необычных результатов или если вам нужен специфичный функционал.
Случай первый: несколько VPN-подключений
Допустим, из домашней сети необходимо часто подключаться к рабочей, и вам не нравится постоянно включать/отключать VPN-соединение на вашем компьютере. Или же вы хотите, чтобы ваш роутер был подключен к нескольким местам одновременно, например, к провайдеру (посредством PPPoE), а также в вашу рабочую сеть (по протоколу PPTP) и к вашему коллеге, с которым вы играете в компьютерные игры (с использованием OpenVPN). Причем так, чтобы все это работало прозрачно, не требовало сложной настройки при каждом подключении. Такая конфигурация реализуема на роутерах под управлением OpenWRT (см. «Настройка PPTP-клиента»).
Случай второй: VPN-доступ в вашу локальную сеть
Вы часто сталкиваетесь с необходимостью подключаться удаленно к сети, в которой роль главного маршрутизатора выполняет SOC-роутер.
Если вы используете OpenWRT, у вас появится возможность настроить VPN-сервер. Более того, вы сможете выбрать, какую именно VPN-реализацию использовать: OpenVPN, PPTP или L2TP. Такой VPN-сервер будет на приемлемом уровне обслуживать 1-2 клиентов, что является достаточным для малых сетей (см. «Настройка VPN-сервера с использованием PPTPD»).
Случай третий: загрузка файлов
Вы загружаете много больших файлов или часто пользуетесь пиринговыми сетями, но вам неудобно держать ваш компьютер включенным во время закачки. Такая задача разрешима, если роутер имеет USB-порт. К нему потребуется подключить flash-накопитель, а затем с помощью таких утилит, как wget или ctorrent (консольный BitTorrent-клиент), загружать файлы на накопитель.
После этого, подключив flash-накопитель к вашему компьютеру или соединившись с предварительно установленным на маршрутизаторе FTP-сервером (см. «Настройка FTP-сервера»), вы получите доступ к загруженным файлам. Кроме flash-накопителя может быть использован жесткий диск, подключаемый также посредством USB (однако для USB HDD, скорее всего, понадобится внешнее питание).
Случай четвертый: небольшой веб-сервер
Вы хотите разместить в сети веб-сайт, который не предназначен для большого числа посетителей. Вы не хотите для него приобретать хостинг или держать постоянно включенным шумящий компьютер. На маршрутизатор под управлением OpenWRT можно установить веб-сервер (lighttpd), а также при необходимости настроить поддержку PHP.
Системные требования
Для того чтобы запустить OpenWRT, в роутере должно быть установлено 2 Мб постоянной памяти и 8 Мб оперативной. Указанные требования по RAM являются теоретическим минимумом. Но на практике для запуска всех необходимых приложений потребуется не менее 16 Мб.
Что касается постоянной памяти, она достаточно просто поддается расширению посредством подключения внешнего USB-накопителя (см. «Настройка поддержки USB-носителя»).
Поддерживаемые модели маршрутизаторов
Как сообщалось выше, наилучшей поддержкой сейчас обладают маршрутизаторы Linksys WRT54G и ASUS WL-500g, а также их ближайшие «соседи».
Подробный список оборудования с указанием модели процессора, объема постоянной и оперативной памяти, количеством USB-портов и текущим уровнем поддержки в OpenWRT приведен на сайте разработчиков [1].
Во всех примерах будет использоваться модель ASUS WL-500g. В ее основе – микропроцессор Broadcom 4710, работающий на частоте 125 МГц. Она оснащена 4 Мб постоянной памяти и 16 Мб оперативной, имеет один порт USB версии 1.1.
Общие сведения о работе в OpenWRT
Роль основных системных утилит в OpenWRT выполняет BusyBox (см. стр. 54-56 журнала).
$ ls -l /bin/rm
lrwxrwxrwx 1 root root 7 Feb 3 18:49 /bin/rm -> busybox
$ busybox
BusyBox v1.00 (2007.01.30-11:42+0000) multi-call binary
|
В качестве основного shell по умолчанию в OpenWRT используется ash из BusyBox:
В системе присутствуют скрипты инициализации. Они расположены в директории /etc/init.d/ и являются обычными shell-скриптами.
Важным компонентом системы является пакетный менеджер ipkg. Он очень прост в использовании, быстро работает и обладает достаточным функционалом. Рассмотрим основные его функции:
- ipkg update – обновляет список пакетов (загружая его из источников, указанных в конфигурационном файле);
- ipkg upgrade – обновляет все установленные пакеты;
- ipkg install <имя_пакета> – устанавливает пакет (в качестве параметра может принимать имя пакета, а также путь или HTTP URL, указывающий на файл пакета);
- ipkg remove <имя_пакета|регулярное_выражение> – удаляет один или несколько пакетов;
- ipkg list – выводит на экран полный список пакетов;
- ipkg list_installed – выводит на экран список установленных пакетов.
У ipkg есть конфигурационный файл, который может содержать следующие инструкции:
- src <имя> <http://url> – указывает репозитарии пакетов (список репозитариев можно найти на поисковом сайте пакетов ipkg [2]);
- dest <имя> <путь> – указывает место установки пакетов. По умолчанию существует два места установки: постоянная и оперативная память. Именно благодаря этой возможности в случае недостатка постоянной памяти можно установить пакеты на USB-накопитель (подробнее на сайте разработчиков [3]).
Доступ к системе в момент первой загрузки осуществляется по telnet (в качестве telnet-сервера используется реализация из BusyBox). После установки пароля и перезагрузки предоставляется командный интерфейс посредством протокола SSH. В роли SSH-сервера выступает легковесный dropbear [4]. Он поддерживает аутентификацию c использованием открытого ключа (аутентификацию по паролю можно запретить). Сервер не имеет конфигурационного файла, и все настройки передаются параметрами командной строки.
Дополнительные утилиты для генерации ключа SSH-сервера не нужны, dropbear обладает компонентом, реализующим эту задачу:
$ ls -l /usr/bin/dropbearkey
lrwxrwxrwx 1 root root 16 Feb 3 18:49 /usr/bin/dropbearkey -> ../sbin/dropbear
|
Следующей командой можно сгенерировать ключ RSA длиной 1024 байта, записываемый в файл /tmp/tmpkey:
$ /usr/bin/dropbearkey -t rsa -f /tmp/tmpkey -s 1024
Как уже сообщалось, существуют и другие интерфейсы управления, доступные через Web: стандартно имеющийся в системе (webif) и от проекта X-Wrt (webif^2). X-Wrt – веб-интерфейс и набор расширений к OpenWRT, увеличивающий простоту и удобство управления. Текущая стабильная версия – webif^2 (0.3-8), именно она и будет использована в примерах.
В OpenWRT по умолчанию используется целых три файловых системы: JFFS2, SquashFS и mini_fo.
SquashFS – это ФС только для чтения со сжатием. В ней хранится «базовый образ» системы, он монтируется в /rom.
В JFFS2 хранятся все изменяемые данные, расположенные на FLASH маршрутизатора, они монтируются в /jffs.
При изменении файл копируется с SquashFS на JFFS2, имеющую возможность записи, и уже там изменяется. После этого всегда используется версия файла c JFFS2. Такую возможность прозрачно реализует ФС mini_fo, она примонтирована в /.
Выглядит это следующим образом:
# mount
/dev/root on /mnt/rom type squashfs (ro)
/dev/mtdblock/4 on /mnt/jffs type jffs2 (rw)
/jffs on / type mini_fo (rw)
|
Процесс прошивки OpenWRT в маршрутизатор
Общепринятым и наиболее универсальным способом начальной установки является инсталляция посредством tftp (легковесный FTP, работающий поверх UDP, а не TCP). Загрузчик рассматриваемого устройства создан таким образом, что может принять образ прошивки по tftp и записать его на встроенную flash-память. Для проведения этой операции потребуется клиент tftp.
Для установки выберем минимальный образ системы, который можно скачать по адресу: http://downloads.openwrt.org/whiterussian/0.9/micro.
Названия файлов в этой директории формируются следующим образом: openwrt-<модель|архитектура>-<версия_ядра>-squashfs.<bin|trx>. Для используемой модели маршрутизатора нужен образ openwrt-brcm-2.4-squashfs.trx. Информация об особенностях выбора и инсталляции версии OpenWRT именно для различных роутеров опубликована на странице документации сайта разработчиков [5].
Настройку локального адреса маршрутизатора на 192.168.1.1 можно осуществить через стандартный веб-интерфейс.
Для того чтобы перевести ASUS WL-500g в режим инсталляции по tftp, необходимо отключить провод питания, зажать кнопку «restore», подключить кабель питания и отпустить кнопку. Характерным признаком того, что роутер ожидает tftp-подключения, будет мигающий индикатор «PWR».
Запуск клиента tftp и установка новой прошивки:
$ tftp 192.168.1.1
tftp> get ASUSSPACELINK\x01\x01\xa8\xc0 /dev/null
tftp> binary
tftp> put openwrt.trx ASUSSPACELINK
tftp> quit
Строка «\x01\x01\xa8\xc0» – не что иное, как 1.1.168.192, записанное в шестнадцатеричной системе счисления.
В случае Linksys-процесс будет выглядеть следующим образом:
$ tftp 192.168.1.1
tftp> rexmt 1
tftp> ntrace
tftp> binary
tftp> put openwrt.bin
tftp> quit
Кроме возможности установки через TFTP, для многих маршрутизаторов существует и другой способ первоначальной инсталляции: через штатный веб-интерфейс. Для маршрутизаторов ASUS также есть специальное программное обеспечение, работающее под управлением ОС Windows, позволяющее осуществлять прошивку и восстанавливать ее в случае повреждения содержимого.
Далее необходимо подключиться к маршрутизатору по telnet, изменить пароль пользователя root, отключить запуск telnetd и установить имя маршрутизатора:
# telnet 192.168.1.1
root@OpenWrt # passwd
root@OpenWrt # nvram set telnet_enable=0
root@OpenWrt # nvram set wan_hostname=router
root@OpenWrt # nvram commit
root@OpenWrt # reboot
В этом примере используется утилита nvram. Она позволяет управлять практически всеми конфигурационными параметрами. Последние сохраняются в специальную область постоянной памяти. Рассмотрим ее основные возможности:
- nvram set <имя_параметра>=<значение_параметра> – установить значение параметра;
- nvram get <имя_параметра> – получить значение параметра;
- nvram unset <имя_параметра> – удалить параметр;
- nvram show – вывести полный список параметров и их значений;
- nvram commit – записать параметры в постоянную память (количество циклов перезаписи ограничено, не делайте это слишком часто).
Теперь, для того чтобы подключиться к маршрутизатору, необходимо использовать SSH:
$ ssh 192.168.1.1 -l root
Password:
root@router:~#
|
Добро пожаловать в мир OpenWRT!
Рассмотрим самый простой случай настройки Интернета на маршрутизаторе:
# nvram set lan_proto=static
# nvram set lan_ipaddr=192.168.2.2
# nvram set lan_gateway=192.168.2.1
# nvram set lan_dns=192.168.2.1
# nvram commit
# ifup lan
Таким образом, для внутреннего интерфейса LAN-роутера установлены: способ настройки – статический адрес, IP-адрес – 192.168.2.2, шлюз по умолчанию – 192.168.2.1, DNS-сервер – 192.168.2.1. Стоит обратить внимание на то, что на данном этапе маршрутизатор имеет доступ в Интернет через LAN-порт. Такая настройка удобна на стадии конфигурации. Команда ifup заново инициализирует группу интерфейсов (в данном случае имя группы lan).
Чтобы указать для WAN-порта статический IP-адрес, нужно у названий параметров изменить префикс с lan на wan (например: wan_proto=static).
Теперь можно обновить список пакетов из Интернета и установить более функциональную версию ipkg (по умолчанию установлен shell-скрипт):
# ipkg update
# ipkg install ipkg
Специфика сетевых соединений
Рассмотрим несколько подробнее внутреннее устройство сетевых соединений SOC-маршрутизатора. Как видно на схеме (рис. 1), внутри устройства находится 5-портовый коммутатор. Модуль Wi-Fi подключен посредством MINI-PCI, и OpenWRT видит его как одно из обычных Ethernet-соединений.
Рисунок 1. Внутреннее устройство сетевых соединений SOC-маршрутизатора
Таким образом, внешние виды соединений в OpenWRT проецируются следующим образом:
- Порты, помеченные как LAN на маршрутизаторе, доступны через eth0.
- Порт, помеченный как WAN на маршрутизаторе, доступен через eth1.
- Доступ к беспроводному соединению осуществляется через eth2.
Для того чтобы клиенты, подключенные локально в Ethernet-порты и через беспроводное соединение, имели доступ друг к другу, из соединений eth0 и eth2 собран Ethernet-мост, обеспечивающий между ними прозрачную передачу данных на канальном уровне.
Для рассматриваемого роутера настройки будут выглядеть так:
wan_ifname=eth1
lan_ifname=br0
lan_ifnames="eth0 eth2"
Рассмотренная схема является достаточно простой, однако маршрутизаторы, обладающие большей функциональностью, обычно устроены несколько сложнее. Рассмотрим внутреннее сетевое устройство роутера на примере ASUS WL500-g Premium (см. рис. 2).
Рисунок 2. Внутреннее сетевое устройство роутера на примере ASUS WL500-g Premium
Вместо 5-портового коммутатора на плату установлен 6-портовый управляемый коммутатор. Один из двух Ethernet-портов, реализованных внутри CPU, не используется. Таким образом, OpenWRT использует два Ethernet-порта.
На управляемом коммутаторе сконфигурировано две виртуальных сети (VLAN).
В первый VLAN (номер 0) входят все порты кроме 0. Ко второму VLAN, имеющему идентификационный номер 1, отнесены порт 0 без тегирования и порт 5 с тегированием.
В OpenWRT включена поддержка и добавлены два VLAN – с номерами 0 и 1 соответственно.
Таким образом, внешние виды соединений в OpenWRT для более сложного устройства можно описать следующим образом:
- Порты, помеченные как LAN на маршрутизаторе, доступны через vlan0.
- Порт, помеченный как WAN на маршрутизаторе, доступен через vlan1.
- Доступ к беспроводному соединению осуществляется через eth2.
При такой конфигурации настройки VLAN в OpenWRT будут выглядеть следующим образом:
vlan0hwname=eth0
vlan0ports="1 2 3 4 5*"
vlan1hwname=eth0
vlan1ports="0 5*"
Внешний Ethernet-интерфейс (WAN) будет иметь следующие настройки:
wan_ifname=vlan1
Локальный интерфейс будет сконфигурирован как мост из двух других соединений:
lan_ifname=br0
lan_ifnames="vlan0 eth2"
Настройка поддержки USB-носителя
USB flash-накопитель может понадобиться в совершенно разных ситуациях. На нем можно хранить файлы, осуществляя доступ к ним посредством FTP-сервера, установленного на маршрутизаторе, и многое другое.
На этом шаге у маршрутизатора уже настроен доступ к Интернету.
В зависимости от типа USB, которым обладает маршрутизатор, возможны следующие варианты:
UHCI USB 1.1:
# ipkg install kmod-usb-uhci
# insmod usbcore
# insmod uhci
OHCI USB 1.1:
# ipkg install kmod-usb-ohci
# insmod usbcore
# insmod usb-ohci
USB 2.0:
# ipkg install kmod-usb2
# insmod usbcore
# insmod ehci-hcd
Не подошедшие модули ядра рекомендуется удалить следующим образом:
# ipkg remove <имя_пакета>
Также понадобится модуль ядра, отвечающий за поддержку USB-накопителей:
# ipkg install kmod-usb-storage
# insmod scsi_mod
# insmod sd_mod
# insmod usb-storage
Модуль usb-storage зависит от scsi_mod и sd_mod (они установлены в системе по умолчанию), поэтому сначала надо загрузить их.
При установке модулей ядра ipkg создает файлы в директории /etc/modules.d, поэтому после перезагрузки они будут подгружаться автоматически.
Кроме того, может понадобиться поддержка некоторых файловых систем, таких, как vfat, ext2, ext3. Рассмотрим пример подключения поддержки ФС ext2:
# ipkg install kmod-ext2
# insmod ext2
Для управления таблицей разделов можно установить fdisk:
# ipkg install fdisk
Если же существует необходимость в работе с ФС ext2/ext3 прямо с маршрутизатора, можно установить e2fsprogs. Этот набор утилит отсутствует в репозиториях, настроенных в системе по умолчанию, так что в конфигурационный файл ipkg надо добавить дополнительное хранилище пакетов:
# echo "src kamikaze-backports http://downloads.openwrt.org/backports/rc5/" >> /etc/ipkg.conf
# ipkg update
# ipkg install e2fsprogs
Теперь маршрутизатор обладает полной поддержкой USB-накопителей, может менять на них таблицу разделов, создавать файловые системы.
Настройка swap на USB-накопителе
Не буду вдаваться в подробности разбивки диска с использованием fdisk – лишь замечу, что раздел, который будет использоваться для swap, станет первым на диске. В OpenWRT по умолчанию не установлены утилиты управления swap.
Их инсталляция через ipkg осуществляется так:
# ipkg install swap-utils
Создание swap в первом разделе уже подключенного и настроенного USB-накопителя:
# mkswap /dev/scsi/host0/bus0/target0/lun0/part1
Настройка автоматической активации swap:
# echo -e "#!/bin/sh\nswapon /dev/scsi/host0/bus0/target0/lun0/part1\n" > /etc/init.d/S20swap
# chmod +x /etc/init.d/S20swap
После перезагрузки маршрутизатора можно проверять состояние swap:
# free
total used free shared buffers
Mem: 14308 10696 3612 0 668
Swap: 31336 0 31336
Total: 45644 10696 34948
|
Перенос корня на USB-накопитель
Так как используемый роутер имеет всего 4 Мб flash-памяти, целесообразно использование внешнего USB-накопителя в качестве корневого устройства. Если вы не собираетесь устанавливать большое количество пакетов или в вашем маршрутизаторе установлен достаточный объем памяти, пропустите этот шаг.
Создадим файловую систему ext2 на втором разделе USB-накопителя, куда будет производиться перенос. Примонтируем ее к /tmp и скопируем со встроенной flash-памяти данные:
# mkfs.ext2 /dev/scsi/host0/bus0/target0/lun0/part2
# ln -s /proc/mounts /etc/mtab
# mount /dev/scsi/host0/bus0/target0/lun0/part2 /mnt
# mkdir /tmp/root
# mount -o bind / /tmp/root
# cp /tmp/root/* /mnt -a
# umount /tmp/root
# umount /mnt
Следующим шагом необходимо заменить init. Существующий /sbin/init является символической ссылкой, указывающей на BusyBox – его можно смело удалять:
# rm /sbin/init
На месте стандартного init разместим shell-скрипт, подгружающий необходимые модули (поддержки USB и нужной ФС) и изменяющий корневой каталог. Создадим файл /sbin/init следующего содержания:
#!/bin/sh
for module in usbcore usb-ohci scsi_mod sd_mod usb-storage ext2; do {
insmod $module
}; done
sleep 5s
mount /dev/scsi/host0/bus0/target0/lun0/part2 /mnt
[ -x /mnt/sbin/init ] && {
mount -o move /proc /mnt/proc && \
pivot_root /mnt /mnt/mnt && {
mount -o move /mnt/dev /dev
mount -o move /mnt/tmp /tmp
mount -o move /mnt/jffs2 /jffs2 2>&-
mount -o move /mnt/sys /sys 2>&-
}
}
exec /bin/busybox init
Добавим права на запуск:
# chmod +x /sbin/init
После перезапуска системы картина выглядит следующим образом:
# mount
/dev/root on /mnt/rom type squashfs (ro)
/dev/mtdblock/4 on /mnt/jffs type jffs2 (rw)
/jffs on /mnt type mini_fo (rw)
/dev/scsi/host0/bus0/target0/lun0/part2 on / type ext2 (rw)
# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 832.0k 832.0k 0 100% /mnt/rom
/dev/mtdblock/4 2.4M 840.0k 1.6M 35% /mnt/jffs
/jffs 832.0k 832.0k 0 100% /mnt
/dev/scsi/host0/bus0/target0/lun0/part2 89.7M 3.5M 81.6M 4% /
|
Таким образом, теперь маршрутизатор имеет 90 Мб памяти для установки пакетов вместо 4 Мб.
Установка веб-интерфейса
Рассмотрим упомянутую возможность установки веб-интерфейса для управления OpenWRT. Стоит помнить, что на практике он приносит не очень много пользы и может быть использован лишь для базовой конфигурации. В репозиториях, настроенных по умолчанию, актуальной версии X-Wrt нет.
Для ее установки необходимо выполнить следующую команду:
# ipkg install http://ftp.berlios.de/pub/xwrt/webif_latest_stable.ipk
Далее установка будет произведена полностью автоматически, и все необходимые пакеты будут установлены. Через несколько минут вы сможете обратиться к вашему роутеру по протоколу HTTP. Логин и пароль – системные, то есть те же, что используются для доступа по SSH. Интерфейс интуитивно понятен и прост в освоении, поэтому никаких примеров его использования приведено не будет. X-Wrt предоставляет доступ ко всем настройкам (благодаря наличию возможности прямого редактирования nvram и файлов), но работает не так быстро, как SSH. Стандартную же конфигурацию достаточно приятно проводить через него (рис. 3).
Рисунок 3. Веб-интерфейс для управления OpenWRT
Одной из приятных особенностей X-Wrt является то, что не требуется перезагрузка роутера после изменения тех или иных настроек, как это происходит в стандартных прошивках. Более того, сначала необходимые изменения собираются в «корзину», а потом разом подтверждается все (это уменьшает количество перезаписываний nvram).
Используемый в рассматриваемой версии X-Wrt webif^2 находится на стадии разработки, но достаточно стабилен, хотя некоторые проблемы (случайные сообщения об ошибках, пропадающие так же неожиданно, как и появляющиеся) периодически возникают. Также он не всегда корректно осуществляет настройку тех или иных служб.
Замечу, что основная аудитория OpenWRT – это продвинутые пользователи или администраторы ОС GNU/Linux, которым гораздо ближе и удобнее командная строка.
Настройка PPPoE-клиента
Все достаточно просто и очевидно. Для PPPoE-подключения необходимо установить модуль к ядру, модуль к pppd, реализующий pppoe, и сам pppd.
Все как в обычном Linux:
# ipkg install kmod-pppoe
# ipkg install ppp
# ipkg install ppp-mod-pppoe
Далее приведу список параметров, хранящихся в nvram и отвечающих за конфигурацию PPPoE:
- ppp_username=<имя_пользователя> – устанавливает имя пользователя;
- ppp_passwd=<пароль> – устанавливает пароль;
- ppp_redialperiod=15 – указывает задержку между попытками повторного подключения (в случае разрыва соединения или других ошибок);
- ppp_demand=<timeout> – если установлено, то PPPoE включается только по необходимости и отключается, если время простоя превышает значение, указанное переменной timeout (в секундах);
- ppp_mtu= – значение mtu для PPPoE-соединения, по умолчанию используется 1492;
- wan_proto=pppoe – обязательно должно быть установлено именно такое значение, иначе скрипты автоматической инициализации не будут работать. Указывает тип подключения внешнего порта (может быть: none, static, dhcp, pppoe, pptp, ...).
Настройкой интерфейса, а точнее, запуском pppd с необходимыми параметрами занимается shell-скрипт /sbin/ifup.pppoe. Он выбирает параметры из nvram (посредством nvram get) и согласно им запускает pppd. Без перезагрузки (вручную) запускать и останавливать PPPoE можно с помощью следующих команд:
# ifup.pppoe wan
# ifdown wan
Если вы столкнулись с какой-то проблемой или нестандартной ситуацией, можете с легкостью исправить эти скрипты. Написаны они очень кратко, и при этом, к сожалению, их качество оставляет желать лучшего.
Настройка PPTP-клиента
Первым делом необходимо установить модули ядра и PPTP-клиент.
# ipkg install kmod-gre
# ipkg install kmod-mppe
# ipkg install pptp
Для конфигурации конкретного соединения можно либо воспользоваться веб-интерфейсом, либо произвести следующие действия:
# echo 'somepear vpn.foo.bar someuser' >> /etc/ppp/pears.pptp
# echo 'someuser pptp:somepear somepass *' >> /etc/ppp/chap-secrets
# /etc/init.d/S90pptp start somepear
# /etc/init.d/S90pptp stop somepear
В этом примере:
- somepear – название точки доступа;
- vpn.foo.bar – адрес PPTP-сервера;
- someuser – имя пользователя;
- somepass – пароль пользователя.
Для того чтобы установить дополнительные правила маршрутизации или брандмауэра, можно воспользоваться скриптами pppd ip-up и ip-down. Рассмотрим следующий пример:
# cat > /etc/ppp/ip-up.d/somepear
#!/bin/sh
interface_name=$1
remote_ip=$4
ipparam=$5
if [ "${ipparam}" = "pptp:somepear" ]; then
/sbin/route add -net 10.0.0.0 netmask 255.255.248.0 gw $remote_ip dev $interface_name
fi
В этом примере добавляется маршрут к сети 10.0.0.0/21 через IP-адрес удаленной стороны туннеля.
Настройка беспроводного интерфейса
Большинство маршрутизаторов, на которых может быть установлен OpenWRT, относятся к классу беспроводных, то есть имеют адаптер Wi-Fi. Рассмотрим несколько подробней основные параметры беспроводного интерфейса:
- wl0_mode <ap|sta|wet> – режим работы точки Wi-Fi. Значение ap означает режим «точка доступа», sta – режим «клиента беспроводной маршрутизации», wet – режим «беспроводного моста».
- wl0_ssid <essid> – идентификатор беспроводной сети (ESSID).
- wl0_infra <0|1> – инфраструктурный режим сети. Значение 0 – специальный (одноранговый) режим (Ad Hoc mode), 1 – обычный режим.
- wl0_closed <0|1> – вещание ESSID. При установленном значении 1 идентификатор сети не распространяется.
- wl0_channel <канал> – номер канала передачи (число от 1 до 11 и более, в зависимости от беспроводного адаптера, установленного в маршрутизаторе).
- wl0_macmode <disabled|allow|deny> – управление фильтрацией по MAC-адресу. При значении ключа disabled фильтрация отключена, при allow – перечисленным в списке адресам предоставляется доступ, при deny – запрещается.
- wl0_maclist [MAC [MAC]] – список MAC-адресов. Адреса пишутся через пробел в следующем формате: 01:23:45:67:78:9A.
Рассмотрим пример конфигурации, настроив Wi-Fi следующим образом:
nvram set wl0_mode=ap
nvram set wl0_ssid=some_essid
nvram set wl0_infra=1
nvram set wl0_channel=4
nvram set wl0_macmode=disabled
nvram commit
При такой настройке маршрутизатор будет выполнять роль точки доступа Wi-Fi, идентификатор сети будет some_essid, работать беспроводная сеть будет на четвертом канале, а подключиться сможет любой совместимый клиент.
Более подробно об этих и многих других опциях вы сможете узнать на сайте дистрибутива OpenWRT [6].
Настройка DHCP-сервера
В роли DHCP-сервера в OpenWRT в основном используется Dnsmasq – легковесный DHCP-север и DNS-прокси. По умолчанию в OpenWRT все настройки DHCP расположены в nvram, а скрипт запуска получает их оттуда и передает как аргументы dnsmasq. Такой способ управления не очень удобен, да и сложившиеся тенденции (в первом выпуске Kamikaze, новой версии OpenWRT, отказались от nvram) ведут к отказу от использования nvram. Именно поэтому рассмотрим вариант конфигурации с использованием обычных файлов.
Первое, что необходимо сделать – заменить скрипт инициализации /etc/init.d/S60dnsmasq на следующий (связано это с отказом от nvram):
#!/bin/sh
[ ! -f /tmp/dhcp.lease ] && {
touch /tmp/dhcp.lease
}
dnsmasq -C /etc/dnsmasq.conf
Рассмотрим наиболее важные опции конфигурации dnsmasq (/etc/dnsmasq.conf):
- bogus-priv – на запросы обратного преобразования, не разрешенные локально (средствами lease файла или /etc/hosts), отвечать сообщением об отсутствии такого имени.
- dhcp-range=192.168.1.5,192.168.1.200,255.255.255.0,192.168.1.255,12h – устанавливает диапазон выдаваемых IP и время, на которое производится аренда. Формат записи следующий: адрес начала диапазона, адрес конца диапазона, маска сети, широковещательный адрес, время аренды.
- read-ethers – использовать файл /etc/ethers, в котором в формате «MAC-адрес IP-адрес» статически описаны настройки узлов.
- dhcp-option=3,192.168.1.1 – опция указывает шлюз по умолчанию. Формат этой записи следующий: номер опции dhcp, IP-адрес.
- dhcp-option=6,192.168.1.1 – опция указывает адрес DNS-сервера.
С более подробной информацией можно ознакомиться на сайте производителя [7].
Настройка брандмауэра iptables
В OpenWRT по умолчанию отсутствуют такие утилиты, как iptables-save и iptables-restore, и, как следствие, достаточно неудобно распределены конфигурационные файлы. После установки правила брандмауэра описаны в нескольких местах: /etc/config/firewall, /etc/firewall.user, /etc/init.d/S35firewall.
С другой стороны, перестройка под себя скриптов инициализации и конфигурационных фалов брандмауэра тоже вызывает сложности, если вы хотите, чтобы управление «пробросом портов» из веб-интерфейса продолжало работать.
Если vы решили использовать утилиты iptables-save и iptables-restore, сначала нужно выполнить следующую команду:
# ipkg install iptables-utils
Рассмотрим стандартные правила брандмауэра подробнее:
# iptables-save
Таблица брандмауэра nat, правила, отвечающие за ограничение открытия новых TCP-соединений (не более 50 в секунду):
-A NEW -m limit --limit 50/sec --limit-burst 100 -j RETURN
-A NEW -j DROP
-A PREROUTING -m state --state NEW -j NEW
Таблица брандмауэра nat, правило, реализующее механизм NAT:
-A POSTROUTING -o $WAN -j MASQUERADE
Таблица брандмауэра filter, правила, блокирующие некорректные пакеты:
-A INPUT -m state --state INVALID -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-option 2 --tcp-flags SYN SYN -j DROP
Таблица брандмауэра filter, правила, распределяющие входящий трафик по разным цепочкам, разрешающие локальный трафик и ICMP:
-A INPUT -j input_rule
-A INPUT -i $WAN -j input_wan
-A INPUT -j LAN_ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A LAN_ACCEPT -i $LAN -j RETURN
-A LAN_ACCEPT -j ACCEPT
Таблица брандмауэра filter, правила, распределяющие исходящий трафик по разным цепочкам:
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j output_rule
-A OUTPUT -j ACCEPT
-A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
Таблица брандмауэра filter, правила, распределяющие проходящий трафик:
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j forwarding_rule
-A FORWARD -i $WAN -j forwarding_wan
-A FORWARD -i br0 -o br0 -j ACCEPT
-A FORWARD -i $LAN -o $WAN -j ACCEPT
Добавлять собственные правила необходимо в файл /etc/firewall.user. Правила, добавленные через веб-интерфейс, хранятся в файле /etc/config/firewall.
В примерах $WAN означает внешний порт, а $LAN – внутренний. Под портом может пониматься группа из несколько портов и интерфейсов. Смотрите раздел «Специфика сетевых соединений».
Настройка VPN-сервера с использованием PPTPD
Демон PoPToP портирован под OpenWRT и достаточно хорошо работает. Разумеется, CPU, который установлен на маршрутизаторе, не сможет справиться с многомегабитным VPN-трафиком и с большим количеством одновременных подключений.
Однако задачу предоставления более или менее качественного доступа нескольким пользователям успешно решается такой конфигурацией. Установка производится следующим образом:
# ipkg install pptpd
Допустим, необходимо предоставлять доступ в сеть нескольким пользователям. Пользователи должны видеть друг друга, а также все компьютеры, находящиеся в локальной сети. Маршрутизатор является «центральным», и через него проходит весь трафик. Рассмотрим процесс конфигурации такой системы.
/etc/ppp/options.pptpd – конфигурационный файл pppd, в нем описывается множество параметров ppp. Среди них: допустимые способы аутентификации, методы шифрования данных, адрес VPN-сервера для VPN-клиентов и многое другое. Здесь необходимо указать адрес VPN-сервера таким же, что и его основной локальный IP (по умолчанию – 192.168.1.1). Шифрование можно отключить, заменив строку:
mppe required,no40,no56,stateless
на следующую:
nomppe
Для того чтобы клиенты, непосредственно подключенные (по Ethernet) к маршрутизатору (будем называть их локальными), имели связь с VPN-клиентами и наоборот, существует два способа.
Первый способ: разделить клиентов по разным сетям и сделать между ними маршрутизацию. Но тут возникает проблема: если для локальных клиентов маршрутизатор является шлюзом по умолчанию, то для VPN-клиентов это неприемлемо, а значит, потребуется указывать дополнительный маршрут в сеть, в которой находятся локальные клиенты. Указание дополнительных маршрутов невозможно со стороны сервера, поэтому нужна настройка со стороны пользователя.
Второй способ: использовать технологию proxyarp. В этом случае маршрутизатор на ARP-запрос разрешения IP-адреса VPN-клиента, переданный локальным клиентом, будет отвечать MAC-адресом LAN-порта. Таким образом, ни для локальных, ни для внешних клиентов не требуется дополнительная маршрутизация.
Проксирование протокола ARP включается следующим образом:
echo "proxyarp" >> /etc/ppp/options.pptpd
/etc/ppp/chap-secrets – файл паролей, в нем в стандартном формате хранятся записи пользователей.
Предварительно узнав, каково значение параметра name в options.pptpd, добавим пользователя с именем testuser, паролем testpass и IP-адресом 192.168.1.201 (для того чтобы не возникало конфликтов с IP-адресами локальных компьютеров, необходимо переконфигурировать DHCP-сервер, ограничив диапазон выдаваемых адресов):
# cat /etc/ppp/options.pptpd | grep ^name
name "pptp-server"
# echo "testuser pptp-server testpass 192.168.1.201" >> /etc/ppp/chap-secrets
|
Также существует файл /etc/pptpd.conf, содержащий основные параметры PoPToP, значения по умолчанию устроят большинство пользователей.
Кроме того, понадобится настройка брандмауэра, необходимо добавить следующие правила:
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 1723 -j ACCEPT
iptables -A input_rule -i $WAN -p tcp --dport 1723 -j ACCEPT
iptables -A output_rule -p 47 -j ACCEPT
iptables -A input_rule -p 47 -j ACCEPT
Для того чтобы работала передача трафика между локальной сетью и виртуальными клиентами ($WAN – имя вашего внешнего интерфейса, например: eth1 или ppp0) добавим правила:
iptables -A forwarding_rule -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A output_rule -o ppp+ -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A input_rule -i ppp+ -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -A forwarding_rule -i ppp+ -o $WAN -j ACCEPT
Добавление этих правил лучше всего осуществлять с использованием /etc/firewall.user.
Запуск и останов производится посредством скрипта инициализации следующим образом:
# /etc/init.d/S50pptpd start
# /etc/init.d/S50pptpd stop
Теперь, подключившись к маршрутизатору по VPN, можно из любой точки мира работать с компьютерами локальной сети.
Настройка FTP-сервера
В роли FTP-сервера под управлением OpenWRT может быть использован vsftpd. Установить его можно следующим образом:
# ipkg install vsftpd
Для настройки отредактируем конфигурационный файл /etc/vsftpd.conf:
background=YES
listen=YES
write_enable=YES
local_umask=022
check_shell=NO
local_enable=YES
chroot_local_user=YES
anonymous_enable=NO
session_support=NO
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.users
При такой конфигурации будут использоваться системные учетные записи пользователей, но при этом них будет разрешена аутентификация только тем пользователям, имена которых перечислены в файле /etc/vsftpd.users.
Сразу после аутентификации будет происходить смена корня процесса (chroot) в домашнюю директорию пользователя. Поддержка сессий аутентификации (PAM и wtmp) отключена за ненадобностью.
Следующим шагом добавим одного пользователя, разрешим ему пользоваться FTP и установим для него пароль:
# echo "users:x:100:" >> /etc/group
# echo "someuser:*:2000:100:simple user:/data:/bin/false" >> /etc/passwd
# echo "someuser" >> /etc/vsftpd.users
# mkdir /data && chown someuser:users /data
# passwd someuser
Настроим правила брандмауэра, добавив следующие строки в файл /etc/firewall.user:
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 21 -j ACCEPT
iptables -A input_rule -i $WAN -p tcp --dport 21 -j ACCEPT
Настроим автоматическую загрузку:
# mv /etc/init.d/vsftpd /etc/init.d/S65vsftpd
Ручной запуск и останов vsftpd проще всего производить командами:
# vsftpd
# killall vsftpd
Таким образом, после перезагрузки на маршрутизаторе будет функционировать полностью настроенный FTP-сервер.
Настройка отправки почты
Для отправки почты с маршрутизатора удобнее всего использовать SSMTP. Для его установки необходимо выполнить следующее:
# ipkg install ssmtp
После установки необходимо исправить конфигурационный файл /etc/ssmtp/ssmtp.conf и указать в нем почтовый сервер (на нем должна быть разрешена пересылка почты, полученной неавторизованным SMTP для вашего IP, или вы сможете отправлять письма только в рамках одного сервера):
mailhub=mail.foo.bar.ru
Теперь, чтобы отправить письмо с маршрутизатора, достаточно набрать команду:
# ssmtp someuser@foo.bar.ru
To: someuser@foo.bar.ru
From: someuser@foo.bar.ru
Subject: Some notification message
Hello world!
|
Имя пользователя и пароль для SMTP-аутентификации можно указывать в командной строке посредством флагов -auusername и -appassword соответственно. Такая отправка писем обычно используется для различных уведомлений, лог-файлов и другого.
Настройка cron
OpenWRT по умолчанию идет в поставке с работающим демоном cron (часть BusyBox). Для его активации необходимо выполнить лишь действие:
# nvram set cron_enable=1 && nvram commit
# /etc/init.d/S60cron start
Теперь в качестве примера настроим синхронизацию с сервером времени, которая будет происходить каждый час. Для этого нам понадобится сначала установить ntpclient:
# ipkg install ntpclient
Настройка cron для ежечасной синхронизации, выполняемой от имени пользователя root, будет выглядеть так:
echo "0 * * * * /usr/sbin/ntpclient -h europe.pool.ntp.org -s" >> /etc/crontabs/root
Второй способ управления crontab – вызов программы /usr/bin/crontab (BusyBox) с параметром -e.
Другие возможные применения
Стоит учитывать, что в статье описаны далеко не все возможности применения OpenWRT. Так например, существуют возможности скачивания файлов с помощью утилит Wget и cTorrent, создания почтового сервера на базе XMail, организация сервера печати (в случае наличия USB- или LPT-порта), установки Samba и множества других пакетов. Полный список пакетов можно найти в уже упомянутой поисковой системе [8].
Удачи!
Приложение
Предупреждение
Обратите внимание, что вы несете всю ответственность за любые потери, вызванные применением на практике материала этой статьи.
Аппаратные доработки
Многие маршрутизаторы обладают небольшим объемом памяти, при этом их адресная шина имеет разрядность, достаточную для адресации большего объема ОП. Таким образом, становится возможной замена модулей памяти меньшего размера (например, 8 Мб) на большие (например, 16 или 32 Мб). Историю успеха такой аппаратной модернизации вы можете подробнее изучить на русскоязычном форуме, посвященном прошивкам для ASUS [9]. Замечу, что такие эксперименты наиболее интересны любителям «олова и паяльника».
- http://wiki.openwrt.org/TableOfHardware.
- http://www.ipkg.be/repositories.
- http://wiki.openwrt.org/UsbStorageHowto.
- http://matt.ucc.asn.au/dropbear/dropbear.html.
- http://wiki.openwrt.org/CategoryModel.
- http://wiki.openwrt.org/OpenWrtDocs/Configuration.
- http://www.thekelleys.org.uk/dnsmasq/doc.html.
- http://ipkg.be.
- http://wl500g.info/showthread.php?t=7048.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|