Конечно же речь пойдет не о приготовлении всем известного японского деликатеса. А пойдет она о настройке нескольких сервисов, которые я определил для
себя как необходимые, на домашнем сервере. В качестве операционной системы которого будет выступать OpenBSD.
Многие воскликнут, а зачем тебе эта малоизвестная ОС, ведь есть же Linux, FreeBSD. Да, действительно, я мог бы настроить все необходимое и на других
unix like, но это бы не принесло мне столько удовольствия, сколько я испытал изучая и настраивая OpenBSD. Да и потом, меня всегда привлекают сложные
и нестандартные решения.
Закончим с вступлением и вернемся к теме заголовка.
Спешу представить тебе меню, уважаемый читатель.
Сегодня в меню:
1. Первоначальная настройка.
2. DNS (перенаправление запросов провайдеру).
3. Soft RAID 1 (архив семейных фото, музыки, видео путешествий и прочая важная информация).
4. rtorrent + rutorrent (торренты разные нужны, торренты разные важны).
5. NFS server (сетевая папка для доступа с компьютеров LAN).
6. VPN тоннель с работой. FreeBSD(mpd5) OpenBSD (ppp) (люблю, знаете ли, порой работать из дома).
7. NUT + UPS Ippon Back power pro 400 (неожиданное отключение электричества нам не страшно).
8. Firewall (замечательный пакетный фильтр PF).
И так, приступим.
1. Первоначальная настройка.
Я буду описывать настройку исходя из того, что система уже установлена.
Остановлюсь лишь на настройке сетевых интерфейсов. В моей системе их два: re0, rl0.
# cat /etc/hostname.re0 inet 192.168.254.1 255.255.255.0 inet alias 192.168.254.10 255.255.255.255 #зачем мне алиас будет понятно позже # cat /etc/hostname.rl0 inet 10.110.1.103 255.255.255.224
Для установки программного обеспечения я использую как пакеты так и порты, поэтому первым делом скачаем дерево портов
# cd /tmp # ftp http://ftp://ftp.openbsd.org/pub/OpenBSD/4.7/ports.tar.gz # cd /usr # tar -zxvf /tmp/ports.tar.gz
Для того чтобы иметь возможность обновлять дерево портов, установим cvsup:
# cd /usr/ports # make search key=cvsup Port: cvsup-16.1hp2-no_x11 Path: net/cvsup,-main,no_x11 Info: network file distribution system Maint: The OpenBSD ports mailing-list <ports@openbsd.org> Index: net devel L-deps: B-deps: :lang/ezm3 R-deps: Archs: i386 # cd net/cvsup # make show=FLAVORS no_x11 # env FLAVOR="no_x11" make install
очистим рабочие директории портов
# make clean # make clean=depends
Дабы не откладывать в долгий ящик, сразу же настроим конфиг cvsup для обновления портов
#cat /etc/cvsup-file-ports *default release=cvs *default delete use-rel-suffix *default umask=002 *default host=obsd.cec.mtu.edu *default base=/usr *default prefix=/usr *default tag=OPENBSD_4_7 OpenBSD-ports
Списки доступных анонимных cvs серверов можно посмотреть Здесь
для обновления достаточно воспользоваться командой
# cvsup -g -L 2 /etc/cvsup-file-ports
На этом с портами, пока, закончим.
Перейдем к пакетам, на этом шаге я установлю все то по, которое мне необходимо из пакетов
#export PKG_PATH=http://ftp.gamma.ru/pub/OpenBSD/`uname -r`/packages/`machine -a`/ #pkg_add libxml mod_scgi nut p5-XML-Parser php5-core php5-extensions\ php5-xmlrpc pptp screen xmlrpc-c bash
*вполне может статься, что список неполный, так как настроен сервер достаточно давно, что-то я мог упустить
2. DNS (перенаправление запросов провайдеру).
Внесем изменения в /etc/rc.conf.local для запуска named
named_flags="" named_user=named named_chroot=/var/named
Для форвардинга запросов провайдерским DNS, достаточно внести в
/var/named/etc/named.conf (в options)
следующие строки
forwarders { 10.5.0.2;};
а /etc/resolv.conf будет содержать
namesrver 127.0.0.1
3. Soft RAID 1 (архив семейных фото, музыки, видео путешествий и прочая важная информация).
Для организации soft raid'а в OpenBSD выполним следующие.
(Массив будет собран из двух HDD Western Digital по 500Гб )
# dmesg |grep WD wd2 at pciide0 channel 1 drive 0: WDC WD5000AAKS-00UU3A0 wd3 at pciide0 channel 1 drive 1: WDC WD5000AAKS-00UU3A0
Далее все строго по man softraid, инициализируем диски(перезапишем MBR bootcode и MBR partition table)
# fdisk -iy wd2 # fdisk -iy wd3
создаем RAID партиции на дисках
# printf "a\n\n\n\nRAID\nw\nq\n\n" | disklabel -E wd2 # printf "a\n\n\n\nRAID\nw\nq\n\n" | disklabel -E wd3
собираем массив
# bioctl -c 1 -l /dev/wd2a,/dev/wd3a softraid0
хорошим тоном считается очистка начала/заглавия диска перед его использованием
# dd if=/dev/zero of=/dev/rsd0c bs=1m count=1
инициализируем и форматируем массив
# fdisk -iy sd0 # printf "a\n\n\n\n4.2BSD\nw\nq\n\n" | disklabel -E sd0 # newfs /dev/rsd0a
Внимательный читатель заметит, что при очистке начала вновь созданного массива я использовал имя rsd0, тогда как при создании раздела на диске указал
sd0. Для понимания отличий обратимся к замечательной книге Absolute OpenBSD: UNIX for the Practical Paranoid Майкла Лукаса

Как видите в таблице обозначены два вида устройств — «raw» devices и block devices. Существуют программы, которые написаны для работы с raw
устройствами, и они не могут работать с блочными устройствами и, соответственно, наоборот.
При записи/чтении на/с block devices данные буферезируются, и по достижении определенного предела(размера буфера) происходит обращение к диску.
При записи/чтении на/с raw devices данные передаются устройству немедленно.
М.Лукас приводит следующий пример для облегчения понимания данных механизмов.
Представьте что перед вами стоит бутылка, которую вам необходимо наполнить таблетками. Вы берете таблетку правой рукой и перекладываете в левую, и
так до тех пор пока левая рука не наполнится, затем ссыпаете все таблетки из левой руки в бутылку — это будет работа с block devices. Ваша левая рука
играла роль буфера. А теперь складывайте каждую таблетку в бутылку по одной — это работа с raw devices.
*очень надеюсь что мой корявый перевод объяснений будет понятен
Заключительным действием мы монтируем массив и исправляем /etc/fstab для автоматического монтирования при загрузке системы.
#mkdir /raid #mount /deb/sd0a /raid #cat /etc/fstab ---skip--- /dev/sd0a /raid ffs rw,nodev,nosuid 1 2 ---skip---
4. rtorrent + rutorrent +apache2(торренты разные нужны, торренты разные важны).
Еще при приготовлении первого блюда(ака первоначальная настройка) мы установили необходимые компоненты для работы торрент качалки, кроме её самой.
Устанавливать её будем из портов.
Для того чтобы rtorrent работал в связке с rutorrent необходимо собрать его с опцией скрипта configure --with-xmlrpc-c, для этого перейдем в каталог
порта
# cd /usr/ports/net/rtorrent/
и исправим в Makefile параметр CONFIGURE_ARGS
CONFIGURE_ARGS= ${CONFIGURE_SHARED} --disable-debug --with-xmlrpc-c
*небольшой хинт, замечательный механизм Flavors, есть ни что иное как опции скрипта configure, о чем не сложно догадаться взглянув на Makefile
www/php5/extensions, к примеру.
Конфиг rtorrent'а приводить считаю излишним, скажу лишь что торенты складываются на отдельный диск примонтированый к /data, который экспортируется по
NFS. Права на папку
# ls -la /data/ total 16 drwxr-xr-x 4 root wheel 512 Dec 11 18:41 . drwxr-xr-x 16 root wheel 512 Dec 20 13:13 .. drwxr-xr-x 12 p2p p2p 1024 Dec 20 20:19 torrents
Создадим юзера от которого будет работать rtorrent
# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. There will be a chance later to correct any input. Enter username []: p2p ---skip---
автоматический запуск rtorrent, добавим в /etc/rc.local
if [ -x /etc/rtorrent.sh ]; then echo -n ' rtorrent'; /etc/rtorrent.sh fi
rtorrent.sh
# cat /etc/rtorrent.sh su p2p -c '/usr/local/bin/screen -m -d -S rtorrent /usr/local/bin/rtorrent'
Следующим по списку идет rutorrent
# cd /var/www/ # mkdir sites/ # cd sites/ # wget http://rutorrent.googlecode.com/files/rutorrent-3.2.tar.gz # tar xzvf rutorrent-3.2.tar.gz # chown -R www:www rutorrent # chmod -R 777 rutorrent/share/
Теперь возьмемся за настройку apache2, в системе он уже присутствует. Автоматический запуск при старте системы с нужными параметрами решается так
#cat /etc/rc.conf.local httpd_flags="-u"
*флаг -u я добавил для того чтобы отключить chroot'инг апача
Для rutorrent'а я сделал отдельный alias(о котором говорится в первом пункте) и VirtualHost
# cat /var/www/conf/Includes/rutorrent.home.local.conf <VirtualHost 192.168.254.10:80> DocumentRoot /var/www/sites/rutorrent ServerName rutorrent.home.local ServerAlias www.rutorrent.home.local ErrorLog "|/usr/local/sbin/rotatelogs2 /var/log/httpd/http.rutorrent.home.local-error_log.%Y-%m-%d-%H_%M_%S 86400" CustomLog "|/usr/local/sbin/rotatelogs2 /var/log/httpd/http.rutorrent.home.local-access_log.%Y-%m-%d-%H_%M_%S 86400" common VirtualHost <b>!!! - тэг, при правильном его написании не отображается</b> <Directory /> AllowOverride AuthConfig DirectoryIndex index.html Order Deny,Allow Deny from all Allow from 192.168.0.0/16 Directory <b>!!! - тэг, при правильном его написании не отображается</b> SCGIMount /RPC2 127.0.0.1:5000
Завершающим шртихом этого блюда будет настройка парольного доступа к web интерфейсу rutorrent.
В папке rutorrent'а создаем файл .htaccess
# cat /var/www/sites/rutorrent/.htaccess AuthName "Ololo can be found here!" AuthType Basic AuthUserFile /home/onotole/.htpasswd
и файл паролей по указанному пути
#htpasswd -c /home/onotole/.htpasswd admin
Стартуем apache и проверяем плоды наших трудов
#apachectl start
Пара скринов =)


5. NFS server (сетевая папка для доступа с компьютеров LAN).
Папки доступные клиентам для монтирования по NFS
# sed '/ *#/d; /^$/d' /etc/exports /data -alldirs -mapall=nobody -network=192.168.254 -mask=255.255.255.0 /raid -alldirs -mapall=nobody -network=192.168.254 -mask=255.255.255.0
Права доступа
#chmod 777 /raid
Запуск nfsd при старте системы
# grep nfs /etc/rc.conf.local nfs_server=YES
На десктопе у меня установлена FreeBSD, отредактировав /etc/fstab монтирую папки
#grep gateway /etc/fstab gateway:/data /home/onotole/data nfs ro 0 0 gateway:/raid /home/onotole/share nfs rw 0 0 #mount ~/data #mount ~/share
6. VPN тоннель с работой. FreeBSD(mpd5) OpenBSD (ppp) (люблю, знаете ли, порой работать из дома).
Доступ в локальную сеть на работе мне необходим постоянно, поэтому я организовал VPN тоннель между сервером на работе и домашним сервером.
Конфиг mpd5 выглядит так
startup: set user onotole ololo admin set console self 127.0.0.1 5005 set console open set web self 192.168.0.1 5006 set web open default: load pptp_vpn pptp_vpn: create bundle static pptp1 set ipcp ranges 10.255.255.1/32 10.255.255.2/32 set iface route 192.168.254.0/24 set iface enable proxy-arp set iface enable on-demand set bundle enable compression set bundle enable crypt-reqd set ccp yes mppc set mppc yes compress set mppc yes e128 set mppc yes stateless create link static lpptp1 pptp set link action bundle pptp1 set link no pap set link yes chap set auth authname "ololo" set auth password "123" set link mtu 1460 set link keep-alive 0 0 set link max-redial -1 set pptp self 1.2.3.4 set pptp peer 0.0.0.0/0 set link enable incoming
В OpenBSD выполним следующее:
изменяем параметр net.inet.gre.allow
# sysctl -w net.inet.gre.allow=1 net.inet.gre.allow: 0 -> 1
так же меняем значение параметра в /etc/sysctl.conf
# grep gre /etc/sysctl.conf net.inet.gre.allow=1
демон ppp, основной конфиг
# sed '/ *#/d; /^$/d' /etc/ppp/ppp.conf default: set log Phase Chat LCP IPCP CCP tun command disable ipv6cp vpn: set device "!/usr/local/sbin/pptp --nolaunchpppd work-onotole.com" set timeout 0 set lqrperiod 600 set redial 30 set authname ololo set authkey 123 set dial set login set mppe 128 stateless accept chap enable mssfixup disable acfcomp protocomp deny acfcom #
при поднятии линка(добавляем маршруты и передергиваем pf.conf)
# cat /etc/ppp/ppp.linkup vpn: add work-onotole.com 10.110.1.97 add 192.168.0.0 255.255.255.0 10.255.255.1 ! sh -c "/sbin/pfctl -f /etc/pf.conf"
при падении(удаляем маршруты и передергиваем pf.conf)
# cat /etc/ppp/ppp.linkdown vpn: delete 192.168.0.0/24 delete work-onotole.com ! sh -c "/sbin/pfctl -f /etc/pf.conf"
Поднимаем линк при старте системы
# cat /etc/hostname.tun0 !/usr/sbin/ppp -ddial vpn >/dev/null 2>&1
7. NUT + UPS Ippon Back power pro 400 (неожиданное отключение электричества нам не страшно).
Создаем конфиги для демонов.
ups.conf
# cat /etc/nut/ups.conf [myups] driver = megatec port = /dev/tty00 #ибп подключен к com1 desc = "Server"
upsd.users
# cat /etc/nut/upsd.users [admin] password = ups123 allowfrom = localhost actions = SET instcmds = ALL [monuser] password = mon123 allowfrom = localhost upsmon master
upsd.conf
# cat /etc/nut/upsd.conf LISTEN 127.0.0.1 3493
upsmon.conf
# cat /etc/nut/upsmon.conf MONITOR myups@localhost 1 monuser mon123 master MINSUPPLIES 1 #сколько у нас батарей в ибп SHUTDOWNCMD "/sbin/shutdown -h now" #комманда выключения POLLFREQALERT 5 #частота опроса ибп при работе от батареи DEADTIME 15 #интервал в секундах, перед тем как ибп будет объявлен мертвым POWERDOWNFLAG /etc/killpower #флаг для форсирования завершения работы FINALDELAY 60 #процент батареи, при котором происходит завершение работы системы
Выставим корректные права на tty00 и загрузим драйвер
# chown _ups:wheel /dev/tty00 # chmod 600 /dev/tty00 # /usr/local/bin/upsdrvctl start
Запускаем демоны
# /usr/local/sbin/upsd # /usr/local/sbin/upsmon
Проверяем состояние ИБП
# upsc myups@localhost battery.charge: 97.5 battery.voltage: 13.60 battery.voltage.nominal: 12.0 driver.name: megatec driver.parameter.pollinterval: 2 driver.parameter.port: /dev/tty00 driver.version: 2.4.1 driver.version.internal: 1.6 input.frequency: 50.1 input.frequency.nominal: 50.0 input.voltage: 221.5 input.voltage.fault: 221.5 input.voltage.maximum: 245.0 input.voltage.minimum: 206.8 input.voltage.nominal: 220.0 output.voltage: 221.5 ups.beeper.status: enabled ups.delay.shutdown: 0 ups.delay.start: 2 ups.load: 19.0 ups.mfr: unknown ups.model: unknown ups.serial: unknown ups.status: OL #ибп работает от сети, так же могут быть OB - от батареи и LB - батарея севшая ups.temperature: 25.0 ups.type: standby
Добавим в автозапуск
В /etc/rc.local прописываем автозапуск nut
if [ -x /usr/local/bin/upsdrvctl ]; then echo -n ' nut' chown _ups:wheel /dev/tty00 chmod 600 /dev/tty00 /usr/local/bin/upsdrvctl start > /dev/null 2>&1 /usr/local/sbin/upsd > /dev/null 2>&1 /usr/local/sbin/upsmon > /dev/null 2>&1 fi
Выключаем питание после того, как данные на дисках будут синхронизированы, добавим в rc.shutdown следующее
if [ -f /etc/killpower ]; then /usr/local/bin/upsdrvctl shutdown sleep 60 fi
8. Firewall (замечательный пакетный фильтр PF).
Включаем форвардинг пакетов
#sysctl -w net.inet.ip.forwarding=1
производим соответствующие изменения в /etc/sysctl.conf
#grep ip.forwarding /etc/sysctl.conf net.inet.ip.forwarding=1 # 1=Permit forwarding (routing) of IPv4 packets
конфиг PF более чем прост
# sed '/ *#/d; /^$/d' /etc/pf.conf ext_if="rl0" int_if="re0" vpn_if="tun0" set block-policy return set skip on lo0 match in all scrub (no-df) block all pass on $int_if pass on $vpn_if pass out on $ext_if #натим все из локалки pass out on $ext_if from $int_if:network to any nat-to ($ext_if) #прокидываем порты 3333(tcp,udp) для dc++ pass in on $ext_if proto {tcp,udp} from any port 3333 rdr-to 192.168.254.2 synproxy state
Всё! OpenBSD укомплектована =)

Вот такой получился у меня домашний сервачок.
Работать с OpenBSD мне очень нравится, нарвится её безкомпромисность, простота и надежность. Кстати, по настоящему оценил ценность команды man я
только сейчас и благодаря этой ОС. Документация системы выше всяких похвал. Разработчикам низкий поклон и глубочайшая благодарность.
При подготовке я использовал следующие источники:
1. man )
2. http://openbsd.org/faq/index.html
3. http://unixadmins.su/index.php/topic,196.0.html
4. www.openbsd.ru/docs/steps/nut.html
5. mpd.sourceforge.net/doc5/mpd.html
6. Absolute OpenBSD: Unix for the practical paranoid
Майклу Лукасу отдельная благодарность за его, без сомнения, шедевральные книги!
