Как стать автором
Обновить

Готовим рыбу Фугу дома или OpenBSD на домашнем сервере

Время на прочтение 10 мин
Количество просмотров 19K

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

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн