Знакомство с Yocto Project Установка Yocto Project в Ubuntu Назначение проекта "Router-bs" Требования к оборудованию Краткая инструкция по использованию Краткая инструкция по сборке дистрибутива Административный пароль по умолчанию Первое включение устройства Запись образа Router-bs на карту памяти "microSDHC" Запись дистрибутива Router-bs скаченного с нашего ресурса на карту памяти Механизм сборки дистрибутива в Yocto Project Пакет поддержки платформы "Raspberry PI" Поддержка USB сетевых плат в "Raspberry PI" Настройка сетевого интерфейса роутера Настройка DHCP сервера на роутере Фильтрация сетевых пакетов - функции Брандмауэра Конфигурация "Зоны" нашего роутера Интерфейсы и хосты Политики Настройка трансляции сетевых адресов NAT Настройка правил фильтрации Остановка Shorewall Конфигурация Shorewall еще примеры настройки Shorewall Рецепт сборки Shorewall для слоя meta-router-bs Рецепт сборки образа Router-bs Загрузка дистрибутива Router-bs
Будучи проектом совместного сотрудничества (иногда такие проекты называются "зонтичными"), Yocto Project охватывает различные составляющие процесса разработки. Эти составляющие именуются проектами в рамках общего проекта Yocto Project и включают в себя инструменты для сборки, метаданные инструкций по сборке (называемые рецептами), библиотеки, утилиты и графические интерфейсы.
Poky – это эталонная система сборки в рамках проекта Yocto Project. Она включает в себя BitBake, OpenEmbedded-Core, пакет поддержки платформы (Board Support Package, BSP), а также прочие пакеты и компоненты, объединенные в единую сборку. Название Poky также относится к эталонному дистрибутиву Linux, который создается этой системой сборки и может быть чрезвычайно минималистичным (core-image-minimal) или же представлять собой полноценную систему Linux с графической оболочкой (core-image-sato)
Систему сборки Poky можно рассматривать как эталонную систему для всего проекта – рабочий пример реального процесса. При загрузке Yocto Project фактически вы получаете экземпляр этих инструментов, утилит, библиотек, вспомогательных средств и метаданных, которые можно использовать для создания системы по умолчанию, как это описывается в нашей статье. Как эталонная система, так и эталонный дистрибутив, который она создает, называются Poky. Вы можете использовать Poky как начальную точку для создания ваших собственных дистрибутивов, которые, конечно же, могут называться как угодно.
Для всех систем сборки требуется наличие инструментария toolchain, состоящего из компилятора, ассемблера, линковщика и прочих двоичных утилит, необходимых для создания исполняемых файлов для той или иной архитектуры. Poky использует набор GNU Compiler Collection (GCC), но вы можете указать и другие наборы компиляторов. В Poky используется механизм кросс-компиляции: использование набора компиляторов одной архитектуры для создания исполняемых файлов другой архитектуры (например, сборка ARM-дистрибутива, выполняемая на компьютере с x86-архитектурой). Разработчики часто используют кросс-компиляцию при разработке встраиваемых систем, поскольку их рабочие компьютеры намного мощнее, чем типичная встраиваемая система.
Набор метаданных разделен на слои, каждый из которых обладает дополнительной функциональностью по отношению к нижележащим слоям. Базовый слой называется OpenEmbedded-Core (или oe-core) и содержит общие рецепты, классы и связанные с ними функции, необходимые для любой сборки. Эти сборки впоследствии можно настраивать под собственные нужды, добавляя новые слои поверх слоя oe-core.
OpenEmbedded-Core совместно поддерживается проектами Yocto Project и OpenEmbedded. Слой, отделяющий проект Yocto Project от проекта OpenEmbedded, называется meta-yocto и содержит конфигурацию дистрибутива Poky, а также базовый набор эталонных BSP-пакетов. Сам по себе проект OpenEmbedded является отдельным Open Source-проектом, обладающим собственными схожими рецептами и задачами, но со своей отдельной командой руководителей и областью применения.
Для установки Yocto Project вы можете использовать "bash" скрипт следующего содержимого:
#!/bin/bash
# скрипт предназначен для загрузки среды сборки дистрибутива "Router-bs" для
# одноплатного компьютера "Raspberry Pi", autor "Alexander Demachev", site berserk.tv
#
# система сборки "poky" устанавливается в каталог выше
# скрипт должен запускаться под обычным пользователем,
# но в начале выполнения требует установку пакетов через команду "sudo"
#
# cоздание дистрибутива Linux "Router-bs" для встраиваемых систем осуществляется
# с помощью Yocto Project
# Poky – это эталонная система сборки в рамках проекта Yocto Project.
# Она включает в себя BitBake, OpenEmbedded-Core, пакет поддержки платформы
# Board Support Package, BSP), а также прочие пакеты и компоненты,
# объединенные в единую сборку.
SYSTEM_BUILD="poky-router"
META_ROUTER="meta-router-bs"
BBLAYERS_CONFIG="build/conf/bblayers.conf"
LOCAL_CONFIG="build/conf/local.conf"
CONFIG_MACHINE="raspberrypi2"
TYPE_PACKAGE="deb"
# версия "yocto-project" выбраная в качестве базовой, ветка krogoth от 11 октября 2016
GIT_YOCTO="git://git.yoctoproject.org/poky.git"
REV_YOCTO="40f4a6d075236265086cc79400dea3c14720383a"
DIR_RASPBERRYPI="meta-raspberrypi"
GIT_RASPBERRYPI="http://git.yoctoproject.org/cgit/cgit.cgi/$DIR_RASPBERRYPI"
# перешел на ветку krogoth от 16 сентября 2016
REV_RASPBERRYPI="a5f9b07a820d50ae5fb62e07306cd4e72d8638a9"
get_git_project() {
local git_path="$1"
local git_rev="$2"
local project_dir="$3"
local cur_dir=`pwd`
git clone --no-checkout $git_path $project_dir
cd $project_dir
git checkout $git_rev
cd $cur_dir
}
sudo apt-get install -y --no-install-suggests --no-install-recommends \
sed wget subversion git-core coreutils \
unzip texi2html texinfo libsdl1.2-dev docbook-utils fop gawk \
python-pysqlite2 diffstat make gcc build-essential xsltproc \
g++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev \
autoconf automake groff libtool xterm libxml-parser-perl
old_dir=`pwd`
cd ..
get_git_project "$GIT_YOCTO" "$REV_YOCTO" "$SYSTEM_BUILD"
cd $SYSTEM_BUILD
poky_dir=`pwd`
get_git_project "$GIT_RASPBERRYPI" "$REV_RASPBERRYPI" "$DIR_RASPBERRYPI"
#####################################################################
# инициализация переменных Yocto Project
#####################################################################
source oe-init-build-env ""
cd $poky_dir
# создаем символическую ссылку на слой сборки дистрибутива "Router-bs"
ln -v -s $old_dir/$META_ROUTER $META_ROUTER
# изменение настроек по умолчанию в конфигурационном файле системы сборки "Poky"
# добавление собственного слоя в список слоев BBLAYERS
# и добавление слоя сборки для "Raspberry Pi"
sed -i "s|meta-yocto-bsp.*|&\n $poky_dir/$META_ROUTER \\\|g" $BBLAYERS_CONFIG
sed -i "s|meta-yocto-bsp.*|&\n $poky_dir/$DIR_RASPBERRYPI \\\|g" $BBLAYERS_CONFIG
sed -i "s|MACHINE ??=.*|MACHINE ??= \"$CONFIG_MACHINE\"|" $LOCAL_CONFIG
# тип бинарных пакетов для установки ПО
F="PACKAGE_CLASSES ?= \"package_rpm\""
R="PACKAGE_CLASSES ?= \"package_$TYPE_PACKAGE\""
sed -i "s|$F|$R|" $LOCAL_CONFIG
# разрешаем использовать коммерческую лицензию для возможности сборки
# некоторых библиотек, например libdav"
echo "LICENSE_FLAGS_WHITELIST = \"commercial\"" >> $LOCAL_CONFIG
После запуска установочного скрипта система сборки Poky будет располагаться каталогом выше, например если вы запустили установочный скрипт install.sh из каталога /home/user/router-bs, то система сборки Poky, будет установлена в каталог /home/user/poky-router
Примечание: название корневого каталога системы сборки задается в скрипте установки: SYSTEM_BUILD="poky-router"
Проект предназначен для самостоятельной сборки с "нуля" Linux дистрибутива для одноплатного компьютера "Raspberry PI" c минимальным набором программ, достаточным для использование Raspberry PI в качестве простого маршрутизатора.
Основная функция нашего "Маршрутизатора" - фильтрация внешнего (интернет) сетевого трафика приходящего на один сетевой интерфейс и передача его после фильтрации на другой сетевой интерфейс связанный с локальной сетью т.е. маршрутизатор выполняет функцию "Брандмауэра" для защиты внутренней сети. Также маршрутизатор будет обеспечивать подключение пользователей внутренней сети к ресурсам Интернет от имени своего ip адреса, т.е обеспечивать так называемую трансляцию сетевых адресов NAT (Network Address Translation).
Еще одной функцией "Маршрутизатора" будет возможность получения от него динамических ip адресов, т.е. любая новая машина (планшет, телефон, телевизор и т.д.) в локальной сети с помощью широковещательного запроса cможет получить ip адрес из выделенного диапазона адресов. Таким образом "Маршрутизатор" будет выполнять роль DHCP сервера.
Примечание: данный образ дистрибутива также можно собрать и для первых версий устройства, для этого нужно менять конфигурацию Poky => poky-router/build/conf/local.conf, где указать MACHINE ??= raspberrypi
чипсет AX88772A, CONFIG_USB_NET_AX8817X, используется модуль ядра "asix"
(пакет в yocto project => kernel-module-asix)
другие чипсеты: UA2-45-02WH и TP-LINK UE300 => CONFIG_USB_RTL8152, module r8152 Greenconnect USB2.0 AM/Ethernet RJ-45 => CONFIG_USB_NET_AX8817X, module asix
сетевые настройки на целевом устройстве храняться в файле /etc/network/interfaces, после переподключения карты памяти "microSDHC" будут доступны два раздела: Первый раздел => fat16 будет содержать ядро, загрузчик и драйверы для поддержки Raspberry Pi (dtb образы) Второй раздел => ext3 будет содержать корневую файловую систему, rootfs вот на этом разделе и необходимо отредактировать файл etc/network/interfaces Примечание: Редактировать файлы необходимо с правами администратора см. главу: Настройка сетевого интерфейса роутера
В большинстве вариантов для работы Роутера достаточно изменить только сетевые интерфейсы, учитывая что: eth0 - внешний сетевой интерфейс (Интернет), связанный с устройством размещенным на плате Raspberry Pi eth1 - внутренний сетевой интерфейс (локальная сеть), связанный с USB сетевой платой Правила Брандмауэра связаны с именами этих сетевых интерфейсов, и для типового использования подходят в большинстве случаев В случае если вам этого не достаточно, вам необходимо добавить свои правила см. главу: Фильтрация сетевых пакетов - функции Брандмауэра То же самое касается DHCP сервера, настройка по умолчанию вам подойдет только если вы оставите в качестве локальной сети адрес 10.0.8.1 для сетевого интерфейса eth1 см. главу: Настройка DHCP сервера на роутере
git clone https://github.com/berserktv/router-bs.git -b ver-0.7.1
cd router-bs chmod u+x install.sh ./install.sh
cd ../poky-router . ./oe-init-build-env bitbake router-bs-image
Время сборки образа дистрибутива достаточно длительное и может занимать от двух до N часов в зависимости от производительности компьютера, также в процессе сборки из "Интернета" должны быть загружены исходные коды всех программ входящих в дистрибутив, часто это полные git базы (т.е. время сборки также зависит от скорости подключения сети "Интернет") например на машине: Процессор - Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz ОЗУ - 8 Гбайт Жесткий диск - внешний USB-3.0 1Tбайт Время сборки - 2 часа 25 минут Размер образа - 176 Мбайт ПРИМЕЧАНИЕ: размер образа можно значительно уменьшить, более чем в три раза, если перейти на сжатую файловую систему squashfs, а диски перевести в режим только чтения но это совсем другая история ... Размер каталога poky-router/build после завершения сборки (cache сборки, исходный код всех программ входящих в образ, в разных форматах, в случае с git базой она загружается целиком со всей историей, промежуточные файлы сборки, обьектные файлы, файлы пакетов и т.п.) занимает примерно 26 ГБайт Из этих 26 Гбайт, размер каталога build/downloads (git базы приложений и tar.gz архивы) занимают 9.4 Гбайт
В образе Router-bs по умолчанию включена учетная запись:
root - пользователь
routerbs - пароль по умолчанию
ВНИМАНИЕ: обязательно смените пароль по умолчанию на собственный
Пароль можно сменить выполнив команду passwd на самом устройстве,
или
в случае самостоятельной сборки в файле рецепта
router-bs-image.bb
В том случае если вы не выполнили пункт 3) инструкции по использованию
не перенастроили проект под ваше сетевое окружение, а сразу включили Raspberry Pi,
вы можете подключиться к роутеру
по ip адресу по умолчанию: 192.168.0.1
Примечание: вам необходимо подключить сетевой кабель только к встроенному сетевому адаптеру (у нас eth0), второй сетевой кабель подключать не нужно (внешняя сетевая плата USB=>Ethernet) и тогда вы сможете подключиться к вашему устройству по сети выполнив команду: ssh root@192.168.0.1 (это связано с тем, что у нас по умолчанию запрещено подключаться по протоколу ssh через первый сетевой интерфейс - eth0, а при отсутствии корректного подключения второго сетевого интерфейса правила брандмауэра не будут загружены, и это можно будет сделать)
Cобранный образ после сборки будет располагаться по пути
poky-router/build/tmp/deploy/images/raspberrypi2
На последний успешно собранный образ всегда будет указывать
символическая ссылка:
router-bs-image-raspberrypi2.rpi-sdimg
т.е. poky-router/build/tmp/deploy/images/raspberrypi2/router-bs-image-raspberrypi2.rpi-sdimg,
cам файл будет содержать достаточно длинное имя c датой создания и временем в UTC
например такое:
router-bs-image-raspberrypi2-20161214115809.rootfs.rpi-sdimg
Для записи образа дистрибутива на карту памяти используется команда dd. Запуск команды dd выполняется от имени администратора, при этом необходимо указать входной файл и устройство подключения карты памяти "microSDHC", например /dev/sdX, где X может быть a,b,c и т.д. в зависимости от предыдущих подключенных дисковых разделов
Проще всего название определить по выводу команды blkid
наберите команду sudo blkid до подключения карты памяти - "microSDHC"
и далее =>
наберите команду sudo blkid после подключения карты памяти - "microSDHC"
и тот новый раздел который появился в выводе последней команды и будет искомым
Отмонтируйте разделы карты памяти - "microSDHC" например так, если разделов несколько
umount /dev/sdX1 umount /dev/sdX2
В команде dd указывается имя диска целиком т.е. без номера раздела так как в образе также содержится и основная загрузочная запись MBR и таблица(ы) разделов
Примечание:
текущем каталогом в примере указанном ниже является каталог poky-router/build
ВНИМАНИЕ: все предыдущие данные на карте памяти "microSDHC"
после выполнения операции записи будут удалены.
sudo bash cd tmp/deploy/images/raspberrypi2 dd if=router-bs-image-raspberrypi2.rpi-sdimg of=/dev/sdX bs=1M sync
После загрузки уже собранного дистрибутива (раздел Download) вы можете воспользоваться тем же набором команд что и выше, за исключением того, что:
1) Вам необходимо распаковать zip архив с дистрибутивом в какую нибудь временную папку
2) Перейти в этот временный каталог
3) Выполнить команду dd смотри главу Запись образа Router-bs на карту памяти
sudo bash dd if=router-bs-image-ver-0.7.1.rpi-sdimg of=/dev/sdX bs=1M
Примечание:
название файла образа (rpi-sdimg) может быть другим, в зависимости от версии
В Yocto Project каждая программная единица описывается с помощью рецепта сборки.
Язык описания рецепта напоминает "bash" c возможностью вставок частей кода на языке "python".
Основную информацию по синтаксису вы можете почерпнуть из
руководства Yocto Project
Набор рецептов сборки в зависимости от назначения можно объединять в отдельные слои сборки. В нашем случае все дополнительные рецепты которые расширяют функциональность базового дистрибутива Yocto, c минимальным количеством пакетов - "core-image-minimal" и привносят в него нужную нам функциональность "Роутера" будут храниться в слое "meta-router-bs".
Слой "meta-router-bs" прописывается в конфигурационном файле poky-router/build/conf/local.conf в момент установки Poky (система сборки в рамках Yocto Project), см. главу Установка Yocto Project этого документа (bash скрипт установки).
Для того, чтобы собрать дистрибутив для Raspberry PI в Yocto Project существует отдельный слой - meta-raspberrypi
Слой "meta-raspberrypi" хорошо работает прямо из коробки, это значит что нам пока без надобности знать особенности аппаратной работы и тонкости конфигурации Raspberry PI (все настройки можно оставить по умолчанию), т.е. нам достаточно подключить этот "BSP" слой в "Poky", и после сборки образа аппаратная поддержка raspberry pi будет включена в наш дистрибутив "router-bs".
Слой "meta-raspberrypi" прописывается при установке, см. главу Установка Yocto Project
В качестве дополнительного оборудования в нашем роутере используется только внешняя USB => Ethernet сетевая плата
Для корректной работы сетевой платы в Linux: нам потребуется две вещи:
1) Поддержка Linux ядром определенной сетевой платы
2) Наличие в системе модуля ядра для определенной сетевой платы
Возьмем к примеру дешевую сетевую плату Readyon RD-KY88772A, скорости подключения до 100 Мб/сек нам достаточно. Найдем чипсет на котором плата работает - это AX88772A разработка фирмы "ASIX".
Теперь найдем название параметра в конфигурации ядра отвечающую за драйвер чипсета AX88772A, лучше всего поискать сочетание слов "AX88772A cateee.net"
где "cateee.net" - удобный сайт с описанием конфигураций модулей ядра Linux Сразу находим название конфигурации ядра - CONFIG_USB_NET_AX8817X
и название нужного нам модуля ядра asix
Далее нам необходимо удостовериться, что в той версии ядра linux которое мы будем
собирать в рамках Yocto Project, нужная нам конфигурация поддерживается,
для этого мы можем в начале собрать ядро командой
"bitbake linux-raspberrypi"
см. инструкция по сборке дистрибутива
A затем посмотреть сгенерированный файл с текущей конфигурацией ядра:
poky-router/build/tmp/work/raspberrypi2-poky-linux-gnueabi/linux-raspberrypi/имя_версии/defconfig в нашем случае поддержка сетевой платы присутствует
CONFIG_USB_NET_AX8817X=m
таким образом мы убедились что для нашего оборудования поддержка работает из коробки.
Для включения в образ поддерживаемых модулей ядра указанных в defconfig,
в файле рецепта образа
router-bs-image.bb
мы указали пакет "kernel-modules", что добавляет все модули в наш образ,
конечно это увеличит размер образа ~ на 46 Mбайт, но позволит избавиться
от части проблем с оборудованием.
Альтернативным вариантом является явное указание названия модуля, у нас это "kernel-module-asix"
Примечание: можно сразу указать название нужного вам модуля в рецепте сборки образа router-bs-image.bb, даже не заглядывая в файл defconfig и тогда в случае его отсутствия вы сразу получите сообщение об ошибке на этапе сборки (команда: bitbake router-bs-image)
Настройки сети нашего роутера на конечном устройстве будет храниться в файле "/etc/network/interfaces" поэтому для замены исходного файла с настройками, необходимо включить в наш слой так называемое дополнение для рецепта, файл с расширением "bbappend", файл должен располагаться в нашем слое по такому же пути как и файл основного слоя
т.е. в Pokу рецепт храниться по пути:
poky-router/meta/recipes-core/init-ifupdown/init-ifupdown_1.0.bb
у нас файл с дополнением будет располагаться:
poky-router/meta-router-bs/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://interfaces-router"
do_configure_append() {
# заменяю скрипт /etc/network/interfaces
install -m 0644 ${WORKDIR}/interfaces-router ${WORKDIR}/interfaces
}
В нашем расширении рецепта init-ifupdown_1.0.bb мы указываем, что в секцию "do_configure", а именно в конец секции (на это указывает строка "_append") мы добавляем команду копирования нашего файла с конфигурацией роутера "interfaces-router" поверх существующего штатного файла "interfaces"
указание SRC_URI += "file://interfaces-router"
говорит рецепту о том что файл с указанным именем располагается по пути
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
(в начало списка FILESEXTRAPATHS добавляется путь с каталогом "files" текущего каталога)
Содержимого файла с конфигураций "files/interfaces-router"
Показать/Скрыть содержимое файл
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
# gateway xxx.xxx.xxx.xxx
# dns-* options are implemented by the resolvconf package, if installed
# ip address DNS servers - OpenDNS Family Shield
dns-nameservers 208.67.222.123 208.67.220.123
auto eth1
iface eth1 inet static
address 10.0.8.1
netmask 255.255.255.0
network 10.0.8.0
broadcast 10.0.8.255
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 208.67.222.123 208.67.220.123
Отредактируйте файл конфигурации files/interfaces-router, например так:
Для статического IP:
auto eth1
iface eth1 inet static
address 10.0.8.1
netmask 255.255.255.0
gateway xxx.xxx.xxx.xxx
dns-nameservers 208.67.222.123 208.67.220.123
Где:
iface eth1 inet static - указывает, что интерфейс находится в диапазоне адресов IPv4 (inet) со статическим ip (static);
address 10.0.8.1 - указывает что IP адрес нашей сетевой карты 10.0.8.1;
netmask 255.255.255.0 - указывает что наша маска подсети имеет значение 255.255.255.0;
gateway xxx.xxx.xxx.xxx- адрес шлюза по умолчанию;
dns-nameservers 208.67.222.123 208.67.220.123 - адреса DNS серверов
auto eth1 - указывает системе что интерфейс eth1 необходимо включать автоматически при загрузке системы
В указанном выше примере используются немаршрутизируемые адреса для локальной сети, и данный сетевой интерфейс eth1 будет считаться внутренним (закрытым из вне), для него адрес шлюза указывать не обязательно, так как априори для внутренней сети шлюзом будет сам наш роутер.
В качестве адресов DNS у нас указаны бесплатные общедоступные серверы OpenDNS, с фильтрацией "взрослого содержимого" т.е. по умолчанию у нас получается маршрутизатор для "Малышей"
Для работы устройства в качестве маршрутизатора, вам необходимо похожим образом настроить первый сетевой интерфейс eth0, который будет считаться внешним (открытым из Интернета)
Все параметры конфигурации в этом случае вы должны взять у своего "Интернет Провайдера" т.е. компании поставщика услуг на доступ в Интернет
Наш "Маршрутизатор" будет выполнять роль DHCP сервера (протокол динамической конфигурации узла)
Настройки DHCP сервера на конечном устройстве будет храниться в файле "/etc/dhcp/dhcpd.conf" поэтому для замены исходного файла с настройками, нам также необходимо включить в наш слой meta-router-bs дополнение для рецепта (bbappend)
в Pokу рецепт храниться по пути:
poky-router/meta/recipes-connectivity/dhcp/dhcp_4.3.3.bb
у нас файл с дополнением будет располагаться:
poky-router/meta-router-bs/recipes-connectivity/dhcp/dhcp_4.3.3.bbappend
# подменяю конфигурационные файлы и стартовые скрипты см. каталог files
# конфигурационный файл dhcpd.conf
# и файл с описанием сетевого интерфейса, на котором dhcp работает, файл default-server
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
Расширение рецепта сборки dhcp сервера будет минимальным и состоять из одной строчки.
В каталоге с рецептом bbappend будет располагаться каталог "files",
в который мы добавим два файла:
dhcpd.conf - собственная конфигурация DHCP сервера
default-server - файл конфигурации, который содержит имена сетевых интерфейсов
на которых DHCP сервер будет работать,в нашем случае это будет имя внутреннего сетевого интерфейса Роутера
INTERFACES="eth1"
Содержимое файла с конфигураций "dhcpd.conf"
Показать/Скрыть содержимое файл
#############################
# секция конфигурации
#############################
ddns-update-style interim;
default-lease-time 36000;
max-lease-time 72000;
subnet 10.0.8.0 netmask 255.255.255.0 {
range 10.0.8.14 10.0.8.100;
# ip address OpenDNS Family Shield
option domain-name-servers 208.67.222.123, 208.67.220.123;
option subnet-mask 255.255.255.0;
option routers 10.0.8.1;
}
Описание параметров настройки:
ddns-update-style - схема обновления DNS, возможны варианты: режим непосредственного обновления DNS (ad-hoc) и предварительный режим взаимодействия DHCP-DNS (interim).
в настоящий момент более стандартным механизмом является указание interim
default-lease-time - время по умолчанию в секундах на которое сервер выделяет ip адрес клиенту, пока действует lease-time сервер не может отдать данный ip-адрес другой машине.
Пока ip-адресов больше чем компьютеров в сети, допустим офисная сеть, где все машины стационарны то lease-time можно ставить побольше, тот же месяц. Тогда и вероятность, что машина получит при включении другой адрес будет минимальна.
А если адресов не так много, а компьютеры меняются часто, допустим кафе и wi-fi доступ, то lease-time нужно поменьше, например 1 час.
у нас в примере время lease-time равно 36000 сек. (10 часов)
max-lease-time максимальное время на которое выделяется ip адрес клиенту
у нас в примере время max-lease-time равно 72000 сек. (20 часов)
далее в блоке subnet указываем адрес нашей сети, сетевую маску, диапазон ip адресов которые будут использоваться, адрес(а) DNS серверов, которые по буквенному имени домена возвращают ip адрес (обычно назначается вашим провайдером), маска подсети и адрес шлюза.
Шлюз это компьютер, который подключен как минимум к двум разным подсетям, и который умеет передавать пакеты из одной под сети в другую.
В нашем случае шлюзом обязательно будет наш роутер, так как для этого мы его и устанавливаем
Итак мы указали основной минимальный набор параметров, которые необходимы для работы DNS сервера на нашем "Маршрутизаторе"
В linux фильтрация пакетов происходит на уровне ядра операционной системы в модуле "netfilter" и управляется утилитой iptables
так как правила настройки iptables крайне сложные и запутанный мы будем использовать, удобную утилиту, которая позволяет в простой пользовательской форме задать эти правила, без необходимости изучения "iptables"
Для настройки будет использована программа скрипт, программа Shorewall
Shorewall использует правила описания каждого из аспектов фильтрации в отдельном файле, и при запуске использует Perl для разбора файлов и генерации правил уже в формате "iptables"
Правила хождения пакетов в Shorewall используют абстракцию зон — все сети,
которые вы хотите обрабатывать, надо как-то обозвать.
Для начала следует определиться с названиями зон.
В нашем случае их будет 3:
fw - необходимая зона, содержащая сам файрволл,
net - провайдерская сеть,
loc - домашняя сетка с DHCP
Конфигурация получается примерно такой: файл zones,
путь на целевом устройстве /etc/shorewall/zones
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/zones
... fw firewall net ipv4 loc ipv4
После описание зон, необходимо распределить их между сетевыми интерфейсами, файл interfaces:
путь на целевом устройстве /etc/shorewall/interfaces
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/interfaces
... #ZONE INTERFACE BROADCAST OPTIONS net eth0 detect tcpflags,nosmurfs,routefilter,logmartians loc eth1 detect dhcp,tcpflags,nosmurfs,routefilter,logmartians
параметр "detect" говорит shorewall автоматически определить широковещательный адрес, его можно прописать и вручную, например так: 10.0.8.255 для внутреннего сетевого интерфейса с ip адресом 10.0.8.1, см. выше
Опция tcpflags - пакеты, поступающие на этот интерфейс проверяются на наличие определенных незаконных комбинаций TCP флагов.
Опция routeback - заставляет весь трафик, пришедший через интерфейс X, возвращаться к отправителю через него же (без этого практически не обойтись в ситуации, когда провайдеров несколько).
Опции nosmurfs,logmartians - разные по своему действию, но близкие по духу параметры, заставляющие Shorewall обращать внимание на пакеты, которых "точно не должно быть на этом интерфейсе". Так, пакеты с широковещательным адресом отправителя отклоняются (nosmurfs), "марсиане" (пакеты с некорректным исходным адресом) протоколируются (logmartians).
Опция routefilter предписывает включить в ядре фильтрацию по маршруту, но пользоваться им следует с осторожностью: в схеме с несколькими исходящими каналами возможны трудно диагностируемые неполадки.
Опция dhcp - сообщает, что на интерфейсе выполняется DHCP-клиент или сервер;
После разделения окружающего мира на зоны, обязательно нужно определить политики т.е. набор правил которые действуют для пакетов, самая правильная политика по умолчанию "все запрещено", а то что разрешено явно указывается в виде отдельных правил
необходимо определить политики для всех возможных направлений пробегания трафика. Лучше всего в конец дописать дефолтную политику, а чуть выше — исключения:
переменная FW является служебной и содержит имя зоны брандмауэра
путь на целевом устройстве /etc/shorewall/policy
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/policy
... #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST # разрешение трафика из зоны локальной сети во внешнюю loc net ACCEPT # запрещение трафика инициированное внешней сетью net all DROP info # отвергать все другие запросы на соединение # (Shorewall требует наличия такой политики, # применимой для всех остальных запросов). # строка обязательно должна быть последней в файле policy all all REJECT info
Для того, чтобы все компьютеры из локальной сети могли обращаться в интернет и получать ответ, нам необходимо настроить "Маскарадинг", это когда все запросы в интернет отправляются от имени нашего маршрутизатора, а когда приходит ответ, маршрутизатор автоматически понимает для какого компьютера в локальной сети он предназначается.
путь на целевом устройстве /etc/shorewall/masq
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/masq
... #INTERFACE SOURCE ADDRESS PROTO PORT(S) IPSEC MARK eth0 eth1
В колонке INTERFACE указывается интерфейс назначения т.е. внешний интерфейс подключенный к интернету,
в нашем случае это eth0. В поле SOURCE перечисляются адреса (исходящие адреса),
для которых нужно применить SNAT-преобразование: здесь, как и во многих
реальных случаях, это просто eth1, то есть вся локальная сеть целиком.
При желании, имя интерфейса можно заменить явным указанием "серых"
адресов (скажем, 192.168.0.0/24). Запретить SNAT для избранных узлов
сети можно при помощи следующего синтаксиса:
eth1:!192.168.0.1,192.168.0.3
кстати, он действует и во многих других
конфигурационных файлах Shorewall.
Для правильной настройки Shorewall используются определенные правила фильтрации, правила обычно описывают для каких протоколов и портов необходимо разрешить входящий (а иногда исходящий) трафик
путь на целевом устройстве /etc/shorewall/rules
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/rules
... #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK SECTION NEW # запрещать некорректные пакеты из внешней сети Invalid(DROP) net all # Разрешать соединения по протоколу DNS от роутера во внешнюю сеть # иначе вы не сможете определить ip адрес узла по имени сайта DNS(ACCEPT) $FW net # Разрешать соединение с роутером по протоколу SSH # из локальной сети для администрирования SSH(ACCEPT) loc $FW # Разрешить работу утилиты ping # из локальной сети до роутера Ping(ACCEPT) loc $FW # Запретить возможность ping(ования) из внешней сети Ping(DROP) net $FW # разрешить передачу пакетов icmp от роутера # и в локальную и во внешнюю сеть ACCEPT $FW loc icmp ACCEPT $FW net icmp
В начале указывается действие (РАЗРЕШЕНИЕ/ЗАПРЕЩЕНИЕ), далее исходящий интерфейс, далее сетевой интерфейс назначения, далее протокол и после этого возможно явно указать номер(а) портов, для которых предназначено данное действие
Так же по причине безопасности роутера, не рекомендуем вам оставлять возможность удаленного администрирования
роутера из Интернета, пример правила:
"SSH(ACCEPT) net $FW"
в этом случае как минимум необходимо подобрать сложный пароль администратора (root), а также не использовать порт 22 по
умолчанию, так как в любой открытой сети всегда приходят пакеты по протоколу ssh с попыткой автоматического подбора пароля.
Такой перебор выполняется специальными программами сканерами в автоматическом режиме, и в 95% случаев достаточно изменить номер стандартного порта, что бы случайным образом не оказаться взломанным
Настоятельно не рекомендуем заниматься перенастройкой Shorewall подключившись извне, как как при задании неверных правил и последующей перезагрузкой Shorewall, можно добиться блокирования собственного доступа
Когда файервол останавливается, маршрутизация разрешается на те хосты, которые указаны в файле routestopped
путь на целевом устройстве /etc/shorewall/routestopped
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/routestopped
... #INTERFACE HOST(S) OPTIONS eth1 -
В данном случае мы указываем что после остановки Shorewall разрешена маршрутизация на любые адреса ("-" значит "0.0.0.0/0") c внутреннего сетевого интерфейса
примечание: если вы хотите полностью очистить правила внесенные Shorewall в "netfilter", вы должны выполнить команду «shorewall clear»
Основной конфигурационный файл расположен:
путь на целевом устройстве /etc/shorewall/shorewall.conf
путь в Poky poky-router/meta-router-bs/recipes-connectivity/shorewall/files/shorewall.conf
STARTUP_ENABLED=Yes — пусть запускается VERBOSITY=1 — многословность в консоли LOG_LEVEL — когда все заработает как надо, поставьте в none, чтобы не засоряло dmesg LOG_MARTIANS — так же IP_FORWARDING=On — используется для маскарадинга CLAMPMSS=Yes — лучше включить, если у аплинка MTU меньше, чем у какой-нибудь из машин в домашней сетке.
На самом деле файл содержит много конфигурационных параметров и его необходимо взять из примера конфигурации входящей в пакет Shorewall и подкорректировать
пример конфигурационного файла на целевом устройстве /usr/share/shorewall/configfiles/shorewall.conf
в пакет поставки Shorewall входят хорошие, достаточно универсальные примеры для настройки его конфигурации:
однопортовой /usr/share/doc/shorewall/examples/one-interface двухпортовой /usr/share/doc/shorewall/examples/two-interfaces трехпортовой /usr/share/doc/shorewall/examples/three-interfaces и универсальной /usr/share/doc/shorewall/examples/Universal
Примечание: путь к конфигурациям указан на целевом устройстве
Для того, чтобы собрать пакет Shorewall в нашем дистрибутиве, мы возьмем его рецепт сборки из проекта "OpenEmbedded"
OpenEmbedded — инфраструктура для сборки пакетов для встраиваемого Linux. OpenEmbedded предлагает решение в классе сред для кросс-компиляции. Он позволяет разработчикам создавать целостные дистрибутивы Linux для встраиваемых систем.
исходный рецепт можно взять вот отсюда,
http://git.openembedded.org/openembedded/plain/recipes/shorewall/shorewall_4.4.14.bb
И в дальнейшем модифицируем его, обновив до последней стабильной ревизии в версии 4.4, у нас это 4.4.27
добавим рецепт shorewall_4.4.27.bb в наш слой сборки "meta-router-bs"
предварительно немного модифицировав его, дописав в секцию установки (do_install_append) замену конфигурационных файлов по умолчанию,
файлами, описанными выше:
zones, interfaces, policy, masq, rules, routestopped и shorewall.conf
LICENSE = "GPL"
LIC_F = "file://${COREBASE}/meta/files/common-licenses/GPL-1.0"
SUM_F = "md5=e9e36a9de734199567a4d769498f743d"
LIC_FILES_CHKSUM = "${LIC_F};${SUM_F}"
SUB_PR = ".3"
require shorewall.inc
# this version (4.4) requires some deps (perl)
require shorewall-deps.inc
# запуск стартового скрипта /etc/init.d/shorewall на определенном уровне исполнения
# последовательность запуска, перед сервисом ssh и dhcp
inherit update-rc.d
INITSCRIPT_NAME = "shorewall"
INITSCRIPT_PARAMS = "start 08 2 3 4 5 . stop 92 0 6 1 ."
PR = "${INC_PR}.0"
SRC_URI = "\
http://www.shorewall.net/pub/shorewall/4.4/shorewall-${PV}/${PN}-${PV}${SUB_PR}.tar.bz2 \
file://zones \
file://interfaces \
file://policy \
file://masq \
file://rules \
file://shorewall.conf \
"
# отключаю секцию do_compile, так как /sbin/shorewall является исполняемым скриптом
# и не требует компиляции
do_compile[noexec] = "1"
SRC_URI[md5sum] = "9f0ef6b547526aa33e34941a211ca602"
SRC_URI[sha256sum] = "1f95a04af2cbdd3449aa6fb26ea1b001e7cccd1ad4ed6d7ed8648247ae5d09bb"
do_install_append () {
install -m 0644 ${WORKDIR}/zones ${D}${sysconfdir}/shorewall/zones
install -m 0644 ${WORKDIR}/interfaces ${D}${sysconfdir}/shorewall/interfaces
install -m 0644 ${WORKDIR}/policy ${D}${sysconfdir}/shorewall/policy
install -m 0644 ${WORKDIR}/masq ${D}${sysconfdir}/shorewall/masq
install -m 0644 ${WORKDIR}/rules ${D}${sysconfdir}/shorewall/rules
install -m 0644 ${WORKDIR}/shorewall.conf ${D}${sysconfdir}/shorewall/shorewall.conf
}
DESCRIPTION = "Shorewall is a high-level tool for configuring Netfilter."
HOMEPAGE = "http://www.shorewall.net/"
LICENSE = "GPLv2"
SECTION = "network"
PRIORITY = "optional"
INC_PR = "r0"
S = "${WORKDIR}/${PN}-${PV}"
RDEPENDS_${PN} += "iptables"
RRECOMMENDS_${PN} = "kernel-module-ip-tables \
kernel-module-ip-conntrack \
kernel-module-ipt-conntrack \
kernel-module-ipt-multiport \
kernel-module-ipt-log \
kernel-module-ipt-mac \
kernel-module-ipt-mark \
kernel-module-ipt-masquerade \
kernel-module-ipt-pkttype \
kernel-module-ipt-reject \
kernel-module-ipt-state \
kernel-module-ipt-tos \
kernel-module-iptable-filter \
kernel-module-iptable-mangle \
kernel-module-iptable-nat \
"
do_install() {
export PREFIX=${D}
${WORKDIR}/${PN}-${PV}${SUB_PR}/install.sh
}
FILES_${PN} += "/usr/share/shorewall/*"
# version 4.4.x requires perl + some perl modules
RDEPENDS_${PN} += "\
perl \
perl-module-lib \
perl-module-autouse \
perl-module-cwd \
perl-module-file-basename \
perl-module-file-temp \
perl-module-getopt-long \
perl-module-carp \
perl-module-findbin \
perl-module-file-spec-unix \
perl-module-scalar-util \
perl-module-io \
perl-module-io-handle \
perl-module-exporter-heavy \
perl-module-list-util \
perl-module-socket \
perl-module-overloading \
"
Для того, чтобы в Yocto Project собрать минималистический дистрибутив "router-bs" нам необходимо добавить файл рецепта router-bs-image.bb в слой "meta-router-bs"
poky-router/meta-router-bs/recipes-router-bs/images/router-bs-image.bbФайл следующего содержимого:
Показать/Скрыть
# Минималистический дистрибутив Linux, выполняющий функции "Маршрутизатора"
# для платформы Raspberry PI собранный в "Yocto Project",
# autor Alexander Demachev, site berserk.tv
DESCRIPTION = "The Router BS - is a simple image to Raspberry PI platform"
LICENSE = "MIT"
MD5_LIC = "md5=4d92cd373abda3937c2bc47fbc49d690"
MD5_MIT = "md5=3da9cfbcb788c80a0384361b4de20420"
LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_LIC} \
file://${COREBASE}/meta/COPYING.MIT;${MD5_MIT}"
# добавление нескольких стандартных пакетов в базовый образ
IMAGE_FEATURES += "ssh-server-openssh splash"
# Образ базируется на рецепте сборки содержащем минимальный набор пакетов
# Base this image on core-image-minimal
include recipes-core/images/core-image-minimal.bb
# Установка пароля по умолчанию для пользователя "root"
# - основная административная учетная запись в системе
# Set default password for 'root' user
inherit extrausers
ROOTUSERNAME = "root"
ROOTPASSWORD = "routerbs"
EXTRA_USERS_PARAMS = "usermod -P ${ROOTPASSWORD} ${ROOTUSERNAME};"
# стартовая заставка, которая выводиться во время загрузки,
# в случае подключения кабеля HDMI к монитору или к телевизору
SPLASH = "psplash-raspberrypi"
# увеличиваю количество виртуальных консолей до 3
SYSVINIT_ENABLED_GETTYS = "1 2 3"
###########################################################################
# набор установочных пакетов входящих в образ, разбитый на категории
###########################################################################
# отладочные пакеты
# ROUTER_DEBUG_TOOLS = "ldd strace ltrace"
# пакеты библиотеки libc входящие в образ, локализация,
# символьные таблицы для различных языков и т.п.
ROUTER_GLIBC = " \
glibc-thread-db \
glibc-gconv-utf-16 \
glibc-gconv-utf-32 \
glibc-gconv-koi8-r \
glibc-gconv-cp1251 \
glibc-gconv-ibm866 \
glibc-binary-localedata-en-us \
glibc-binary-localedata-ru-ru \
glibc-binary-localedata-ru-ru.koi8-r \
glibc-charmap-cp1251 \
glibc-charmap-koi8-r \
glibc-charmap-utf-8 \
"
# базовые пакеты
ROUTER_BASE = " \
kernel-modules \
lsb \
pciutils \
"
# сетевые пакеты и модули ядра
ROUTER_NET = "kernel-module-asix \
"
# приложения входящие в образ
ROUTER_SOFT = " \
mc \
resolvconf \
dhcp-server \
init-ifupdown \
shorewall \
shorewall-doc \
"
# указание всех дополнительных пакетов дистрибутива "Router-bs"
# Include modules in rootfs
IMAGE_INSTALL += " \
${ROUTER_BASE} \
${ROUTER_GLIBC} \
${ROUTER_NET} \
${ROUTER_SOFT} \
"
# ${ROUTER_DEBUG_TOOLS} \
#
Вы можете загрузить следующие версии образа дистрибутива:
версия - ver-0.7.1 архитектура - Arm плата - Raspberry Pi «2B» (плата SoC Broadcom BCM2836, процессор Cortex-A7) флаги сборки - "arm armv7ve vfp thumb neon vfpv4 callconvention-hard cortex" дата - от 25.12.2016 MD5 - 6b8eaeebef50b185043f2acdef3bd66d (контрольная сумма MD5 zip архива) размер архива 43 Мбайт имя файла - router-bs-image-ver-0.7.1.rpi-sdimg.zip
версия - ver-0.7.1 aрхитектура - Arm плата - Raspberry Pi (ранние версии устройства) (процессор ARM1176JZ-F) флаги сборки - "arm armv6 vfp arm1176jzfs callconvention-hard" дата - от 27.12.2016 MD5 - 278dfeb77f389ae5229f3936cf48db12 (контрольная сумма MD5 zip архива) размер архива 43 Мбайт имя файла - router-bs-image-arm1176jzfs-ver-0.7.1.rpi-sdimg.zip