Популяризация OpenBSD, часть2 (dns, TimeMachine, Samba, ftpd, smtp+imap, pptp+l2tp)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
kasak
Сообщения: 887
ОС: OpenBSD

Популяризация OpenBSD, часть2

Сообщение kasak »

Привет! Очередной раз постараюсь простым языком рассказать как настроить простые сервисы в опенке.
Перед этим обращу внимание на различия FreeBSD и OpenBSD которые лично мне показались достаточными чтобы использовать именно опенку.
FreeBSD конечно хороша, особенно в плане поддержки оборудования и работы с дисками. Однако весь сетевой софт, который вызывает интерес (это тот же pf, openssh, opensmtpd, npppd) пишется прежде всего под опенку, а потом уже портируются во FreeBSD.
Кроме того это ещё вопрос кому что удобнее. Я долгое время пользуюсь OpenBSD и она мне по нраву гораздо больше любых других систем. Потому что с ней никогда не бывает проблем.

DNS:
В дефолтной установке OpenBSD в составе системы для организации dns идут unbound и nsd. Поскольку я всё таки ориентируюсь на новичков, объясняю чем они отличаются.
Говоря простым языком,
Nsd - это авторитативный dns сервер. Авторитативный dns север - это dns сервер, который отвечает только за свою зону (или несколько зон). И бесполезно спрашивать у него про другие зоны.
Unbound - это кэширующий сервер. Кэширующий сервер, это сервер который обслуживает клиентов. И у него можно спросить про любую зону, однако управлять своей зоной как nsd он не может.

Логично и правильно определение, что если мы настраиваем NSD, то у нас есть реальный ip адрес, чтобы регистратор мог работать с нашим dns сервером.
Существуют ситуации когда невозможно держать dns сервер на реальном ip адресе. В таком случае сервер размещается внутри сети, и на него осуществляется редирект tcp и udp порта 53 со внешнего шлюза.
Это уже не такой каноничный способ, но я рассмотрю и его.

У нас есть дефолтная установка OpenBSD с настроенными ip адресами, пусть это будет 1.2.3.4 внешний, и 192.168.0.1 внутренний адрес.
Всё что нужно для работы nsd в опенке лежит в директории

Код: Выделить всё

/var/nsd

Там будет находится и файл конфигурации и файлы зон. К счастью конфигурация сервера nsd занимает не больше минуты. Сначала его надо привязать к нужному нам внешнему ip адресу

Код: Выделить всё

## bind to a specific address/port
        ip-address: 1.2.3.4

А потом в конце файла добавить описание зон. Пусть это будет зона foo.bar:

Код: Выделить всё

zone:
        name: "foo.bar"
        zonefile: "foo.bar"

имя файла zonefile можно конечно же выбрать произвольно.
Теперь нужно составить файл зоны. У файлов зон довольно замысловатый синтаксис, но на самом деле понять его очень просто.

Код: Выделить всё

@               IN SOA  ns.foo.bar. hostmaster.foo.bar. (
                                20150413  ; serial
                                86400      ; refresh (1 day)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                   IN NS      ns.foo.bar.
                   IN A         1.2.3.4
                   IN MX      10 mx.foo.bar.

ns               IN CNAME @


Первая строка это очень длинное описание soa, то есть запись start-of-authority
Начинается она со значка @. Это понимается сервером как имя зоны, указанное в nsd.conf. Далее идёт IN, означающую класс записи Internet, после SOA, идёт имя dns сервера, который будет обслуживать зону. ns.foo.bar. После чего пишется e-mail адрес ответственного за администрирование этого сервера. После чего в скобках указываются временные рамки для следующего:
20150413 - Это серийный номер зоны. Он должен увеличиваться каждый раз при изменений файла зоны. точка с запятой ; означает начало комментария, serial это сам комментарий
86400 это время обновления зоны. То есть время, через которое вторичные сервера должны проверять не обновилась ли зона.
7200 это время, через которое вторичные сервера должны пробовать обновить зону в случае неудачи
604800 это время, при достижении которого, при отсутствии ответов первичного сервера, вторичные сервера должны перестать считать информацию авторитетной.
последнее число - это минимальное время жизни записей.
На самом деле если убрать все комментарии и записать файл зоны без комментариев он будет выглядеть проще и нагляднее:

Код: Выделить всё

@               IN SOA  ns.foo.bar. hostmaster.foo.bar. ( 20150413 86400 7200 604800 86400 )
                   IN NS      ns.foo.bar.
                   IN A         1.2.3.4
                   IN MX      10 mx.foo.bar.

ns               IN CNAME @

В нескольких следующих строках опущен знак @ в начале строки. Поскольку иных знаков там нет, подразумевается что мы всё ещё описываем зону @ (то есть foo.bar.)
IN NS это описание dns сервера который будет описывать нашу зону. Сюда должны входить все сервера, как первичные, так и вторичные.
IN A это ip адрес самой зоны.
IN MX 10 это описание почтового сервера для зоны.
После чего мы уже описываем не зону foo.bar., а узел ns. мы указываем что узел ns.foo.bar. это мнемоническое имя foo.bar.
Обратите внимание на точки. Точка ставится если описывается полное имя (например ns.foo.bar.), если описывается короткое имя (например ns, тогда точка не ставится)

Теперь у нас есть всё для запуска nsd, и его можно запустить, не забыв добавить в /etc/rc.conf.local строку nsd_flags=""
запускаем командой

Код: Выделить всё

/etc/rc.d/nsd start


В первой части статьи была информация как включить unbound. Тогда я привязал его к локальному ip адресу. Теперь получается что у нас запущены сразу два dns. Один для клиентов локальной сети, другой авторитетный для управления своей зоной.
Но нужно подсказать unbound чтобы спрашивал про нашу зону, на нашем же сервере. Для этого добавим в конец конфига unbound следующую запись:

Код: Выделить всё

stub-zone:
        name: "foo.bar."
        stub-addr: 1.2.3.4


Кроме того, иногда бывает что у провайдеров есть такие штуки как retracker.local, если это имеет место, следует добавить так же форвард зоны .local на сервер провайдера.
Если например у провайдера dns имеет адрес 10.10.10.10 то запись будет такой:

Код: Выделить всё

forward-zone:
        name: "local"
        forward-addr: 10.10.10.10


Всё, теперь всё работает как нужно!
Но вначале я упоминал что бывает такое, что невозможно расположить dns на сервере с реальным ip. В этом случае необходимо либо располагать unbound и nsd на разных машинах в сети, либо присвоить одной машине сразу два ip адреса, и привязать nsd к одному адресу, а unbound к другому.
Предположим что это OpenBSD машина с адресом 192.168.0.10 и сетевой картой intel.
Тогда в /etc/hostname.em0 добавляем ещё один ип чтобы оно выглядело примерно так:

Код: Выделить всё

inet 192.168.0.10 255.255.255.0
inet alias 192.168.0.11 255.255.255.255


И теперь привязать nsd например к алиасу а unbound к основному ip. Тогда нужно будет на шлюзе пробросить tcp и udp порт 53 на ип адрес 192.168.0.11.

Я время от времени вижу рецепты, как например повесить nsd на порт 5353 а unbound будет слушать на всех интерфейсах и соотвественно отвечать на все запросы. Это крайне не тепло, и уж тем более не лампово! Так делать не следует.

Вроде бы про настройку dns я вкратце рассказал.
Следующий пункт TimeMachine. Сейчас маки стали довольно популярны. И с помощью OpenBSD можно реализовать хранилку для TimeMachine. Для этого нужно установить пакет netalalk

Код: Выделить всё

pkg_add netatalk

В OpenBSD 5.7 так же будет добавлен пакет netatalk3 с версией 3.1.7 и конфигурация будет немного отличатся.
Сначала создаём где-нибудь на диске папку где всё наше богатство будет хранится.
Допустим это будет /somewhere

Код: Выделить всё

mkdir /somewhere
mkdir /somewhere/tm

Теперь редактируем /etc/netatalk/AppleVolumes.default добавляя в конец:

Код: Выделить всё

/somewhere/tm TimeMachine options:tm ea:ad allow:myuser

Тут видно что мы разрешаем доступ только юзеру myuser
Обратите так же внимание на вот этот кусочек:

Код: Выделить всё

# The line below sets some DEFAULT, starting with Netatalk 2.1.
:DEFAULT: options:upriv,usedots

# The "~" below indicates that Home directories are visible by default.
# If you do not wish to have people accessing their Home directories,
# please put a pound sign in front of the tilde or delete it.
#~

Он находится почти сразу над концом файла.
Такая настройка выключает домашние директории (~) и устанавливает опции для каждой шары.
Дополнительно, если речь идёт о домашнем сервере следует обеспокоится об ограничении доступа. Хоть мы и заблокировали доступ ко всему в первой части статьи, можно дополнительно указать серверу слушать только на локальном интерфейсе, отредактировав /etc/netatalk/afpd.conf вот так:

Код: Выделить всё

# default:
 - -tcp -noddp -uamlist uams_dhx.so,uams_dhx2.so -ipaddr 192.168.0.1


uams_dhx предполагает что мы авторизовываем клиентов через /etc/passwd.
Поэтому следует добавить нового пользователя (исходя из AppleVolumes.default это будет myuser), но учитывать что для того чтобы netatalk правильно работал, нужно чтобы этот юзер был в группе wheel и у него был настроен нормальный shell, не nologin!
С чем связаны такие ограничения сказать не могу т.к. не смог найти какой либо описания проблемы.
Добавляем пользователя:

Код: Выделить всё

# 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 []: myuser
Enter full name []: timemachine
Enter shell csh false ksh nologin sh [nologin]: ksh
Uid [1003]:
Login group myuser [myuser]:
Login group is ``myuser''. Invite myuser into other groups: guest no
[no]:
Login class _dovecot authpf bgpd daemon default dovecot staff
[default]: staff
Enter password []:
Enter password again []:

Name:        myuser
Password:    ****
Fullname:    timemachine
Uid:         1003
Gid:         1003 (myuser)
Groups:      myuser
Login Class: staff
HOME:        /home/myuser
Shell:       /bin/ksh

и добавим его так же в wheel:

Код: Выделить всё

usermod -G wheel myuser

И поправим права доступа

Код: Выделить всё

chown -R myuser /somewhere/tm

Всё, теперь можно запускать
/etc/rc.d/netatalk start
и пробовать логинится. Если увидим шару TimeMachine значит всё работает.
Возможно netatalk3 перестанет требовать пользователя из группы wheel, однако пока что ситуация такова.

Прежде чем настраивать самбу, хотелось бы сначала уточнить зачем она.
Давайте сначала настроим торрентилку. Для этого установим

Код: Выделить всё

pkg_add transmission

Весь конфиг и всё что нужно он будет хранить в:
/var/transmission.
Добавим в /etc/rc.conf.local

Код: Выделить всё

transmission_daemon_flags="--log-error"

И выполним пробный запуск и завершение:

Код: Выделить всё

/etc/rc.d/transmission_daemon start
/etc/rc.d/transmission_daemon stop

Это создаст иерархию в /var/transmission:

Код: Выделить всё

ls /var/transmission/.config/transmission-daemon/
blocklists/    dht.dat        resume/        settings.json  stats.json     torrents/

Теперь можно редактировать settings.json по своему усмотрению. Не буду рассказывать как, тут у каждого свои предпочтения. Важно что нельзя его редактировать пока трансмишен включен. При перезапуске он его перепишет. Редактировать можно только после выключения.

Родной ftpd. Не мудрёная штучка. Он работает с пользователями в passwd, никаких виртуальных, никаких сложных настроек. Для работы родного ftpd в режиме анонимуса, достаточно просто добавить пользователя ftp c шеллом /usr/bin/false а потом добавить /usr/bin/false в список шеллов, /etc/shells.
Для запуска используем /etc/rc.conf.local добавляя туда:
ftpd_flags="-4A"
Это позволит заходить и под анонимусом, и под системными пользователями.

Предположим что для пользователя ftp домашняя директория установлена в /somewhere/ftp, а для transmission вы установили директорию для скачивания в /somewhere/torrent

Тогда мы можем установить самбу

Код: Выделить всё

pkg_add samba
и в конец /etc/samba/smb.conf добавить

Код: Выделить всё

[ftp]
path = /somewhere/ftp/
read only = no
force user = ftp
guest ok = yes
guest only = yes

[torrents]
path = /somewhere/torrent/
read only = no
force user = _transmission
guest ok = yes
guest only = yes


Этого необходимо и достаточно чтобы иметь доступ из локальной сети к нужным файлам. Не забываем конечно назначить пользователей

Код: Выделить всё

chown -R ftp /somewhere/ftp
chown -R _transmission /somewhere/torrent


И перед тем как приступить к описанию простого почтового сервера, кратко опишу pptp и l2tp.

Для того чтобы была возможность пользоваться npppd, нужно включить pipex через sysctl. включаем это и gre:
добавляем в /etc/sysctl.conf

Код: Выделить всё

net.pipex.enable=1
net.inet.gre.allow=1

Редактируем файлик /etc/npppd/npppd.conf

Код: Выделить всё

authentication LOCAL type local {
        users-file "/etc/npppd/npppd-users"
}

tunnel L2TP protocol l2tp {
        listen on 0.0.0.0
}

tunnel PPTP protocol pptp {
        listen on 0.0.0.0
}

ipcp IPCP {
        pool-address 192.168.200.2-192.168.200.20
        dns-servers 192.168.0.1
}


interface pppx0 address 192.168.200.1 ipcp IPCP
bind tunnel from L2TP authenticated by LOCAL to pppx0
bind tunnel from PPTP authenticated by LOCAL to pppx0


После чего в pf.conf нужно (или не нужно?) добавить строку для раздачи интернета vpn клиентам.
pass out on $wan inet from 192.168.200.0/24 received-on pppx nat-to $wan:0

И наконец про почтовый сервер.

Вообще настройка почты это сложная задача для любого системного администратора. К счастью с приходом OpenSMTPD жить стало проще, хотя в нём и недостаёт некоторых функций, он всё равно очень хорош!
Сначала небольшой экскурс для новичков простым языком, как же вообще работает электронная почта.
Прежде всего необходимо понимать, что smtp сервер и imap это разные сервисы. Электронной почтой можно пользоваться и вовсе без imap или pop. Говоря простым языком, почта хранится на серверах И метод передать почту с одного сервера на другой, это smtp.
Давайте подробнее изучим что происходит при передаче письма и в чём основная сложность.

Отбросим все лишние мысли, представим на минуту что у нас есть только smtp сервер. Мы пишем письмо, и хотим его отправить. Для этого, мы ломимся на сервер, от которого у нас обычно есть логин и пароль, и отправляем ему письмо, которое он доставляет по адресу. Кроме того, этот же сервер должен принимать письма, и успешно доставлять их вам, кроме того у тех людей которые хотят доставить письмо вам он не должен спрашивать пароль!

Допустим письма доставлены и лежать на сервере, но как их теперь прочитать? А тут уже работает pop3/imap сервер, который позволяет вам читать корреспонденцию лежащую на сервере.

Для создания простого почтового сервера нам понадобится установить dovecot, он будет служить pop3/imap сервером.

Код: Выделить всё

pkg_add dovecot

Dovecot является одним из тех крупных рогатых серверов, которые любят съесть системных ресурсов побольше. В OpenBSD для каждого процесса и пользователя установлены ограничения на количество открытых файлов и объём потребляемой памяти.
Нужно расширить для довекота эти объёмы. Для этого в конец /etc/login.conf дописываем:

Код: Выделить всё

dovecot:\
        :openfiles-cur=512:\
        :openfiles-max=2048:\
        :tc=daemon:

_dovecot:\
        :openfiles-cur=512:\
        :openfiles-max=2048:\
        :tc=daemon:


Первая колонка описывает рамки для демона который запустится через /etc/rc.d/dovecot. Имя файлика для запуска определяет имя колонки которую нужно вписать. Вторая колонка определяет ресурсы для пользователя _dovecot.
Настроенный по умолчанию dovecot будет искать письма в ~/Maildir чего нам на данном этапе достаточно. Авторизацию будем проводить как и в примерах ранее через системных пользователей.

Для правильной работы smtp следует размещать его там, где есть реальный ip адрес. Возможно так же расположение и внутри сети, но лучше и проще чтобы он был запущем на внешнем ip адресе.
Конфигурация opensmtpd очень проста, но сначала нужно сгенерировать сертификат и ключ для сервера, я буду надеятся что читатель сделает это самостоятельно т.к. я по памяти не вспомню.
Редактируем /etc/mail/smtpd.conf:

Код: Выделить всё

pki foo.bar certificate "/etc/ssl/foobar.pem"
pki foo.bar key "/etc/ssl/private/foobar.key"

listen on lo0

listen on em0 inet4 secure pki foo.bar auth-optional
listen on em0 inet4 port submission tls pki foo.bar auth

table aliases db:/etc/mail/aliases.db

table domains { foo.bar }

accept for local alias <aliases> deliver to mbox
accept from any for domain <domains> alias <aliases> deliver to mda "/usr/local/bin/procmail"

accept for any relay

max-message-size 100M

limit mta inet4


Первая строка listen on lo0 включает прослушивание на локальном интерфейсе, это нужно чтобы система могла посылать письма внутри самой себя.
Далее две строки которые включают сервер на внешнем интерфейсе. Первая включает его на порту 25 с tls, и порту 465 c ssl, с опциональной авторизацией, вторая включает на порту submission с обязательной авторизацией.
Что это всё значит:
Мы включаем необязательную авторизацию на порту 25 для того чтобы письма, приходящие на наши домены проходили без проблем. А вот для отправки писем на другие домены нужно будет иметь логин и пароль.
Это не совсем правильный рецепт, но его используют на большинстве существующих почтовых серверов.
Правильно оставлять 25 порт без возможности авторизации, только на приём писем для наших доменов. А для отправки использовать submission порт.
Тем не менее эта схема работает и совместима с большинством почтовых клиентов.
Далее описаны две таблицы. В первой alias, во второй список доменов для которых можно принимать почту.
Следующая строка нужна чтобы доставлять почту внутри самого сервера, чаще всего это системные письма для root.
Следующая строка проверяет домен и если письмо подходит, он передаёт его procmail.
accept for any relay служит для того чтобы мы сами отправляли письма по любым направлениям.
последние две строки определяют максимальный размер письма и запрещают попытки отправить его через ipv6.

Последним делом нужно настроить проверку спама. Для этого устанавливаем procmail и spamassassin

Код: Выделить всё

pkg_add procmail p5-Mail-SpamAssassin

Создаём /etc/procmailrc

Код: Выделить всё

DELIVER=/usr/local/libexec/dovecot/deliver
DROPPRIVS=yes
UMASK=007

:0fw
* < 512000
| /usr/local/bin/spamc

:0
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*
/dev/null

:0
* ^X-Spam-Status: Yes
| $DELIVER -m Junk

:0
| $DELIVER


Такая настройка сначала передаёт письма спам фильтру, если они размером больше чем 512000 байт.
Далее возвращенные письма идут по цепочке и проверяется заголовок X-Spam-Level. В этом заголовке куча звёздочек. Если из больше чем 11 письмо абсолютно точно спам и отправляется в мусор.
Далее проверяется заголовок X-Spam-Status. Если звёздочек меньше 11 но статус письма спам, то его нужно положить в папку Junk
Последняя строка отдаёт довекотовскому деливеру все остальные письма.

Нужно включить спамассассин и настроить его на обновления.
/etc/rc.d/spamassassin start
а в
/etc/daily.local добавляем:

Код: Выделить всё

PATH=/usr/local/bin:/usr/local/sbin:$PATH
sa-update && /etc/rc.d/spamassassin reload


Теперь просто создаём в домашних директориях пользователей папки Maildir и пробуем настроить почтовый клиент.

К сожалению не могу достаточно развёрнуто описать эту тему, хотя описать надо ещё кучу всего. И виртуальных юзеров и тонкости настроек.
Прошу прощения за неполную подачу информации но очень надеюсь это вам помогло понять принципы.
В следующих статьях я опишу как настроить апач и нгинкс, как настроить фильтрацию http и как считать трафик. А пока что на этом всё.

ДОПОЛНЕНО 16.10.2016

Немного хочу добавить про netatalk. Как я уже говорил в OpenBSD 5.7 добавлен netatalk версии 3.1.7. Его конфиг отличается, кроме того удалось решить проблему с друппой wheel и shell что создавало небольшие но потенциальные проблемы безопасности.
Во первых конфиг был многократно упрощён. Теперь Он выглядит так:

Код: Выделить всё

$ cat /etc/netatalk/afp.conf
;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
 mimic model = TimeCapsule6,106
 afp interfaces = em1

[TimeMachine]
 path = /somewhere/tm
 valid users = someuser
 time machine = yes
 ea = ad
 appledouble = v2


Обратите особое внимание на самый конец. appledouble = v2. эта опция нужна т.к. это опция чтобы нетаталк не ругался на невозможность записи extended attributes.
Теперь можно вынуть пользователя из группы wheel и просто сделать папку /etc/netatalk читаемой для всех.

Код: Выделить всё

chmod o+rx /etc/netatalk


Что же с шеллом, можно установить шелл /usr/bin/false. Как показала практика с ним всё работает.
Linux kasakoff 5.10.7-200.fc33.x86_64 #1 SMP Tue Jan 12 20:20:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Спасибо сказали:

ciwo
Сообщения: 2

Re: Популяризация OpenBSD, часть2

Сообщение ciwo »

kasak
а разве не нужно сделать ребилд файла login.conf после внесения изменений?
Спасибо сказали:

Аватара пользователя
kasak
Сообщения: 887
ОС: OpenBSD

Re: Популяризация OpenBSD, часть2

Сообщение kasak »

ciwo писал(а):
23.04.2015 16:58
kasak
а разве не нужно сделать ребилд файла login.conf после внесения изменений?


Нет, в OpenBSD этого делать не нужно
Linux kasakoff 5.10.7-200.fc33.x86_64 #1 SMP Tue Jan 12 20:20:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Спасибо сказали: