Установка и настройка Exim в NetBSD
Содержание
Установка пакета
Перед установкой пакета exim, содержащего SMTP-сервер, пропишем в файле /etc/mk.conf опции пакета, которые нам понадобятся и отключим ненужные:
PKG_OPTIONS.exim= exim-tls exim-auth-dovecot exim-content-scan spf -exim-appendfile-maildir -exim-appendfile-mailstore -exim-appendfile-mbx -exim-lookup-dsearch -exim-old-demime -exim-tcp-wrappers -inet6
Установим пакет exim, содержащий SMTP-сервер:
# cd /usr/pkgsrc/mail/exim
# make install
Первоначальная настройка
Прежде чем приступить к настройке, переименуем имеющийся файл /usr/pkg/etc/exim/configure:
# cd /usr/pkg/etc/exim/
# mv configure configure.example
Создадим на месте переименованного файла новый файл конфигурации со следующим содержимым:
# Имя нашей почтовой системы
primary_hostname = mail.stupin.su
# Список доменов нашей почтовой системы
domainlist local_domains = /usr/pkg/etc/exim/local_domains
# Список доменов, для которых наша почтовая система является резервной
domainlist relay_domains = /usr/pkg/etc/exim/relay_domains
# Список узлов, почту от которых будем принимать без проверок
hostlist relay_from_hosts = localhost
# Список почтовых ящиков, использующихся только для отправки писем
addresslist noreply_addresses = /usr/pkg/etc/exim/noreply_addresses
# Список узлов, письма от которых не принимаем
hostlist spammers_hosts = /usr/pkg/etc/exim/spammers_hosts
# Правила для проверок
acl_not_smtp = acl_check_not_smtp
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
# Отключаем IPv6, слушаем порты 25 и 587
disable_ipv6
daemon_smtp_ports = 25 : 587
# Дописываем домены отправителя и получателя, если они не указаны
qualify_domain = stupin.su
qualify_recipient = stupin.su
# Exim никогда не должен запускать процессы от имени пользователя root
never_users = root
# Проверять прямую и обратную записи узла отправителя по DNS
host_lookup = *
# Отключаем проверку пользователей узла отправителя по протоколу ident
rfc1413_hosts = *
rfc1413_query_timeout = 0s
# Только эти узлы могут не указывать домен отправителя или получателя
sender_unqualified_hosts = +relay_from_hosts
recipient_unqualified_hosts = +relay_from_hosts
# Лимит размера сообщения, 30 мегабайт
message_size_limit = 30M
# Запрещаем использовать знак % для явной маршрутизации почты
percent_hack_domains =
# Настройки обработки ошибок доставки, используются значения по умолчанию
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
# Включить расширение SMTP 8BITMIME для приёма 8-битных писем, не кодированных в
# 7-битную кодировку Quoted Printable (используется по умолчанию)
accept_8bitmime = yes
# Возвращать в рикошете тело сообщения (используется по умолчанию)
bounce_return_body = yes
# Ограничить размер тела сообщения в рикошете 100 килобайтами (используется по умолчанию)
bounce_return_size_limit = 100K
# Задаёт адрес отправителя рикошетов (по умолчанию - пусто)
bounce_sender_authentication = mailer-daemon@stupin.su
# Если получатель рикошета попытается на него ответить, ответ уйдёт на этот адрес
errors_reply_to = postmaster@stupin.su
begin acl
# Проверки для локальных отправителей
acl_check_not_smtp:
accept
# Проверки на этапе RCPT
acl_check_rcpt:
accept hosts = :
# Отклоняем неправильные адреса почтовых ящиков
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# Отклоняем неправильные адреса почтовых ящиков
deny message = Restricted characters in address
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
# В локальные ящики postmaster и abuse принимает почту всегда
accept local_parts = postmaster : abuse
domains = +local_domains
# Проверяем существование домена отправителя
require verify = sender
# Не принимаем письма от узлов, замеченных в отправке только спама
deny message = Your IP was blocked due spam. You may contact with postmaster anyway
hosts = +spammers_hosts
# Не принимаем письма для почтовых ящиков, предназначенных только для отправки писем
deny message = No reply mailbox
recipients = +noreply_addresses
# Принимаем почту от доверенных узлов, попутно исправляя заголовки письма
accept hosts = +relay_from_hosts
control = submission
# Принимаем почту от аутентифицированных узлов, попутно исправляя заголовки письма
accept authenticated = *
control = submission/domain=
# Принимаем почту для доменов, для которых наш сервер является запасным
accept domains = +relay_domains
# Проверяем почту для существующих получателей из обслуживаемых нами доменов
accept domains = +local_domains
verify = recipient/callout=no_cache
# Всю остальную почту отклоняем
deny message = Relay not permitted
acl_check_data:
accept
begin routers
# Поиск транспорта для удалённых получателей
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
# Пересылки для локальных получателей из файла /etc/mail/aliases
system_aliases:
driver = redirect
allow_fail
allow_defer
domains = stupin.su
data = ${lookup{$local_part}lsearch{/etc/mail/aliases}}
# Пересылки для получателей в разных доменах
aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part@$domain}lsearch{/usr/pkg/etc/exim/aliases}}
# Получение почты на локальный ящик
mailbox:
driver = manualroute
route_list = "* mda.vm.stupin.su byname"
domains = +local_domains
transport = dovecot_lmtp
begin transports
# Транспорт для удалённых получателей
remote_smtp:
driver = smtp
# Транспорт для локальных получателей из Dovecot
dovecot_lmtp:
driver = smtp
rcpt_include_affixes
protocol = lmtp
port = 24
begin retry
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin rewrite
begin authenticators
В этом файле настроена базовая почтовая система, которая:
- умеет принимать почту для почтовых ящиков своих доменов и передавать её LMTP-серверу,
- пересылать почту для получаетелей из доменов, для которых наш сервер является запасным,
- отправлять почту, принятую без аутентификации с адреса localhost.
Пока что эта почтовая система не умеет принимать письма от аутентифицированных пользователей, проверять письма на вирусы, проверять и добавлять DKIM-подписи, проверять отправителей по SPF-записям, временно отказывать в приёме писем от узлов-отправителей, замеченных в публичных чёрных списках. Все эти настройки мы добавим позже.
Использованные материалы:
Списки доменов, узлов, адресов
В каталоге конфигурации сервера /etc/pkg/etc/exim есть несколько файлов со списками доменов, узлов и адресов.
Список локальных доменов, для получателей в которых наш сервер будет принимать письма:
mta# cat local_domains
stupin.su
kuramshin.me
Список доменов, для которых наш сервер будет выступать в роли запасного и будет принимать письма для передачи основному серверу, когда тот снова появится в сети:
mta# cat relay_domains
Список профессиональных рассыльщиков спама, которые обходят все проверки:
mta# cat spammers_hosts
91.235.233.0/24
91.239.215.0/24
91.247.220.0/24
193.105.174.0/24
37.187.19.13
Список почтовых ящиков, которые используются только для отправки писем:
mta# cat noreply_addresses
zabbix@stupin.su
rss@stupin.su
redmine@stupin.su
wordpress@kuramshin.me
Первый запуск сервера
Копируем пример скрипта управления Exim в соответствующий каталог:
mta# cp /usr/pkg/share/examples/rc.d/exim /etc/rc.d/
Заменяем файл с настройками используемых почтовых программ:
mta# mv /etc/mailer.conf /etc/mailer.conf.bak
mta# cp /usr/pkg/share/examples/exim/mailer.conf /etc/
Отключаем в файле /etc/rc.conf установленный по умолчанию почтовый сервер Postfix, включаем установленный нами Exim:
postfix=NO
exim=YES
Запускаем Exim:
mta# /etc/rc.d/exim start
Starting exim.
Смотрим список открытых на прослушивание портов:
mta# netstat -anf inet
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *.587 *.* LISTEN
tcp 0 0 *.25 *.* LISTEN
tcp 0 0 169.254.252.13.22 169.254.252.1.40224 ESTABLISHED
tcp 0 0 *.22 *.* LISTEN
Видим, что порты 25 и 587 прослушиваются.
Проверка доставки писем
Попробуем проверить доставку писем, попытавшись отправить его с самого SMTP-сервера. Для этого воспользуемся telnet. Подключимся локально к 25 порту TCP:
mta# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.stupin.su ESMTP Exim 4.94 Wed, 09 Dec 2020 16:03:29 +0500
Отправим серверу приветственное сообщение:
EHLO mail.stupin.su
250-mail.stupin.su Hello localhost [127.0.0.1]
250-SIZE 31457280
250-8BITMIME
250-PIPELINING
250-X_PIPE_CONNECT
250-CHUNKING
250-STARTTLS
250 HELP
Сообщим адрес отправителя, от имени которого собираемся отправить письмо:
MAIL FROM: vladimir@stupin.su
250 OK
Сообщим адрес получателя, которому хотим отправить письмо:
RCPT TO: vladimir@stupin.su
250 Accepted
Передаём команду DATA, сообщающую о нашем намерении передать заголовки и тело самого письма:
DATA
354 Enter message, ending with "." on a line by itself
Вводим заголовки и текст письма, завершив их строкой с одной точкой:
test
TEST
.
250 OK id=1kmxG9-0000ue-87
Сервер сообщил, что принял письмо к доставке. Передаём серверу команду QUIT для отключения:
QUIT
221 mail.stupin.su closing connection
Connection closed by foreign host.
Теперь можно зайти на виртуальную машину с Dovecot, перейти в каталог с новыми письмами:
mda# cd /var/vmail/stupin.su/vladimir/new
Смотрим список имеющихся писем:
mda# ls
1607509268.M720210P776.mda.vm.stupin.su,S=287,W=299
1607511835.M488752P1244.mda.vm.stupin.su,S=678,W=698
Первое письмо осталось после проверки работоспособности LMTP-сервера, посмотрим содержимое второго:
mda# less 1607511835.M488752P1244.mda.vm.stupin.su,S\=678,W\=698
Убеждаемся, что это только что отправленное нами письмо:
Return-Path: <vladimir@stupin.su>
Delivered-To: vladimir@stupin.su
Received: from mail.stupin.su ([169.254.252.13])
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))
by mda.vm.stupin.su with LMTPS
id 71KlGhuv0F/cBAAAfuT4vQ
(envelope-from <vladimir@stupin.su>)
for <vladimir@stupin.su>; Wed, 09 Dec 2020 16:03:55 +0500
Received: from localhost ([127.0.0.1] helo=mail.stupin.su)
by mail.stupin.su with esmtp (Exim 4.94)
(envelope-from <vladimir@stupin.su>)
id 1kmxG9-0000ue-87
for vladimir@stupin.su; Wed, 09 Dec 2020 16:03:54 +0500
Message-Id: <E1kmxG9-0000ue-87@mail.stupin.su>
From: vladimir@stupin.su
Date: Wed, 09 Dec 2020 16:03:52 +0500
test
TEST
Очистка очереди доставки
Смотрим список писем, застрявших в очереди:
$ mailq
Размораживаем все замороженные письма:
$ exiqgrep -i | xargs exim -Mt
Пытаемся доставить письма из очереди прямо сейчас:
$ exim -q
Удаляем все письма из очереди:
$ exiqgrep -i | xargs exim -Mrm
При наличии заблокированных сообщений можно узнать идентификаторы процессов, пытающихся доставить их:
$ exiwhat
Затем можно принудительно завершить выполнение этих процессов, указав их идентификаторы команде kill
, после чего можно попробовать снова удалить сообщения из очереди.
Настройка грейлистинга
Для грейлистинга воспользуемся демоном greylistd
, написанном на Python. Этот демон не настолько сложен, как milter-greylist
, которым я воспользовался для настройки грейлистинга в Postfix, однако его простота с лихвой компенсируется возможностями Exim. К сожалению, в pkgsrc нет greylistd, поэтому пришлось подготовить его самостоятельно.
Установим пакет greylistd:
# cd /usr/pkgsrc/mail/greylistd
# make install
Для запуска greylistd я воспользовался daemontools так, как это описано в статье Запуск greylistd в NetBSD с помощью daemontools.
greylistd предоставляет механизм, а политику можно определить в конфигурации Exim. Я придерживаюсь политики подвергать грейлистингу те узлы, которые оказались в чёрном списке. Для того, чтобы включить грейлистинг, нужно в самый конец списка управления доступом acl_check_rcpt
до финального правила deny
добавить следующую проверку:
defer message = Greylisting in action, try later
!senders = :
!hosts = ${if exists{/usr/pkg/etc/greylistd/whitelist-hosts}\
{/usr/pkg/etc/greylistd/whitelist-hosts}{}} : \
${if exists{/var/db/greylistd/whitelist-hosts}\
{/var/db/greylistd/whitelist-hosts}{}}
dnslists = zen.spamhaus.org
condition = ${readsocket{/var/run/greylistd.sock}\
{--grey $sender_host_address $sender_address $local_part@$domain}\
{5s}{}{false}}
В поле !senders
можно прописать адреса тех отправителей, которые не должны подвергаться грейлистингу. Соответственно, чтобы узел с определённым IP-адресом не подвергался грейлистингу, его можно добавить в файл /usr/pkg/etc/greylistd/whitelist-hosts
.
Включим пользователя mail в группу greylist, чтобы Exim имел доступ к сокету и файлам greylistd
:
# usermod -G greylist mail
Осталось попросить Exim перезагрузить файл конфигурации, чтобы новые настройки вступили в силу:
# /etc/rc.d/exim4 reload