Доброго времени суток, сообщество! Я уже писал по поводу замечательной платы на чипе Allwinner A10 — MarsBoard. Тот пост был чем-то вроде «Getting Started», этот же будет посвящён целиком и полностью превращению этого чуда враждебной техники в полноценную точку доступа WiFi и роутер по совместительству. Для создания точки мне поможет сборка Debian Server (кстати, ядро мы тоже будем собирать:)) и USB-адаптер TP-Link TL7200ND. Тип соединения с провайдером — PPPoE. Заинтересовались? Добро пожаловать под кат.
Вместо предисловия
Если честно, как только мне пришла в голову такая идея, я даже и не думал, что придётся встретиться с таким количеством подводных камней. Ну на то он наверное и Linux… К слову, все манипуляции в статье будут производиться с помощью компьютера под управлением ОС Ubuntu и кардридера для SD-карточки. И сразу советую выполнить sudo su
в том сеансе терминала, из под которого будем производить все действия.
Система
Для своих опытов я таки решил отказаться от того приносящего тапочки в постель бульдозера, который предлагает нам офсайт. Удалось найти готовую сборку Debian Server, но пришлось пошаманить с ядром. Но об этом позже. По сути, установка сводится к записи образа на 2(или больше)GB SDCard и установке bootloader'a (с офсайта платы).
Итак, поехали. Подключаем SDCard к компьютеру и командой fdisk -l
узнаём имя устройства карточки. У меня /dev/sdc
. Далее устройство карточки в статье буду обозначать как sdX
. Вместо X
подставляете свою букву.
Качаем всё необходимое. Систему (рассмотрю действия со сборкой 2013-Sep-20 10:32:33), uboot.bin, sunxi-spl.bin.
Далее:
- Переходим в папку со скачанными файлами
- Пишем систему на карту:
bzip2 -dc a10-debian-server-2gb.2013-09-20.img.bz2 > /dev/sdX
- Пишем bootloader:
dd if=spl/sunxi-spl.bin of=/dev/sdX bs=1024 seek=8 dd if=u-boot.bin of=/dev/sdX bs=1024 seek=32
Систему поставили, отлично, идём дальше.
Начало танцев — драйвера
Собственно, с этого и началась вся эпопея запинок о те самые подводные камни. Оказалось, что драйверов для чипов Ralink, на коем работает на адаптер, существует 2 типа — «старые» и «новые». Старые драйвера ставятся автоматом через apt-get и работают «из коробки», но работают только в Managed-режиме, т.е. адаптер может только подключаться к уже существующей точке, но не может сам эту точку создать. Для создания точки требуется перевести адаптер в режим Master, а для этого нужны те самые «новые» драйвера. Только вот эти новые крутые дровишки надо… собирать. Ну что, собирать так собирать.
Идём сюда: www.ralinktech.com/support.php?s=2 и скачиваем RT2870_Firmware_V22. Распаковываем и пишем в /lib/firmware в файловую систему на SDcard.
Далее качаем compat-wireless: www.orbit-lab.org/kernel/compat-wireless-2.6/. Это собственно то, что нам нужно скомпилировать.
Но не всё так просто. Так как я ещё только разбираюсь с Linux, я очень удивился, когда обнаружил, что для компиляции драйверов мне понадобятся исходники моего текущего ядра. И ещё более удивился, когда не нашёл их в системе. Благо автор сборки любезно предоставил конфигурацию ядра, там используемого. Её мы и возьмём, чтобы собрать исходники. Итак, немного отвлечёмся от драйверов и посозерцаем пересборку ядра.
Ядро
Как я уже сказал, для сборки дров нам нужны исходники ядра, а для сборки специфичных исходников нам нужны… универсальные исходники linux-sunxi. Также нам нужно будет немного поправить конфигурацию, чтобы вынести встроенные в ядро версии драйверов в модули. Так мы их сможем заменить на compat-wireless.
Первым делом, ставим на компьютер всё необходимое:
apt-get install git build-essential fakeroot kernel-package u-boot-tools zlib1g-dev libncurses5-dev
И добавляем этот репозиторий в файл /etc/apt/sources.list
:
deb http://www.emdebian.org/debian/ unstable main
Далее обновляем apt и ставим кросс-компилятор:
apt-get update
apt-get install emdebian-archive-keyring
apt-get install gcc-4.7-arm-linux-gnueabihf
ln -sf `which arm-linux-gnueabihf-gcc-4.7 ` /usr/local/bin/arm-linux-gnueabihf-gcc
Далее нам необходимо скачать с гитхаба исходный код ядра. Клонируем репозиторий себе, переходим в папку с исходниками и переключаемся на версию 3.4:
git clone https://github.com/linux-sunxi/linux-sunxi linux-sunxi
cd linux-sunxi
git checkout sunxi-3.4
Дальше качаем базовый файл конфигурации ядра, переименовываем в .config
и кладём в корневую папку исходников. Теперь немного конфигурации. Нам нужно выставить всё, что связано с «80211» в режим модуля. Для этого выполняем:
ARCH=arm make menuconfig
Этой командой собирается псевдографическая утилита конфигурации ядра. Выбираем в ней Networking
, потом Wireless
. Выбираем следующие строки одна за одной и нажимаем клавишу M на клавиатуре:
cfg80211 - wireless configuration API
Common routines for IEEE802.11 drivers
Generic IEEE 802.11 Networking Stack (mac80211)
В итоге должна быть примерно такая картина:
Далее жмём Exit
и ещё раз Exit
. Попадаем в главное меню, проматываем вниз и жмём Save an Alternate Configuration File
. Подтверждаем и выходим из утилиты.
Всё, ядро мы настроили, теперь можно собирать. Выполняем следующие команды:
export ARCH=arm
export DEB_HOST_ARCH=armhf
export CONCURRENCY_LEVEL=`grep -m1 cpu cores /proc/cpuinfo | cut -d : -f 2`
fakeroot make-kpkg --arch arm --cross-compile arm-linux-gnueabihf- --initrd --append-to-version=-mykernel kernel_image kernel_headers
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- EXTRAVERSION=-mykernel uImage
cp arch/arm/boot/uImage ../uImage
В итоге после компиляции в каталоге уровнем выше будут лежать 3 файла: пакет с ядром, пакет с исходниками и uImage. Флешку с образом ещё не отключили? Идём туда, заливаем все 3 файла куда-нибудь в корень root. Далее вставляем флешку в плату, с помощью SSH ставим пакеты ядра и исходников. Отключаем, втыкаем обратно в комп. Далее идём в раздел с ядром (там лежат файлы script.bin, uImage и т.д.) и копируем туда с заменой новый uImage из корня второго раздела. Загружаемся с новым ядром и опять же в SSH-терминале прописываем команды:
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/source
ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build
Всё, теперь система готова к компиляции драйверов.
Продолжаем собирать драйвера
Переходим в папку к распакованному compat-wireless (помните скачивали?). Выполняем:
./scripts/driver-select rt2x00
make
make install
Далее нужно записать в блэклист «старые» драйвера. Дописываем в файл /etc/modprobe.d/blacklist.conf
следующие строки:
blacklist rt2870sta
blacklist rt5370sta
Перегружаемся.
Настройка самого роутера
Итак, пришло время установить всё, что нужно для раздачи интернета и организации локальной сети. В качестве DHCP-сервера я выбрал dnsmasq, точкой доступа будет управлять hostapd, а соединение с провайдером будет обеспечено утилитой pppoeconf. Я не буду здесь рассматривать настройку firewall с помощью Iptables, так как информации по этому делу достаточно много в интернете, а покажу лишь базовый проброс. Он нам жизненно необходим. Итак, погнали.
Соединяемся опять же по SSH и ставим всё, что нужно:
apt-get install hostapd dnsmasq pppoeconf
1. Настраиваем hostapd
hostapd — утилита для создания и управление программной точкой доступа WiFi. Имеет 2 места, из которых можно её настроить.
Первое — /etc/default/hostapd
. Настройка автозапуска. Заменяем всю писанину там на следующие строчки:
RUN_DAEMON = yes
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Второе место — /etc/hostapd/hostapd.conf
. Основные настройки. Настроить тут можно достаточно много параметров, но я лишь приведу свою конфигурацию и объясню, что и зачем я туда вписал:
# интерфейс, на котором висит адаптер:
interface=wlan0
# имя драйвера адаптера:
driver=nl80211
# имя точки доступа:
ssid=MyAP
# код страны, влияет на список доступных мощностей и частот:
country_code=RU
# стандарт передачи:
hw_mode=g
# канал, на котором будет висеть точка:
channel=8
# это всё нужно для корректной настройки защиты:
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
# пароль к точке:
wpa_passphrase=superpass
2. Настройка dnsmasq
dnsmasq — DHCP-DNS-TFTP-сервер с интуитивно понятным файлом конфигурации и рядом печенек. У него тоже есть файл конфигурации в /etc/default/
, но мы его трогать не будем, ибо ничего интересного там нет. Займёмся основным конфигом — /etc/dnsmasq.conf
. Как и с hostapd, я покажу и расскажу про свой вариант конфигурации:
# интерфейс, который НАДО слушать:
interface=wlan0
# интерфейс, который НИ В КОЕМ СЛУЧАЕ НЕ НАДО слушать (это наше окно в сеть, о нём чуть позже):
except-interface=ppp0
# улучшалки производительности:
bind-interfaces
cache-size=1000
domain-needed
bogus-priv
# конкретно эта улучшалка делает наш сервер главным в локальной сети:
dhcp-authoritative
# макс. кол-во доступных для аренды адресов:
dhcp-lease-max=100
# диапазон раздачи адресов (c, по, время аренды):
dhcp-range=192.168.1.5,192.168.1.100,12h
3. Настройка интерфейсов
Следующим шагом будет настройка интерфейсов, так как их конфигурация нужна для правильной настройки PPPoE-соединения. Как известно, интерфейсы настраиваются в файле /etc/network/interfaces. Приводим его к такому виду:
# локальная петля, не интересует:
auto lo
iface lo inet loopback
# эзернет, оставляем автоконфигурацию:
auto eth0
iface eth0 inet dhcp
# интерфейс адаптера:
auto wlan0
iface wlan0 inet static
# адрес самого роутера в локалке:
address 192.168.1.1
# маска подсети:
netmask 255.255.255.0
# широковещательный адрес:
broadcast 192.168.1.255
4. Настройка PPPoE
Утилита pppoeconf предоставляет псевдографический интерфейс для полуавтоматического конфигурирования соединения с провайдером. Делается это путём набора одноимённой команды в терминале:
pppoeconf
Далее там всё интуитивно понятно, после успешной конфигурации в файл настройки сетевых интерфейсов добавится примерно такая запись:
auto ppp0
iface ppp0 inet ppp
pre-up /sbin/ifconfig eth0 up
provider dsl-provider
5. Базовый проброс
Последним шагом будет настройка проброса пакетов из локальной сети во внешнюю и обратно (маскарадинг)
Выполняем следующее для установки этого самого MASQUERADE и автозагрузки конфигурации в iptables при запуске системы:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -o eth0 -j ACCEPT
iptables -A FORWARD -o ppp0 -j ACCEPT
iptables-save > /etc/wifi-iptables.conf
echo '#!/bin/sh' > /etc/network/if-up.d/iptables
echo 'iptables-restore < /etc/wifi-iptables.conf' >> /etc/network/if-up.d/iptables
chmod +x /etc/network/if-up.d/iptables
Перезагружаемся…
Вместо заключения
Фуууххх, ну вот вроде и всё. Устали? Зато теперь у нас есть рабочий роутер на базе довольно шустрой платы, да ещё и с таким хорошим адаптером. По моим тестам, пинг в онлайн-играх не превышает 15-25ms, а за 2 недели аптайма вся система заглючила один раз, что вылечилось передёргиванием питания.
Кстати, о питании. Выяснилось, что для стабильной работы устройства вместе с адаптером требуется блок питания, расчитанный на мощность как минимум в 1000mA. Обратите внимание, импульсные зарядники от нокий не подходят! Не ведитесь на совпадение штекеров!
Напоследок, хочу выразить благодарность:
- Интернет-магазину DONT.RU за обеспечение необходимым железом
- Человеку с ником RM и его замечательному ресурсу
P.S.: буду очень признателен за конструктивную критику, но подчеркну, что пеной здесь плеваться совершенно не обязательно. Если вы знаете, как сократить кол-во шагов или сделать что-то лучше, поделитесь, я буду обновлять статью.
Автор: Man197