Користувальницькькі налаштування

Налаштування сайту


mailserver

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Наступна ревізія
Попередня ревізія
mailserver [2013/11/08 12:45]
wombat створено
mailserver [2020/05/20 21:59] (поточний)
wombat [Фильтрация спама]
Рядок 1: Рядок 1:
 +====== MTA ======
 +
 +===== Postfix =====
 +
 +В отлиие от sendmail, Postfix умеет хранить входящую почту в папках формата [[https://​en.wikipedia.org/​wiki/​Maildir | Maildir]]. Это может быть полезным для установки [[mailserver#​sqwebmail|веб-интерфейса]] к почтовому серверу без вспомогательного IMAP-сервера.
 +
 +http://​www.postfix.org/​features.html
 +
 +=== Ограничение скорости отправки писем ===
 +
 +Антиспам-системы многих сервисов проводят контроль скорости отправки электронной почты. Поэтому когда Postfix отправляет письма "​слишком быстро",​ его могут заблокировать из-за подозрения в рассылке спама. Чтобы этого избежать,​ нужно установить следующие ограничения в файле настроек
 +
 +<file cf '/​etc/​postfix/​main.cf'>​
 +...
 +#​default_destination_concurrency_limit=2
 +#​default_destination_rate_delay=1m
 +#​default_destination_concurrency_limit=2
 +#​mlmmj_destination_rate_delay=0s
 +smtp_destination_concurrency_limit=2
 +smtp_destination_rate_delay=10m
 +</​file>​
 +
 +=== Просмотр и очистка очереди ===
 +
 +  sudo postqueue -p
 +
 +  sudo postsuper -d 95E0AA21E68
 +
 +где ''​95E0AA21E68''​ -- это уникальный номер письма в очереди (показывается командой ''​postqueue -p''​)
 +
 +Для удаления **всех** писем в очереди можно задать команду:​
 +  ​
 +  sudo postsuper -d ALL
 +
 +Для удаления только **отложенных** писем из очереди:​
 +
 +  sudo postsuper -d  ALL deferred
 +
 +
 +==== Самодельный транспорт ====
 +
 +В файле конфигурации Postfix ''/​etc/​postfix/​master.cf''​ перечислен список и параметры так называемых "​транспортов"​ для сообщений разного типа. В этот список можно добавить и свой собственный транспорт. Рассмотрим на примере обычного bash-скрипта,​ который будет изменять заголовок письма ''​From:''​.
 +
 +Сначала нужно указать Postfix расположение файла, в котором будут перечислены наши транспорты. Это указывается в файле ''/​etc/​postfix/​main.cf''​((http://​www.postfix.org/​postconf.5.html#​transport_maps)):​
 +
 +<file bash "/​etc/​postfix/​main.cf">​
 +transport_maps = hash:/​home/​user/​mytransports
 +</​file>​
 +
 +Теперь нужно создать собственно сам файл с перечислением наших дополнительных транспортов. Его формат выглядит примерно так:
 +
 +<file ''​ "/​home/​user/​mytransports">​
 +abonent1@server.com ​   transport1:​parameter1
 +abonent2@server.com ​   transport1:​parameter2
 +abonent3@server.com ​   transport2:​parameter1
 +abonent4@server.com ​   discard
 +abonent5@server.com ​   transport1:​parameter1
 +</​file>​
 +
 +В этом файле указываетя,​ каким из транспортов доставлять письма,​ **ПРИ**шедшие на тот или иной адрес нашего сервера. ''​transport1''​ и ''​transport2''​ здесь просто названия наших транспортов. Они могут быть любые, и цифры в них совсем не обязательны. ''​parameter1''​ и ''​parameter2''​ -- это параметры,​ которые будут переданы нашему транспорту в виде аргумента. Как видно, они могут быть одинаковыми или разными для разных адресов -- в зависимости от задачи. ''​discard''​ здесь -- один из встроенных транспортов Postfix, который попросту выбрасывает письмо и делает вид, что успешно его доставил. Т.е. все письма,​ приходящие в такой конфигурации на адрес ''​abonent4@server.com''​ будут молча удаляться.
 +
 +После создания или изменения этого файла, необходимо сконвертировать его в формат базы данных,​ которую сможет читать Postfix:
 +
 +  postmap mytransports
 +
 +При этом появится (или обновится,​ если уже был) файл ''​mytransports.db''​.
 +
 +Теперь,​ когда мы придумали название транспорта и указали,​ какие письма через него нужно проводить,​ нужно описать этот транспорт в файле ''/​etc/​postfix/​master.cf'':​
 +
 +<file bash "/​etc/​postfix/​master.cf">​
 +transport1 ​   unix    -    n    n    -    -    pipe 
 +    flags=ORhu user=myuser argv=/​home/​user/​from-filter1.sh $nexthop
 +
 +transport2 ​   unix    -    n    n    -    -    pipe 
 +    flags=ORhu user=myuser argv=/​home/​user/​from-filter2.sh $nexthop
 +</​file>​
 +
 +Здесь названия транспортов ''​transport1''​ и ''​transport2''​ должны точно совпадать с теми, которые мы описали в файле транспортов ''/​home/​user/​mytransports'',​ имя пользователя ''​myuser''​ -- это системный пользователь,​ от имени которого будет запущен скрипт ''/​home/​user/​from-filter1.sh''​. Переменная ''​nexthop''​ хранит значение того параметра,​ который мы указывали в нашем файле транспортов (''​parameter1'',​ ''​parameter2''​ и т.п.). Поскольку тип транспорта здесь указан как ''​pipe'',​ письмо будет передано нашему скрипту в стандартный ввод. И обрабатывать его в теле скрипта нужно с учётом этого.
 +
 +Пример такого скрипта,​ который заменяет поле ''​From:''​ приведён ниже:
 +
 +<file bash "/​home/​user/​from-filter1.sh">​
 +#!/bin/bash
 +
 +NEXTHOP=$@
 +
 +TEMPFILE=`tempfile`
 +
 +# Если передан параметр "​parameter1"​
 +# (что соответствует в нашем примере письмам,​ пришедшним НА адреса
 +# abonent1@server.com и abonent5@server.com
 +if [ $NEXTHOP == "​parameter1"​ ]
 +then
 +    while IFS= read -r LINE;
 +    do
 +        if [[ $LINE == From:* ]]
 +        then
 +            # Заменим строку отправителя так, чтобы его адрес был <​parameter1@server.com>​
 +            printf '​%s\n'​ "​$LINE"​ | sed -e '​s/"//​g'​ | sed -e '​s/​^From:​ \(.*\)/​From:​ "​\1"​ <​parameter1@server.com>/'​ >> ${TEMPFILE}
 +        else
 +            printf '​%s\n'​ "​$LINE"​ >> ${TEMPFILE}
 +        fi
 +    done
 +
 +
 +
 +# Если передан параметр "​parameter2"​
 +# (что соответствует в нашем примере письмам,​ пришедшним НА адрес
 +# abonent2@server.com
 +elif [ $NEXTHOP == "​parameter2"​ ]
 +then
 +    while IFS= read -r LINE;
 +    do
 +        if [[ $LINE == From:* ]]
 +        then
 +            # Заменим строку отправителя так, чтобы его адрес был <​parameter2@server.com>​
 +            printf '​%s\n'​ "​$LINE"​ | sed -e '​s/"//​g'​ | sed -e '​s/​^From:​ \(.*\)/​From:​ "​\1"​ <​parameter2@server.com>/'​ >> ${TEMPFILE}
 +        else
 +            printf '​%s\n'​ "​$LINE"​ >> ${TEMPFILE}
 +        fi
 +    done
 +
 +
 +# Во всех остальных случаях просто скопируем письмо без изменений во временный файл
 +else
 +    cat - > ${TEMPFILE}
 +fi
 +
 +# Здесь любое действие с полученным и обработанным письмом
 +# Например,​ передача его в один из списков рассылки mlmmj:
 +cat ${TEMPFILE} | /​usr/​bin/​mlmmj-receive -F -L /​var/​spool/​mlmmj/​$NEXTHOP
 +
 +rm ${TEMPFILE}
 +</​file>​
 +
 +Разумеется,​ права на запуск этого скрипта должны быть у системного пользователя ''​myuser'',​ которого мы указали в файле ''/​etc/​postfix/​master.cf''​ выше.
 +
 +После всех этих манипуляций с транспортами,​ нужно перезагрузить конфигурацию Postfix:
 +
 +  sudo /​etc/​init.d/​postfix reload
 +
 +
 +
 +
 +==== SASL-аутентификация ====
 +
 +Для того, чтобы Postfix принимал письма для дальнейшей пересылки с других компьютеров (например,​ с нашего же домашнего почтового клиента),​ нужно обеспечить аутентификацию пользователей,​ так как без неё он будет либо принимать письма ото всех подряд,​ либо ни от кого.
 +
 +Инструкция по настройке SASL-аутентификации находится здесь: http://​www.postfix.org/​SASL_README.html
 +
 +Сначала надо проверить,​ какие реализации SASL поддерживает Postfix в нашей системе:​
 +
 +  sudo postconf -a
 +  cyrus
 +  dovecot
 +
 +Видим, что их две: ''​cyrus''​ и ''​dovecot''​. Далее будем рассматривать вариант с ''​cyrus''​.
 +
 +Установим необходимые библиотеки и инструменты. В Debian это:
 +
 +  sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin libsasl2-modules-db
 +
 +Запустим службу аутентификации и проверим на подлинность какого-либо пользователя,​ имеющегося в системе:​
 +
 +  sudo systemctl -l restart saslauthd
 +  sudo testsaslauthd -u username -p password
 +  0: OK "​Success."​
 +
 +Если видим надпись ''​OK "​Success."'',​ значит,​ служба запущена,​ отвечает на запросы и выполняет проверки.
 +
 +Далее нужно внести изменения в настройки самого Postfix:
 +
 +<file conf /​etc/​postfix/​main.cf>​
 +smtp_tls_security_level = may
 +smtp_tls_cert_file = /​etc/​ssl/​certs/​mymailserver.cert
 +smtp_tls_key_file = /​etc/​ssl/​private/​mymailserve.key
 +smtp_tls_note_starttls_offer = yes
 +smtpd_tls_security_level = may
 +smtpd_tls_cert_file = /​etc/​ssl/​certs/​mymailserver.cert
 +smtpd_tls_key_file = /​etc/​ssl/​private/​mymailserver.key
 +
 +smtpd_sasl_auth_enable = yes
 +smtpd_sasl_type = cyrus
 +smtpd_sasl_path = smtpd
 +broken_sasl_auth_clients = yes
 +smtpd_sasl_security_options = noplaintext,​ noanonymous
 +smtpd_sasl_tls_security_options = noanonymous
 +smtpd_sender_login_maps = hash:/​etc/​postfix/​controlled_envelope_senders
 +smtpd_relay_restrictions = permit_mynetworks,​
 +                           ​reject_sender_login_mismatch, ​
 +                           ​permit_sasl_authenticated, ​
 +                           ​defer_unauth_destination
 +
 +</​file>​
 +
 +Если мы хотим проверять подлинность пользователей,​ указанных в базе данных ''/​etc/​sasldb2'',​ в файле ''/​etc/​postfix/​sasl/​smtpd.con''​ указываем метод ''​auxprop''​ с плагином ''​sasldb'':​
 +
 +<file conf /​etc/​postfix/​sasl/​smtpd.conf> ​
 +#​pwcheck_method:​ saslauthd
 +#mech_list: PLAIN LOGIN
 +
 +pwcheck_method:​ auxprop
 +auxprop_plugin:​ sasldb
 +mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
 +</​file>​
 +
 +Редактировать базу данных ''/​etc/​sasldb2''​ можно при помощи команды ''​saslpasswd2'':​
 +
 +  sudo saslpasswd2 -c -u mydomain.com username
 +
 +Просмотреть список всех пользователей в базе можно командой:​
 +  sudo sasldblistusers2
 +
 +Далее необходимо обеспечить доступ Postfix к этой базе для проверки. Для этого нужно сменить группу -владельца этого файла и добавим Postfix в эту группу:​
 +  sudo chown :sasl /​etc/​sasldb2
 +  sudo usermod -a -G sasl postfix
 +
 +<note important>​Важно заметить,​ что именем пользователя при такой проверке является полное выражение вида ''​username@mydomain.com'',​ а не просто ''​username''​.</​note>​
 +  ​
 +Далее, мы, вероятно,​ хотим, чтобы Postfix не позволял пользователям (даже зарегистрированным) указывать посторонние адреса в поле ''​From:''​ отправляемых писем. Для этого мы ограничим возможности пользователя в указании своего адреса,​ и укажем,​ кто каким адресом имеет право пользоваться.
 +
 +В конфигурации Postfix этому соответствуют параметр ''​reject_sender_login_mismatch''​ и путь к файлу-таблице,​ содержащему соответствие пользователей и адресов ''​smtpd_sender_login_maps''​. В этот файл нужно внести в первую колонку - адрес пользователя,​ указанный им в письме,​ а во вторую колонку -- имя этого пользователя в базе SASL:
 +
 +<file conf /​etc/​postfix/​controlled_envelope_senders>​
 +# envelope sender ​          ​owners (SASL login names)
 +john@example.com ​           john@example.com
 +helpdesk@example.com ​       john@example.com,​ mary@example.com
 +postmaster ​                 admin@example.com
 +@example.net ​               barney, fred, john@example.com,​ mary@example.com
 +</​file>​
 +
 +Далее нужно преобразовать эту таблицу из простого текстового файла в базу данных:​
 +
 +  cd /​etc/​postfix/​
 +  sudo postmap controlled_envelope_senders
 +
 +И наконец,​ можно перезапустить Postfix с новыми настройками и посмотреть,​ что вышло:
 +
 +  sudo postfix reload
 +
 +Теперь можно проверить,​ принимает ли сервер подключения и предоставляет возможности SSL-аутентификации ((пример взят отсюда:​ http://​www.postfix.org/​SASL_README.html#​server_test))
 +
 +  telnet ​ server.example.com 25
 +  ...
 +  220 server.example.com ESMTP Postfix
 +  EHLO client.example.com
 +  250-server.example.com
 +  250-PIPELINING
 +  250-SIZE 10240000
 +  250-ETRN
 +  250-AUTH DIGEST-MD5 PLAIN CRAM-MD5
 +  250 8BITMIME
 +  AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
 +  235 Authentication successful
 +
 +Причём эти строки вводятся со стороны клиента:​
 +  EHLO client.example.com
 +  AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
 +
 +Если сервер отвечает на указанном порту и показывает доступные методы аутентификации,​ значит,​ всё настроено правильно.
 +
 +
 +
 +====== Фильтрация спама ======
 +
 +Для осуществления фильтрации почты можно установить программу [[http://​www.courier-mta.org/​maildrop/​ | Maildrop]].
 +
 +Фильтры этой программы настраиваются в файле ''/​etc/​courier/​maildroprc''​. Например:​
 +
 +<file bash "/​etc/​courier/​maildroprc">​
 +if (/​^X-Spam-Status:​.*YES.*/​)
 +{
 +  exception {
 +    to "​Maildir/​.SPAM/"​
 +  }
 +}
 +</​file>​
 +
 +Такой фильтр будет доставлять все письма,​ в заголовке которых поле ''​X-Spam-Status:''​ содержит слово "''​YES''",​ в подпапку ''​SPAM''​ в почтовом каталоге пользователя. Такой заголовок письма может выставлять какая-либо служба проверки почты. Например,​ [[https://​spamassassin.apache.org/​|SpamAssassin]].
 +
 +Для того, чтобы почтовый сервер Postfix пропускал все письма через фильтры Maildrop, нужно внести следующие изменения в конфигурацию Postfix((http://​www.postfix.org/​MAILDROP_README.html)):​
 +
 +<file bash "/​etc/​postfix/​main.cf">​
 +    maildrop_destination_recipient_limit = 1
 +    virtual_mailbox_domains = some.domain someother.domain
 +    virtual_transport = maildrop
 +    virtual_mailbox_maps = hash:/​etc/​postfix/​virtual_mailbox
 +    virtual_alias_maps = hash:/​etc/​postfix/​virtual_alias
 +</​file>​
 +
 +<file bash "/​etc/​postfix/​virtual_mailbox">​
 +    user1@some.domain ​       ...text here does not matter...
 +    user2@some.domain ​       ...text here does not matter...
 +    user3@someother.domain ​  ​...text here does not matter...
 +</​file>​
 +
 +<file bash "/​etc/​postfix/​virtual_alias">​
 +    postmaster@some.domain ​          ​postmaster
 +    postmaster@someother.domain ​     postmaster
 +</​file>​
 +
 +<file bash "/​etc/​postfix/​master.cf">​
 +maildrop ​ unix  -       ​n ​      ​n ​      ​- ​      ​- ​      pipe
 +      flags=ODRhu user=vmail argv=/​path/​to/​maildrop -d ${recipient}
 +</​file>​
 +
 +Если же требуется всего лишь фильтрация писем, доставляемых в папки локальных пользователей (у которых есть учётная запись в операционной системе),​ можно не изменять конфигурации Postfix, а просто записать в файл ''​~/​.forward''​ такую строку (включая кавычки!):​
 +
 +<file bash "​~/​.forward">​
 +"​|/​usr/​bin/​maildrop -d ${USER}"​
 +</​file>​
 +
 +
 +=== SpamAssassin ===
 +
 +== Установка ==
 +
 +В Debian GNU/Linux нужно установить пакеты [[https://​packages.debian.org/​stable/​mail/​spamassassin | spamassassin]] и [[https://​packages.debian.org/​stable/​mail/​spamc | spamc]].
 +
 +== Настройка ==
 +
 +Чтобы письма,​ доставляемые в папки локальных пользователей дополнительно проходили проверку службой SpamAssassin,​ файл ''​~/​.forward''​ должен иметь следующее содержание:​
 +
 +<file bash "​~/​.forward">​
 +"​|/​usr/​bin/​spamc|/​usr/​bin/​maildrop -d ${USER}"​
 +</​file>​
 +
 +
 +Если spamc будет выдавать в логи такую ошибку:​
 +
 +  spamc[17863]:​ connect to spamd on ::1 failed, retrying (#1 of 3): Connection refused
 +
 +то устранить её можно, создав следующий файл((https://​www.linuxquestions.org/​questions/​linux-server-73/​spamassassin-trouble-4175503795/#​post5163972)):​
 +
 +<file conf /​etc/​mail/​spamassassin/​spamc.conf>​
 +-d 127.0.0.1
 +</​file>​
 +
 +
 +====== Фильтр исходящей почты ======
 +
 +http://​www.postfix.org/​FILTER_README.html
 +
 +
 +====== IMAP ======
 +
 +http://​wiki2.dovecot.org/​
 +
 +http://​wiki2.dovecot.org/​QuickConfiguration
 +
 +http://​www.brennan.id.au/​12-Sendmail_Server.html
 +
 +====== Web-интерфейс ======
 +
 +http://​www.squirrelmail.org/​about/​
 +
 +
 +===== SqWebmail =====
 +
 +http://​www.courier-mta.org/​sqwebmail/​
 +
 +https://​lists.debian.org/​debian-user/​2002/​11/​msg03898.html
 +
 +  cd /​srv/​www/​cgi-bin/​
 +  ln -s /​usr/​lib/​cgi-bin/​sqwebmail
 +  cd /srv/www
 +  ln -s /​usr/​share/​sqwebmail
 +
 +
 +====== SPF ======
 +
 +http://​www.openspf.org/​
 +
 +http://​www.openspf.org/​FAQ/​Common_mistakes
 +
 +http://​serverfault.com/​questions/​369460/​what-are-spf-records-and-how-do-i-configure-them
 +
 +====== Ссылки ======
 +
 +http://​xmodulo.com/​mail-server-ubuntu-debian.html
 +
 +https://​www.linode.com/​docs/​email/​running-a-mail-server
 +
 +https://​wiki.debian.org/​Postfix
 +
 +http://​www.postfix.org/​documentation.html
 +
 +===== Greylisting =====
 +
 +http://​www.ukr.net/​mta/​std3.html
 +
 +https://​www.fsf.org/​about/​systems/​greylisting
 +