Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на Freebsd 10 для доступа в интернет из локалки. Это простой, популярный и востребованный функционал сервера, который можно расширять дополнительными возможностями.
Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:
# uname -v FreeBSD 10.2-RELEASE-p8 #0 r292756M: Sat Dec 26 22:49:34 MSK 2015 root@freebsd:/usr/obj/usr/src/sys/GENERIC
На сервере установлены 2 сетевые карты:
- hn0 — внешний интерфейс, получает интернет от провайдера, настройки по dhcp
- hn1 — локальная сеть, адрес 10.20.30.1, установлен вручную
В нашу задачу по настройке программного freebsd роутера будет входить настройка маршрутизации на сервере, установка и настройка ipfw, включение nat, настройка локального dhcp и dns сервера.
Подготовка сервера к настройке шлюза
Информацию о выданных leases dhcp сервера dnsmasq можно посмотреть в файле /var/db/dnsmasq.leases .
Анализ сетевой активности в freebsd с помощью iftop
Иногда хочется посмотреть, что происходит на роутере и кто использует интернет в данный момент. По-умолчанию, в системе нет готового средства для получения этой информации. На помощь нам придет простая программа iftop, которая позволяет в режиме реального времени посмотреть активность на сетевом интерфейсе.
Устанавливаем iftop на настроенный Freebsd шлюз:
# pkg install iftop
Запускаем iftop с указанием интерфейса и отображением используемых портов:
# iftop -i hn1 -P
Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.
Я для примера на одном из компьютеров запустил генератор трафика интернета. Он занял почти весь канал и это стало отлично видно на роутере с помощью iftop. Конечно, эта простая утилита не решает всех вопросов по мониторингу сетевой активности, но для представления текущей картины подходит, если вам не нужно что-то большее.
Заключение
Подведем итог того, что сделали. За короткое время настроили полноценный шлюз (по сути программный роутер) на базе Freebsd 10 для обеспечения выхода в интернет клиентов за сервером. При этом обеспечили автоматическое получение настроек. Даже на скромном виртуальном сервере такой шлюз способен переварить достаточно большой траффик.
Вся настройка занимает буквально 10-15 минут. Основное время уходит на сборку ядра. Чем выше версия Freebsd, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.
Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:
- Подготовили сервер к настройке шлюза.
- Пересобрали ядро с необходимыми параметрами.
- Настроили ipfw и nat, включили маршрутизацию.
- Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
- Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.
Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.
В статье описано как компилировать ядро FreeBSD. При правильной конфигурации размер ядра может намного уменьшиться.
Для того, чтобы скомпилировать свое ядро необходимо установить исходники ядра (src- Source for everything but encryption). Если они уже установлены то заходим в каталог /usr/src/sys (FreeBSD kernel).Если же у вас не установлены исходники ядра, установить их можно через sysinstall. Считаем, что исходники ядра вы установили.
Под пользователем root идем в папку /usr/src/sys/i386/conf.
# cd /usr/src/sys/i386/conf
Копируем файл GENERIC, например в mykernel. Полученный файл и будем править.
Если у вас машина Pentium4, то советую сразу закоментировать строки:
Цитата |
cpu I386_CPU cpu I486_CPU cpu I586_CPU |
пусть наша машина будет настроена на определенный процессор и не распыляется на всякую фигню;)
Можно отключить не используемые устройства, что уменьшит размер ядра и соответсвенно нагрузку на процессор. Посмотреть какие у вас устройства можно коамандой dmesg, после загрузки компьютера.
Так же можно добавить устройства, которые по умолчанию не поддерживаются в ядре. Более подробно устройства описаны в файл LINT для FreeBSD ветки 4.х, и в файле NOTES для FreeBSD ветки 5.х.
После того как мы отредактировали наш файл, можно приступить к его компиляции.
Нам надо будет выполнить следующие команды:
Если все прошло удачно, то все что нам надо это перезагрузиться.
P.S. Советую перед эксперементами сохранить нормальное ядро, например под именем kernel.good и тогда если не загрузилось наше новое ядро, мы вместо kernel.old указажем boot kernel.good. Это предлагаю сделать, потмоу что при новом собирании ядра наш kernel.old перезапишется например не рабочим ядром и мы вообще не сможем загрузиться.
P.P.S. Сохранение хорошего рабочего ядра:
Для FreeBSD 4.x - команда cp /kernel /kernel.good
Для FreeBSD 5.x - команда cp -R /boot/kernel /boot/kernel.good
Второй способ обновления ядра:
Перейдите в каталог /usr/src.
Соберите ядро.
# make buildkernel KERNCONF=MYKERNEL
Установите новое ядро.
# make installkernel KERNCONF=MYKERNEL
Замечание: Этот способ построения требует наличия всех исходных файлов систем. Если вы только установили исходные файлы ядра, то используйте традиционный способ, как описано выше.
MYKERNEL - конфигурационный файл вашего ядра, который для i386 находится в папке /usr/src/sys/i386/conf. Если не указывать параметр KERNCONF, то соберется ядро GENERIC.
В статье описано как компилировать ядро FreeBSD. При правильной конфигурации размер ядра может намного уменьшиться.
Для того, чтобы вы могли скомпилировать свое ядро вам надо было с диска установить
src — Source for everything but encryption
и потом выбрать
sys — /usr/src/sys (FreeBSD kernel)
.
Доставить можно через /stand/sysinstall.
Считаем, что исходники ядра вы установили.
Под пользователем root идем в папку /usr/src/sys/i386/conf.
Копируем файл GENERIC, например в mykernel. Полученный файл и будем править.
Если у вас машина Pentium4, то советую сразу закоментировать строки:
cpu I386_CPU
cpu I486_CPU
cpu I586_CPU
пусть наша машина будет настроена на определенный процессор и не распыляется на всякую фигню 😉
Можно отключить не используемы устройства, что уменьшит размер ядра и соответсвенно нагрузку на процессор. Посмотреть какие у вас устройства можно коамандой dmesg, после загрузки компьютера.
Так же можно добавить устройства, которые по умолчанию не поддерживаются в ядре. Более подробно устройства описаны в файл LINT для FreeBSD ветки 4.х, и в файле NOTES для FreeBSD ветки 5.х.
После того как мы отредактировали наш файл, можно приступить к его компиляции.
Нам надо будет выполнить следующие команды:
config mykernel - конфигурим ядро
cd ../../compile/mykernel
make depend
make
make install - устанавливаем ядро
Если все прошло удачно, то все что нам надо это перезагрузиться.
P.S. Советую перед эксперементами сохранить нормальное ядро, например под именем kernel.good и тогда если не загрузилось наше новое ядро, мы вместо kernel.old указажем boot kernel.good. Это предлагаю сделать, потмоу что при новом собирании ядра наш kernel.old перезапишется например не рабочим ядром и мы вообще не сможем загрузиться.
P.P.S. Сохранение хорошего рабочего ядра:
Для FreeBSD 4.x — команда cp /kernel /kernel.good
Для FreeBSD 5.x — команда cp -R /boot/kernel /boot/kernel.good
Второй способ обновления ядра:
Перейдите в каталог /usr/src.
# cd /usr/src
Соберите ядро.
# make buildkernel KERNCONF=MYKERNEL
Установите новое ядро.
# make installkernel KERNCONF=MYKERNEL
Замечание: Этот способ построения требует наличия всех исходных файлов систем. Если вы только установили исходные файлы ядра, то используйте традиционный способ, как описано выше.
MYKERNEL — конфигурационный файл вашего ядра, который для i386 находится в папке /usr/src/sys/i386/conf. Если не указывать параметр KERNCONF, то соберется ядро GENERIC.
Сегодня мы научимся собирать ядро и мир (основные исполняемые файлы, библиотеки и тд) FreeBSD из сходных кодов. Ранее в заметке PostgreSQL: сборка из исходников и настройка под Linux мы выясняли, зачем нужно уметь собирать что-то из исходников. Основными сценариями являются оптимизация под конкретное железо и получение самого свежака прямо из ветки master. Кроме того, вы можете настроить ядро под свои конкретные нужды — выбрать шедулер, отключить IPv6, убрать поддержку лишнего железа и тд. Наконец, если вдруг вы планируете когла-нибудь стать коммитером в ядро FreeBSD, знания о том, как это ядро собирается, будут не лишними.
Дисклеймер: Многое из написанного ниже может потерять актуальность к моменту, когда вы будете это читать. Прежде, чем действовать по приведенной инструкции, не лишним будет сначала свериться с хэндбуком . Заметьте также, что ниже речь идет исключительно про сборку ядра и мира из исходников , а процедура бинарного обновления системы описана в заметке Памятка по обновлению ядра и мира FreeBSD .
Подготовка окружения
При написании заметки я использовал следующий установочный диск:
FreeBSD-10.2-RELEASE-amd64-disc1.iso
Лишней железки под рукой у меня не было, поэтому все эксперименты ставились на VirtualBox. Был выбран VirtualBox, а не Vagrant , так как нам понадобится доступ к монитору системы. В VirtualBox в настройках сети было создана два адаптера — один NAT и один Host Only. Первый нужен для доступа гостевой системы в интернет. Второй позволит ходить в гостевую систему с хост-системы по SSH.
После установки системы ставим пакеты git-lite, vim-lite, tree, bash, sudo, правим /usr/local/etc/sudoers, затем меняем оболочку пользователя:
sudo chsh -s / usr/ local/ bin/ bash eax
В ~/.gitconfig дописываем:
pager = less -S
Мне лично еще очень нравится иметь в системе привычный htop:
cd
/
usr/
posts
sudo
portsnap fetch extract
cd
sysutils/
htop
sudo
make
-DBATCH
install
clean
Подробности про первоначальную настройку системы и управление пакетами во FreeBSD вы найдете в заметках Использование FreeBSD на десктопе, версия 2.0 и Управление пакетами во FreeBSD при помощи утилиты pkg соответственно.
Собираем ядро
То, как будет собираться ядро FreeBSD, контролируется несколькими файлами конфигурации.
Часть настроек лежит в /etc/make.conf. Этот файл влияет на сборку портов, мира, ядра FreeBSD, и вообще любых программ на C. Здесь можно указать CPU, под который производится сборка, флаги оптимизации, и так далее. Перечень всех доступных опций можно подглядеть в /usr/share/examples/etc/make.conf и man make.conf . Пример /etc/make.conf:
# используем Clang 3.7 вместо идущего по дэфолту 3.4
CC=/usr/local/bin/clang37
CXX=/usr/local/bin/clang++37
CPP=/usr/local/bin/clang-cpp37
# оптимизируем код под используемый на машине CPU
CPUTYPE?=native
# флаги при компиляции кода на C и C++
CFLAGS+=-O2 -pipe
CXXFLAGS+=-O2 -pipe
Еще есть /etc/src.conf, который имеет немного другие настройки и затрагивает только ядро и мир. Подробности смотри в man src.conf . Пример /etc/src.conf:
CPUTYPE?=native
CFLAGS+=-O2 -pipe
COPTFLAGS+=-O2 -pipe
Наконец, также существует и файл конфигурации самого ядра. Про него будет рассказано далее.
Если при установке FreeBSD вы поставили галочку «установить все исходники», то исходники ядра и мира будут находится в каталоге /usr/src. Информацию о том, что в каком подкаталоге находится, можно найти в Developer’s Handbook и файле README .
# вместо head укажите интересующую вас ветку или тэг
cd
/
usr/
src &&
sudo
svn co
http://
svn.freebsd.org/
base/
head/
./
Настройки, с которыми собирается ядро, лежат в файле:
/usr/src/sys/(архитектура)/conf/(конфиг)
Название архитектуры зависит от вашего CPU. Как правило, это либо i386, либо amd64. Конфиг ядра, идущего в системе по умолчанию, называется GENERIC. Можно скопировать его и назвать, например, MYKERNEL.
cd
sys/
amd64/
conf
sudo
cp
GENERIC MYKERNEL
Конфиг хорошо документирован. К примеру, можно отключить поддержку IPv6 и IPSec, закомментировав две строчки:
#options INET6
#options IPSEC
Важно! В CURRENT по умолчанию включен механизм witness , предназначенный для поиска дэдлоков . Имейте в виду, что он может выводить в консоль пугающие стэктрейсы , некоторые из которых являются багами и должны быть зарепорчены в рассылку freebsd-current@, а некоторые являются вполне безобидными. Также сообщается, что механизм этот довольно тормозной, и потому вам вполне может захотеться его отключить.
Собираем ядро с нашими настройками:
cd
../
../
..
sudo
make
-j4
buildkernel KERNCONF
=MYKERNEL
Перед установкой ядра делаем резервную копию текущего:
sudo cp -r / boot/ kernel/ / boot/ kernel.good
При установке нового ядра резервная копия создается автоматически, но эта копия будет затерта при следующей установке. После создания резервной копии вручную у нас под рукой всегда будет 100% рабочий GENERIC, с которого можно будет загрузиться в случае возникновения проблем.
Устанавливаем новое ядро:
sudo make installkernel KERNCONF =MYKERNEL
После установки ядро окажется в каталоге /boot/kernel, а резервная копия текущего ядра будет лежать в /boot/kernel.old.
Вместо пары шагов buildkernel и installkernel также можно было использовать команды:
sudo
make
-j4
kernel KERNCONF
=MYKERNEL INSTKERNNAME
=kernel.test
sudo
nextboot -k
kernel.test
Этим мы бы сказали положить ядро в /boot/kernel.test и использовать его один раз при следующей закрузке. Если все пройдет хорошо, после перезагрузки /boot/kernel.test можно будет переименовать в /boot/kernel. Этот вариант может быть удобнее, если к машине нет физического доступа.
Перезагружаемся:
sudo reboot
После загрузки системы проверяем версию ядра:
uname -a
Должны увидеть что-то вроде
FreeBSD vbox 11.0-CURRENT FreeBSD 11.0-CURRENT #0 6a8922d(master): Tue
Feb 28 13:40:05 MSK 2016 root@vbox:/usr/obj/usr/src/sys/MYKERNEL amd64
Если что-то пошло не так, при загрузке системы в меню можно выбрать загрузку с kernel.old (нажатием цифры 5). Также можно выбрать «Escape to a loader prompt» (нажатием цифры 3) и выбрать вообще любое ядро, например:
boot kernel.good
Таким образом, даже если мы вдруг запорим ядро, есть запасной парашют.
Собираем мир
Мир от FreeBSD 10 почти наверняка будет не лучшим образом работать с ядром FreeBSD 11. Поэтому не лишено смысла вместе с пересборкой ядра системы обновить сразу и мир.
Важно! Компиляция мира может занять очень много времени, особенно если в VirtualBox вы дали виртуалке только одно ядро. Если вы используете реальную машину, вам потребуется физический доступ к ней. Также от вас потребуется вручную смержить множество конфигов, подтвердить удаление множества файлов, а потом (!) переустановить все установленные пакеты и пересобрать все установленные порты. Возможно, вместо сборки нового мира, вам будет проще временно вывести машину из эксплуатации, поставить на нее новую систему, и настроить поверх все необходимое. Или воспользоваться уже упомянутым механизмом бинарного обновления. Как мне кажется, пересборка мира — процедура больше для разработчиков FreeBSD, чем администраторов боевых серверов.
Итак, переходим в каталог с исходниками:
cd / usr/ src
Чистим временные файлы, которые могли остаться с предыдущей сборки:
sudo rm -rf / usr/ obj
Собираем мир:
sudo make -j4 buildworld
Чтобы минимизировать риски, связанные с обновлением уже запущенных и работающих приложений, рекомендуется перевести ОС в однопользовательский режим:
# в окне VirtualBox или стоя рядом с сервером
sudo
shutdown
now
Теперь монтируем файловую систему (у меня ZFS):
zfs set
readonly
=off zroot
zfs mount
-a
Если вы используете UFS, тогда.