Установка и настройка sendmail 8.13.4 с Drweb 4.32 во FreeBSD


Установка и настройка почтового сервера на основе sendmail с drweb

Вот решил написать статью-руководство по установке почтового сервера на основе sendmail с антивирусником Drweb. У меня возникла необходимость в почтовом сервере и я остановил свой выбор на sendmail, перерыл просто огромную кучу инфы в инете, из каждой статью выбирая кусочек нужной и актуальной информации. Именно отсутствие актуальной статьи, подтолкнуло меня на написание данной статьи. На момент написания данной статьи я использовал os Freebsd 5.4 Stable, sendmail 8.13.4 (собственно сам почтовый сервер с smtp), drweb 4.32.2 (антивирусник), drweb-sendmail 4.32.1 (нужен для передачи писем антивируснику через Milter ), fetchmail 6.2.5 (нужен для сбора писем с внешних ящиков), procmail 3.22 (сортировщик писем с внешних ящиков), qpopper 4.0.8 (POP3 клиент). Я расскажу все что именно я делал. Если нет необходимости в каком-либо пакете его можно не ставить, единственное надо учесть что sendmail это только smtp.

Сразу отвечу почему я ставлю sendmail из портов, потому что Sendmail должен быть собран с поддержкой milter, что бы через milter drweb проверял почту.

Начнем. Сначала поставим из портов sendmail заходим в /usr/ports/mail/sendmail делаем:
#make install clean

Далее я в /etc/rc.conf добавил строки
sendmail_enable="YES"
sendmail_flags="-bd -q30m"
inetd_enable="YES"

Первой строкой включаем sendmail.
Второй строкой запускаем sendmail как демон (-bd) и (-q30m) которое определяет периодичность обработки очереди. В нашем случае 30мин.
В третий разрешаем Internet Super-Server.

Конфигурационные файлы sendmail находятся в /etc/mail. Заходим туда и делаем
#make

Появятся 4 файла, например hostname компа mail.domain.ru то появятся файлы
mail.domain.ru.cf
mail.domain.ru.mc
mail.domain.ru.submit.cf
mail.domain.ru.submit.mc

mail.domain.ru.mc ? это наш конфигурационный файл, но к нему мы вернемся попозже.

Для начала посмотрим файл /etc/mail/aliases

Назначение этого файла если в двух словах перенаправление почты, т.е. строка
postmaster: root

будет означать, чтобы все письма на postmaster перенаправлялись к root.

А у себя оставил вот так:
MAILER-DAEMON: postmaster
postmaster: root
bin: root
daemon: root
ingres: root
nobody: root
games: root
system: root
toor: root
uucp: root
manager: root
dumper: root
webmaster: root
abuse: root
decode: root

Формат этого файла очень простой: до двоеточия идет имя пользователя, с которым sendmail должен разбираться, а после идет имя (или имена) пользователя, на которого пересылается вся почта, предназначенная этому пользователю. В вышеприведенном файле вся почта будет пересылаться пользователю root.

Также я себе добавил строку:
root: erasha

чтобы пользователь erasha получал всю почту для root.

С помощью этого файла легко можно сделать простой список рассылки:
everyone: user1,user2,user3@domain.ru

В данном примере все письма, которые приходят на имя пользователя everyone, будут разосланы пользователям user1, user2, user3@domain.ru

Этот файл в основном служит для служебных целей и трогается редко. Если же самому пользователю необходимо перевести доставку своей корреспонденции на другую машину, то есть два варианта: fetchmail (описыватся ниже) и создание в своем домашнем каталоге файла .forward. Формат его еще проще: в нем внутри просто записываете емайл, на который необходимо отфорвардить почту.

Теперь смотрим файл /etc/mail/access. Этот файл отвечает за доступ к вашему почтовому сервеку, т.е. можно запретить получать почту от целого домена или с определенного адреса. Формат тоже простой:
[имя хоста или е-майл] [действие]

состоит из строк содержащих пары значений, разделенных пробелами или табуляцией. Первое значение должно являться электронным адресом, именем домена или ip-адреcом (можно задавать целые сети), второе - кодовым обозначением действия. Действие может быть следующим:
REJECT - соединение с передающим узлом немедленно разрывается.
DISCARD - сервер примет сообщение, и "проглотит" его, сообщив об успешной доставке отправителю, но не доставит письмо.)
OK - разрешает доступ (обычно используется для переопределения других условий)
RELAY - разрешает пересылку почты
Код ошибки и ее описание: аналогично REJECT, но позволяет создавать собственные сообщения об ошибках.

Типовой файл access обычно выгдядит так:
# наша локальная сеть - адреса 192.168.x.x
192.168 RELAY
# сервера, находящиеся в вашем домене
domain.ru RELAY
# некто, кому разрешено пользоваться нашим почтовым сервисом откуда угодно
masha@mail.ru RELAY
# домены спаммеров
cyberspammer.com 550 Spam
listbuilder.com 550 Spam
spamer.com 550 Spam
#чья-то сеть из которой активно рассылают спам.
195.161.xxx.xxx 550 Spam
# нехорошо закрывать весь mail.ru, поэтому приходится закрывать отдельные адреса
spam@mail.ru 550 Spam

В действии можно указать какую ошибку возвращать при попытке воспользоваться вашим почтовым сервером, например
cyberspammer.com 550 We don`t accept mail from spammers

Вместо сообщения 550 Spam можно написать REJECT, поведение Sendmail от этого не изменится, но подробные сообщения об ошибках могут быть полезными при анализе лог-файлов Sendmail (/var/log/maillog).

Я себе сделал так, где domain.ru это домен который будет обслуживать sendmail, a 192.168 локальная сеть:
192.168 RELAY
localhost RELAY
domain.ru RELAY

потом создаем два файла
#touch domaintable
#touch virtusertable

Файл domaintable используется для исправления неправельных адресов на правельные после запроса DNS сервера. Мне это не нужно, поэтому оставляю этот файл пустым.

Файл virtusertable используется для разграничения пользователей по нескольким доменам.

Например, вы держите 2 домена dom1.ru и dom2.ru и вам надо, что бы пользовали info@dom1.ru и info@dom2.ru не пересекались. Для этого заводим 2х пользователей: info1 и info2, и прописываем следующие строчки
info@dom1.ru info1
info@dom2.ru info2

И почта, приходящая на info@dom1.ru, будет уходить на пользователя info1.

Еще одним применением этого файла является разнос пользователей по своим доменам. Если на машине, обслуживающей dom1.ru и dom2.ru заведен пользователь pupkin, то он сможет получать почту и как pupkin@dom1.ru и как pupkin@dom2.ru, что бы этого не не происходило, делаем так:
pupkin@dom2.ru error:nouser No such user

и теперь при попытке принять почту на pupkin@dom2.ru sendmail будет отказывать в приеме почты отправляющемому.

Как вариант, этот же файл можно использовать для перенаправления почты:
pupkin@dom1.ru pupk

Теперь почта на pupkin@dom1.ru будет ложиться в почтовый ящик пользователя pupk. т.к. у меня один домен, то этот файл у меня пустой.

И еще один файл /etc/mail/local-host-names. В него вписываем все названия и указываем почтовый домен который sendmail должен будет обслуживать. Например:
domain.ru
mail.domain.ru

т.е. sendmail будет принимать почту @domain.ru

Теперь займемся нашим конфигурационным файлом mail.domain.ru.mc

У меня он имеет такой вид:
divert(-1)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.29 2003/12/24 21:15:09 gshapiro Exp $')
OSTYPE(freebsd5)
DOMAIN(generic)
FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
define(`confCW_FILE', `-o /etc/mail/local-host-names')
MAIL_FILTER(`drweb-filter', `S=inet:3001@localhost, F=T, T=C:1m;S:5m;R:5m;E:1h')
define(`confINPUT_MAIL_FILTERS', `drweb-filter')
define(`confMILTER_LOG_LEVEL',`6')
define(`confMAX_MESSAGE_SIZE', `10000000')
define(`confLOG_LEVEL', `10')
define(`confCOPY_ERRORS_TO','errormail')
define(`LUSER_RELAY',`local:errormail')
DAEMON_OPTIONS(`Name=IPv4, Family=inet')
define(`PROCMAIL_MAILER_PATH',`/usr/local/bin/procmail')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')
MAILER(local)
MAILER(smtp)
MAILER(procmail)

Объясню наиболее важные которые я сам побавлял.

11 строка определяет опции работы фильтра для drweb.
12 строка включает фильтр для drweb чтобы он мог проверять почту.
13 строка устанавливает количество выводимой информации фильтра в логи. Что удобно после отладки. Мне ведь нужны принципе только строки о поступлении и пересылке письма. Для разбора полета письма их вполне достаточно.
14 строка указывает максимальный размер письма которое будет принимать sendmail.
15 строка указывает количество выводимой информации работы sendmail в логии. 10 в принципе хватает но если возникают проблемы рекомендую ставить 15.
16,17 строки указывает какому пользователю перенаправлять письма с неправельными адресами, т.е. ошибочные письма нотправляются на юзера errormail.
18 указывает что бы использовались ip протокол v4 типо ХХХ.ХХХ.ХХХ.ХХХ.
19 указывает путь для сортировщика писем.
23 определяем параметры использования сортировщика.

делаем в каталоге /etc/mail/ в консоли:
#make
#make install

все пока с sendmail закончили.

Ставим теперь pop3 клиент для того чтобы пользователи могли получать почту. Идем в /usr/ports/mail/qpopper делаем
#make install clean

потом идем редактируем строку в файле /etc/idend.conf
pop3 stream tcp nowait root /usr/local/libexec/qpopper qpopper -s

там есть похожая строка я ее просто отредактировал.

Потом перезапускаем inetd
#killall -HUP inetd

или
#/etc/rc.d/inetd restart

можно проверить как работает qpopper
%telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK QPOP (version 4.0.8) at mail.domain.ru starting.
user erasha
+OK Password required for erasha.
pass ********
+OK erasha has 0 messages (0 octets).
quit
+OK Pop server at erasha.domain.ru signing off.
Connection closed by foreign host.
%

должно быть примерно так.

Теперь поставим fetchmail для забора почты с внешних ящиков. Идем в /usr/ports/mail/fetchmail делаем:
#make install clean

потом создаем каталог /etc/mailconf и в нем создаем файл
#touch fetchmailrc

Cменим ему права на безопасные.
#chmod 600 fetchmailrc

формат файла достаточно простой:
poll [имя_почтового_сервера] proto [почтовый_протокол] user [пользователь] pass [его-пароль] to [кому_локально_отдавать почту]

да скажу как примечание имя пользователя и пароль надо задавать в ковычках.

У меня примерно он вот такой:
set daemon 180
set logfile /var/log/fetchmail.log
poll pop.yandex.ru proto POP3 user "user1" pass "****" to user1
poll mail.mail.ru proto POP3 user "user2" pass "***" to user2

poll mail.domain.ru proto POP3 user "mail" pass "*******" mda "/usr/local/bin/procmail -m /etc/mailconf/procmailrc"

конечно вместо `*` вписаны пароли.

В первой строке указываем чтобы fetchmail запускался как daemon и проверял почту с интервалом в 180 сек. У кого мало оперативной памяти можно также запускать fetchmail с помощью крона, тогда эта строчка не нужна и создавать скрипт fetchmail.sh описаный чуть ниже нет необходимости, а в crontab дописываем
*/3 * * * * root /usr/local/bin/fetchmail -f /etc/mailconf/fetchmailrс

Во второй указал файл лога fetchmail.
В третий, четвертой собственно строки описания account-ов двух ящиков.
Последняя строка нужна для отправки писем сортировщику, более подробно описано ниже.

Потом в папке /usr/local/etc/rc.d создал файл fetchmail.sh
#touch fetchmail.sh

ставим права на него
#chmod 750 fetchmail.sh

в нем написал вот так:
#!/bin/sh
/usr/local/bin/fetchmail -f /etc/mailconf/fetchmailrс

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

Так теперь установим сортировщик писем, это особенно нужно если есть договоренность с провайдером что он все письма на опред. домен собирает в одном ящике. т.е. все письма *@domain.ru собираются на mail@provdomain.ru и их нужно потом рассортировать по юзерам.

Идем в /usr/ports/mail/procmail и делаем
#make install clean

потом идем в каталог /etc/mailconf и в нем создаем файл
#touch procmailrc

Cменим ему права на безопасные.
#chmod 600 procmailrc

у меня он такой:
LOGFILE=/var/log/procmail.log

:0
* ^To:.*erasha*
! erasha

:0
* ^To:.*user@domain.ru
! user

:0
* ^To:.*
! errormail

формат файла простой:
В начале я указал файл лога.
:0 это начало правила.
* ^To: означает проверку поля письма To.

Т.е. первое правило означает, что если в поле To заголовка письма есть erasha то это письмо отправляется юзеру erasha. Следующие означает, что если заголовок To заканчивается на user@domain.ru то это письмо отправлять юзеру user. Самым последним правилом я сделал чтобы письма на которых не сработало не одно правило отправлялось специальному юзеру, в противном случае письма уйдут root как ошибочные.

Строка в fetchmailrc
poll mail.provdomain.ru proto POP3 user "mail" pass "*******" mda "/usr/local/bin/procmail -m /etc/mailconf/procmailrc"

означает чтобы все письма с ящика mail@provdomain.ru направлялись сортировщику писем и обрабатывались по правилам указанным в файле /etc/mailconf/procmailr.
Почему я не положил конфигурационный файл procmail в домашний католог юзера, потому что этот конф будет вызываться кроме вызова fetchmail, но еще и при получении юзером писем, и если в правилах есть этот юзер, то при получении писем на этого юзера, письма будут впадать в цикл.

Если кому нужно более сложные правила, то в инете полно статей и описаний. Мне этого пока хватает.

Так теперь все готово для запуска почтового сервера запускаем
#/usr/local/etc/rc.d/fetchmail.sh

потом
#killall sendmail
#/usr/local/sbin/sendmail -bd -q30m

запустим sendmail как демон

или можете просто перезапустить комп

Обратите внимание если при запуске sendmail ругается примерно вот так:
Starting: sendmail 554 5.0.0 /etc/mail/sendmail.cf: line 1844: unknown configuration line " " sendmail-clientmqueue.

Это исправляется удаление пробела в начале строки номер 1844, т.е. открываем файл /etc/mail/sendmail.cf идем на строку 1844 и убираем пробел в начале этой строке, больше ничего не трогаем в этом файле, сохраняем его, потом в /etc/mail/ делаем
#make start

и получаем ответ:
Starting: sendmail sendmail-clientmqueue.

Означающий что sendmail запустился.

Да еще для юзеров я создал группу mailusers
#pw groupadd mailusers

а пользователей добавлял вот так
#pw useradd user -g mailusers -d /nonexistent -c "User name" -s /sbin/nologin

пароль доступа (устанавливал) менял вот так:
#passwd user

Почему я так делал? Потому что, чтобы юзера не могли войти в систему, а могли только проверять почту.

Теперь перейдем к установке drweb: идем в /usr/ports/security/drweb-sendmail и делаем
#make install clean

установится сам Drweb и милтер для sendmail.

Потом редактируем файл /usr/local/drweb/drweb32.ini Раскоментируем строки:
LngFileName = "/usr/local/drweb/lib/russian.dwl"

для вывода сообщений на русском. Укажим где лежит ключик
Key = "/usr/local/drweb/drweb32.key"

потом идем в папку /usr/local/etc/rc.d и создаем файл drweb-smf-client.sh
#touch drweb-smf-client.sh

ставим права на него
#chmod 750 drweb-smf-client.sh

с таким содержимым:
#!/bin/sh
/usr/local/drweb-sendmail/drweb-smf --conf=/usr/local/etc/drweb-sendmail/drweb_smf.conf

запускаем этот скрипт и
#00.drwebd.sh start

потом проверяем как у нас запустился drweb
#sockstat

если есть вот такие строчки
drweb drweb-smf 475 4 tcp4 127.0.0.1:3001 *:*
drweb drwebd 467 3 tcp4 127.0.0.1:3000 *:*

то drweb запустился вместе с фильтром.
такие строки говорят что sendmail запущен
root sendmail 701 4 tcp4 *:25 *:*
root sendmail 701 5 tcp4 *:587 *:*

а такая что запущен qpopper и поднят POP3
root inetd 512 4 tcp4 *:110 *:*

Для обновления антивирусных баз, если есть возможность, то можно использовать стандартный скрипт обновления в Drweb кторый находится в /usr/local/drweb/update/update.pl его можно добавить в cron и обновлять базы с периодичностью, по мне, 1 час в самый раз. Также есть в инете скрипты для обновления баз без ключей, если есть необходимость ищите.
Копирование всей почты на определенный ящик

И еще для тех кому необходимо организовывать корпоративные архивы почты, т.е. архив всех писем прошедших через sendmail (входящих и исходящих) вот как это делается.

В конец нашего конфигурационного файла mail.domain.ru.mc дописываем
define(`COPYMAIL_MAILBOX',`arvivmail@domain.ru')
MAILER(copymail)

где arhivmail@domain.ru адрес куда пересылать копии всех писем.

Потом создаем файл /usr/share/sendmail/cf/mailer/copymail.m4 вот с таким содержимым.
PUSHDIVERT(-1)

ifdef(`COPYMAIL_MAILBOX',,
`define(`COPYMAIL_MAILBOX', `postmaster')')
POPDIVERT

#########################################
### COPYMAIL Mailer specification ###
#########################################

VERSIONID(`$Id$')

LOCAL_CONFIG
D{COPYMAIL}COPYMAIL
C{CP}${COPYMAIL}

LOCAL_RULE_0
# Send all mail to copymail mailer
R$* < @ $+ . $~{CP} . > $#copymail $@ $2 . $3 . ${COPYMAIL} $: $1 @ $2 . $3 . ${COPYMAIL}
# if mail has been processed by copymail mailer, process it usual way...
R$* < @ $* . ${COPYMAIL} > $1 < @ $2 . >

# Send message to original recipient + additional mailbox: COPYMAIL_MAILBOX
Mcopymail, P=/usr/sbin/sendmail, F=fmSDFMu, S=0, R=0,
A=sendmail -N never COPYMAIL_MAILBOX.${COPYMAIL} $u

потом идем в /usr/mail делаем
#make
#make install
#make stop
#make start

и если последняя команда не выдала ошибок значит все ок. Спросите почему не make restart, потому что с ошибочным cf файлом sendmail не перезапускается и не выдает ошибку, вообще не чего не выдает.

http://wiki.bsdportal.ru/doc:sendmail_drweb_agent

Обновлено: 12.03.2015