
Конечно же речь пойдет не о приготовлении всем известного японского деликатеса. А пойдет она о настройке нескольких сервисов, которые я определил для
себя как необходимые, на домашнем сервере. В качестве операционной системы которого будет выступать 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
Майклу Лукасу отдельная благодарность за его, без сомнения, шедевральные книги!