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

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


mailserver

Розбіжності

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

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

Наступна ревізія
Попередня ревізія
mailserver [2013/11/08 10:45] – створено wombatmailserver [2020/05/20 18: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  -                               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
 +