====== Postfix ====== ====== Установка ====== apt install postfix postfix-ldap ====== Настройка ====== По умолчанию, Postfix пытается посылать почту в напрямую используя, запросы к [[dns:dns|]], в частности записи типа MX. |''relay_domains''|список доменов, на которые разрешена пересылка писем| |''relayhost''|имя и порт сервера для пересылка на него писем| Если имя заключено в квадратные скобки [] — то Postfix не предпринимает попытку поиска записей типа MX. ===== OpenLDAP ===== [[openldap:openldap|OpenLDAP]] :!: Схема Postfix не совместима с схемой [[openldap:openldap#Misc|Misc]] {{:postfix:postfix.ldif|postfix.ldif}} dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: mailRoutingAddress eq ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/postfix.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f olcDbIndex_postfix.ldif ---- [[http://ldapadmin.org/docs/postfix.schema|postfix.schema]] ===== Псевдонимы ===== Для псевдонимов (Aliases) требуется инициализации БД (файл срасширением ''.db'') ^Файл^Команда^ |''/etc/aliases''|newaliases| :!: Если возникает ошибка postfix: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled Нужно установить переменную: alias_maps = hash:/etc/aliases ===== Маскарад адресов ===== Address masquerading Замена одного домена или адреса другим, удобно использовать, если нужно скрыть внутренние домены при отправке почты на внешние адреса. smtp_generic_maps = hash:/etc/postfix/generic @foo.example.com @example.com Компиляция ''generic.db'': postmap /etc/postfix/generic [[http://www.postfix.org/ADDRESS_REWRITING_README.html#generic|Postfix Address Rewriting]] ===== Размер сообщения ===== message_size_limit = 30720000 Задается в Байтах, значение по умолчанию ''10240000'' ===== Копирование всей почты ===== Отправка скрытых копий всех писем (Blind carbon copy) на определенный адрес. receive_override_options = no_address_mappings always_bcc = bcc@localhost.localdomain transport_maps = hash:/etc/postfix/transport receive_override_options = В данном примере использован локальный адрес: ''bcc@localhost.localdomain'' ===== Команды ===== Проверка синтаксиса: postfix -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf check Состояние очереди: postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -p Обработка очереди немедленно: postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -f Очистка очереди: postsuper -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -d ALL Тест адреса доставки: postmap -q address@domail.ru ldap:/etc/postfix/ldap-users.cf тот-же тест с использованием ''ldapsearch'' ldapsearch -h 127.0.0.1 -p 389 -x -b "ou=users,dc=domain" -LLL '(&(!(l=disabled)) (|(mail=info@domain.ru)(maildrop=info@domain.ru))(objectclass=mailUser))' maildrop {{anchor:postmulti}} ====== Работа с несколькими экземплярами ====== FIXME При решении некоторых задач можно воспользоваться возможностью работы с несколькими экземплярами (instance) сервера. Для работы нужно добавить такие строки: multi_instance_enable = yes multi_instance_wrapper = ${command_directory}/postmulti -p -g ИМЯ_ГРУППЫ reload multi_instance_directories = /etc/postfix-mx /etc/postfix-1 /etc/postfix-n в переменной ''multi_instance_directories'' указывается экземпляры программы, в примере использованы следующие: * ''/etc/postfix-mx'' * ''/etc/postfix-1'' * ''/etc/postfix-n'' Для того, чтобы при запуске/останове и перезапуске Postfix и по команде service postfix … нужно параметре ''multi_instance_wrapper'' нужно указать имя группы (''ИМЯ_ГРУППЫ'') в куда входя нужные экземпляров программы. Также для того, чтобы разрешить работу с несколькими экземплярами можно использовать команду postmulti -e init Для управления служит программа ''postmulti''. Примеры: |Создание|postmulti -I ИМЯ_ЭКЗЕМПЛЯРА -G ИМЯ_ГРУППЫ -e create| |Активация|postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -e enable| |Управление экземпляром|postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -p КОМАНДА| ---- [[http://www.postfix.org/MULTI_INSTANCE_README.html|Managing multiple Postfix instances on a single host]] ===== Удаление экземпляра ===== При удалении экземпляра нужно удалить его папку: ''/var/spool/ИМЯ_ЭКЗЕМПЛЯРА'', иначе даже после того, как имя экземпляра удалено из переменной ''multi_instance_directories'' файла ''/etc/postfix/main.cf'' будет сообщение об ошибке: postmulti[...]: fatal: No matching instances {{anchor:security}} ====== Безопасность ====== FIXME |''mynetworks''| список подсетей с которых разрешена отправка через этот сервер| |''disable_vrfy_command = yes''|Клиент, подключившийся к серверу, может командой ''vrfy user@domain.ru'' определить, существует ли заданный адрес в системе| |''show_user_unknown_table_name = no''|При попытке клиента отправить письмо несуществующему пользователю по умолчанию сервер выдаст ''550 (reject)'' с сообщением ''user unknown in local recipient table'' (или другой таблице). Отключаем, пусть сервер сообщает ''user unknown''| |''smtpd_helo_required = yes''|Требуем от клиента приветствия (HELO/EHLO). Все, кто подключается, должны представляться| | smtpd_helo_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname |Ограничения для этапа ''HELO/EHLO''. Применяются к имени хоста, его IP-адресу и приветствию ''HELO/EHLO'':\\ Разрешаем доверенные сети\\ Разрешаем тем, кто прошёл аутентификацию\\ Отбрасываем неправильное (несуществующее) имя хоста\\ Отбрасываем не полностью определённое доменное имя хоста\\ Отбрасываем, если хост по HELO/EHLO не имеет А или МХ записи| |smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks, permit_sasl_authenticated|Ограничения для этапа MAIL FROM. Применяется ко всему предыдущему + имя отправителя:\\ Отбрасываем не полностью определённое имя отправителя\\ Отбрасываем отправителя с несуществующего домена\\ Отбрасываем несуществующих отправителей\\ Проверяем отправителя. Если с нашего домена, то проверим, находится ли он в доверенной сети или прошёл аутентификацию\\ Разрешаем отправлять с доверенных сетей\\ Разрешаем отправлять прошедшим аутентификацию| |smtpd_recipient_restrictions= reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination reject_invalid_hostname|Ограничения для этапа RCPT TO. Применяется к предыдущему + имя получателя:\\ ''reject'', если получатель отсутствует в списке нашего домена или списке пересылки. Чтобы сервер не стал открытым ''relay''| |smtpd_data_restrictions= reject_unauth_pipelining, reject_multi_recipient_bounce|Ограничения для этапа DATA:\\ Отвергаем запрос, когда клиент посылает команды SMTP раньше времени\\ ''reject'' клиента с пустым именем отправителя, который отправляет сразу нескольким получателям| |smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject|Ограничиваем клиентов, которые могут запрашивать очистку очереди сообщений| {{anchor:security_example}} ===== Пример ===== Пример для вставки в файл ''main.cf'' disable_vrfy_command = yes show_user_unknown_table_name = no smtpd_helo_required = yes smtpd_helo_restrictions= check_helo_access hash:/etc/postfix/helo_restrictions permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks, permit_sasl_authenticated smtpd_recipient_restrictions= check_sender_access hash:/etc/postfix/sender_access reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination reject_invalid_hostname smtpd_data_restrictions= reject_unauth_pipelining, reject_multi_recipient_bounce smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject message_size_limit = 51200000 Таблицы: 80.84.114.82 OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144 REJECT 80.84.114.82 OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144 REJECT @mailpn.ru REJECT Скрипт для компиляции таблиц: #!/bin/bash postmap helo_restrictions sender_access transport ====== Интеграция с другими программами ====== ===== AMaViSd-new ===== [[amavisd-new:amavisd-new|AMaViSd-new]] — интерфейс между MTA и сканером вирусов/фильтром содержания content_filter=smtp-amavis:[127.0.0.1]:10024 После транспорта ''pickup'': -o content_filter= -o receive_override_options=no_header_body_checks В конец файла: smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o smtp_tls_note_starttls_offer=no 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o smtpd_restriction_classes= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters -o local_header_rewrite_clients= -o smtpd_milters= -o local_recipient_maps= -o relay_recipient_maps= ===== ClamAV ===== :!: Для работы через [[clamav:clamav#ClamSMTPd|ClamSMTPd]] content_filter = scan:127.0.0.1:10025 receive_override_options = no_address_mappings # AV scan filter (used by content_filter) scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes # For injecting mail back into postfix from the filter 127.0.0.1:10026 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8 ''/etc/clamsmtpd.conf'' OutAddress: 127.0.0.1:10026 ===== Dovecot ===== [[dovecot:dovecot|Dovecot ]] mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT" dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient} ===== SpamAssassin ===== Эта настройка позволяет работать с [[spamassassin:spamassassin|]] без использования [[#AMaViSd-new]] В файл ''/etc/postfix/master.cf'' нужно добавить - Для ''smtp'' и ''submission'' строку: -o content_filter=spamassassin пример: … smtp inet n - y - - smtpd -o content_filter=spamassassin … submission inet n - y - - smtpd -o content_filter=spamassassin … - В конец файла: spamassassin unix - n n - - pipe user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} - Выполнить: postfix reload или service postfix reload ===== SSL ===== {{anchor:letsencrypt}} Пример настройки работы по порту 587, с использованием сертификатов [[letsencrypt:letsencrypt|]]: smtpd_tls_cert_file=/etc/letsencrypt/live/domain.ru/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/domain.ru/privkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_local_domain = smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_auth_enable = yes smtp_tls_security_level = may smtpd_tls_security_level = may smtp_tls_note_starttls_offer = yes smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes ====== Ссылки ====== * https://wiki.debian.org/Postfix * [[http://thewalter.net/stef/software/clamsmtp/postfix.html|ClamSMTP: Using with Postfix]] * [[http://www.postfix.ru/viewtopic.php?p=39498|Postfix: документация postfix, ссылки, обмен опытом, форум :: Просмотр темы - Типовой конфиг для всех]] * [[http://jskyworker.blogspot.ru/2012/07/postfix-warning-dictnisinit.html|Postfix, warning: dict_nis_init.]] * https://wiki.debian.org/PostfixAndSASL * http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL * [[http://www.postfix.org/TLS_README.html|Postfix TLS Support]] * **[[https://serveradmin.ru/ochistka-i-obsluzhivanie-pochtovoy-bazyi-postfix/|Очистка и обслуживание почтовой базы postfix]]** * **[[https://serveradmin.ru/zapret-pisem-s-poddelnyim-polem-from-ili-spam-ot-sebya-k-sebe-v-postfix/|Запрет писем с поддельным полем From или спам от себя к себе в postfix]]** * [[https://www.dmosk.ru/miniinstruktions.php?mini=postfix-limits|Лимиты в Postfix. Ограничение на размер сообщения. Лимит на количество сообщений]] * [[https://blog.neofusion.ru/2018/11/18/configure-postfix-to-send-mail-using-external-smtp-server.html|Настройка Postfix для отправки почты через внешний SMTP]] {{tag>Linux Debian Email SMTP}}