OpenBSD — Настраиваем Sendmail MTA в режиме Smart Relay

Статья из серии статей о настройке сервера для небольшого офиса на OpenBSD.

На этот раз коротко опишу о том как подымал MTA (Mail Transfer Agent, подробнее смотри тут) для своего офиссервера работающего на OpenBSD. Сначала стоит упомянуть некоторую предысторию, в результате которой, наш доблесный провайдер Cyfra, заблочил нам 25 порт целяком и полностью, оставив лиш небольшую «лазейку в мир» в виде своего SMTP сервака — smtp.uatele.com. Да собственно предистория то банальность в совершенном виде — поймался на одной из офисных машинок какойто троянчик mailware, который розсылал чего непопадя куда ему только вздумается. С ним конечно коекак пытался справиться SAV 10 — но получалось у него неахти как хорошо. Изза чего, как нам сказала техподдержка цифры, на нас накатали телег (полагаю, в письменном виде) несколько уважаемых в инете контор 🙂

Зараженная машинка в таком вот виде проработала всегото с полдня, наверное — но выход в инет по 25-му порту нам таки заблочили 🙁 Ну да фигня то все! Остался цифровский SMTP — через него можно слать 🙂

Итак, начальные данные такие:

  • Шлем через SMTP провайдера — в нашем случае smtp.uatele.com
  • Необходимо учесть что у сервера smtp.uatele.com есть свои ограничения:
  1. Максимальные размер письма — 8 Метров
  2. Максимальное количество получателей — 15 человек
  • «Слушаем» только на внутресетевом интерфейсе сервера
  • Настроить автозапуск MTA при старте системы

Вроде все! Вперед 🙂

MTA по умолчанию в OpenBSD является Sendmail. По умолчанию значит что он идет в стандартной поставке дистра. Первым что я подумал, когда узнал об этом, было нечто такое: «Этот поросший мхом MTA годится только для пугания одминов-новичков своими конфигами и логами — и больше ниначто!». Но всетаки решил покрутить его для успокоения совести, мол все равно ничего с ним не получится — в итоге поставлю чтото более удобоваримое. Но поглядев в умолчательный конфиг, с удивлением обнаружил, что он какбудто под меня скроен. Задача то у меня совсем тривиальная — такчто править пришлось всегото пару-тройку строчек! И результат для тестирования получился уже спустя полчасика. Вот несколько движений которые сделал я для настройки под свою задачку Sendmail:

Идем в /usr/share/sendmail/cf — именно там лежат заготовочки на все случаи жизни 🙂

root@gw:~ # cd /usr/share/sendmail/cf/

Тут лежат примеры конфигов под разные задачи. Все они доступны только для чтения. Мне понравился конфиг openbsd-proto.mc — поэтому решил использовать его. Сначала сделал его доступным для редактирования коммандой:

root@gw:/usr/share/sendmail/cf# chmod u+w openbsd-proto.mc

После этого открываем конфиг для редактирования (я для этой цели использую ранее установленный vim)

root@gw:/usr/share/sendmail/cf# vim openbsd-proto.mc

С самого начала файла, после опции OSTYPE идет настройка SMART_HOST — это какраз то что нам нужно прописать чтобы наш mail-server отправлял поступающую ему почту через сервер провайдера. Поэтому розкомментируем ее и вписываем SMTP сервер провайдера. У меня вышло так:

OSTYPE(openbsd)dnl
dnl
dnl If you have a non-static IP address you may wish to forward outgoing mail
dnl through your ISP's mail server to prevent matching one of the dialup
dnl DNS black holes.  Just uncomment the following line and replace
dnl mail.myisp.net with the hostname of your ISP'
s mail server.
dnl
define(`SMART_HOST', `smtp.uatele.com')dnl
dnl

Теперь идем ниже до строчки которая начинается опцией DAEMON_OPTIONS — тут указывается где наш MTA будет слушать подключения клиентов. В умолчательном конфиге указан адрес 0.0.0.0 для IPv4 клиентов и :: для IPv6. И еще какието строчки непонятные, короче всего 4 — вот так они выглядят по умолчанию:

DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Name=MTA6, M=O'
)dnl
DAEMON_OPTIONS(`Family=inet, Address=0.0.0.0, Port=587, Name=MSA, M=E')dnl
DAEMON_OPTIONS(`Family=inet6, Address=::, Port=587, Name=MSA6, M=O, M=E'
)dnl

Нам же нужно заставить sendmail слушать только 127.0.0.1 и внутресетевой интерфейс ip которого 192.168.100.2. Поэтому я из этих четырех строчек сделал 2 те что мне надо — получилось вот так:

DAEMON_OPTIONS(`Family=inet, Address=192.168.100.2, Port=25, Name=MTA')dnl
DAEMON_OPTIONS(`Family=inet, Address=127.0.0.1, Port=25, Name=MTA'
)dnl

Ниже еще есть опция где можно прописать сеть клиентов которым разрешено подключаться. Вот что по умолчанию:

dnl Use either IPv4 or IPv6 for outgoing connections.
dnl
CLIENT_OPTIONS(`Family=inet, Address=0.0.0.0')dnl
CLIENT_OPTIONS(`Family=inet6, Address=::'
)dnl
dnl

Тоесть розрешено всем как IPv6 так и IPv4 адресам. Но у меня sendmail должен обслуживать только IPv4 сеть, такчто я исправил на такое:

dnl Use either IPv4 or IPv6 for outgoing connections.
dnl
CLIENT_OPTIONS(`Family=inet, Address=0.0.0.0')dnl
dnl CLIENT_OPTIONS(`Family=inet6, Address=::'
)dnl
dnl

И в конце файла (где закончились строки начинающиеся с dnl) добавил опцию ограничения максимального размера сообщения и максимального количества получателей:

dnl
dnl Max Message Size dnl
define(`confMAX_MESSAGE_SIZE', `8000000')
dnl Max Recipients per Message dnl
define(`confMAX_RCPTS_PER_MESSAGE', `15')
dnl Enforce valid Message-Id to help stop spammers.
dnl

Стоит заметить что размер указан в байтах, такчто реально 8000000 меньше чем 8M 🙂

Вот и все! Проще не придумаеш 🙂 Теперь этот конфиг нужно собрать. Для этого используется стандартная приблуда — make

Делается в этой же директории примерно так (указанием цели сборки служит имя файла конфигурации sendmail с разширением cf):

root@gw:/usr/share/sendmail/cf# make openbsd-proto.cf

В результате успешной работы этой команды у вас появится тут же готовый конфиг для sendmail с названием openbsd-proto.cf

Я переместил его в директорию /etc/mail и обозвал office.cf

root@gw:/usr/share/sendmail/cf# mv openbsd-proto.cf /etc/mail/office.cf

На этом настройку и сборку главного конфига Sendmail MTA считаю законченой для своей задачи 🙂

Теперь осталось разобраться с запуском sendmail. На самом деле розбираться тут особо нечего — просто запускаем из рутовой консоли командой:

root@gw:~ # sendmail -L sm-mta -C/etc/mail/office.cf -bd -q30m

И тоже самое добавляем в /etc/rc.conf.local для автоматического старта sendmail во время загрузки системы:

root@gw:~ # grep -i sendmail /etc/rc.conf.local

sendmail_flags="-L sm-mta -C/etc/mail/office.cf -bd -q30m"

Ну вот и автозапуск sendmail одолели!

Пробуем настроить любимый Mail-клиент на одном из компов внутрисети. Данные POP3/IMAP используем любого доступного/нужного mail-сервера, а вот в качестве SMTP-сервера прописываем свой 192.168.100.2. Принимать смог сразу, а вот с отправкой лажа — ошибка 550 (Relaying Denied!) 🙂 Эта ошибка вполне предсказуема. Нужно просто подправить файлик /etc/mail/access до такого вида:

root@gw:~# cat /etc/mail/access
# $OpenBSD: access,v 1.1 2003/09/23 21:37:11 millert Exp $
#
# sendmail(8) access database.  Rebuild by running as root:
#   makemap hash /etc/mail/access < /etc/mail/access
#
# See /usr/share/sendmail/README for a description of this file
# under the "access_db" feature.
#
192.168.100     RELAY
root@gw:~#

Тоесть просто добавляем в конец строчку 192.168.100     RELAY которая розрешает релейную передачу писем через наш сервер из сети 192.168.100.0/24

Обновить базу данных access можно и нужно командой:

root@gw:/etc/mail# makemap hash /etc/mail/access < /etc/mail/access

После этого необходимо передернуть сэндмыло:

root@gw:/etc/mail# kill -HUP `head -1 /var/run/sendmail.pid`

Теперь все что мы задумали — должно работать как надо. Сразу после запуска — не стесняемся! Тестим по полной программе! Про себя могу сказать — работает уже полгода без нареканий как с моей, так и со стороны пользователей 🙂

Всем удачи — и поменьше спама в MTA!!!

    • nerve
    • Ноябрь 2nd, 2010 4:39пп

    делал тоже самое и не работает.
    почитал здесь:
    http://lists.freebsd.org/pipermail/freebsd-questions/2003-April/002997.html
    оказывается смарт хост не нужно брать в кавычки.

    • admin
    • Декабрь 29th, 2010 8:12пп

    Странно, но у меня работает именно описаный конфиг на ура уже более года 🙂
    P.S. Зуб даю! Только что проверил 🙂

    • Микола
    • Февраль 13th, 2012 12:49пп

    спасибо, товарищ).

    • rayne
    • Январь 27th, 2014 2:06пп

    Спасибо, всё работает.

  1. Трэкбэков пока нет.

Why ask?