MarsBoard. Debian. Роутер. HOWTO

в 19:14, , рубрики: Debian, diy или сделай сам, howto, linux, MarsBoard, SoC, wifi роутер, метки: , , , , ,

MarsBoard. Debian. Роутер. HOWTO
Доброго времени суток, сообщество! Я уже писал по поводу замечательной платы на чипе 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.
Далее:

  1. Переходим в папку со скачанными файлами
  2. Пишем систему на карту:
    bzip2 -dc a10-debian-server-2gb.2013-09-20.img.bz2 > /dev/sdX
    
  3. Пишем 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)

В итоге должна быть примерно такая картина:
MarsBoard. Debian. Роутер. HOWTO
Далее жмём 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js