Инструменты пользователя

Инструменты сайта


service:postfix

Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
service:postfix [25.04.2022 13:18] – [Карты] viacheslavservice:postfix [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Postfix ======
 +<code>
 +apt install postfix
  
 +Postfix (main.cf) was not set up.  Start with
 +  cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
 +.  If you need to make changes, edit /etc/postfix/main.cf (and others) as
 +needed.  To view Postfix configuration values, see postconf(1).
 +
 +After modifying main.cf, be sure to run 'systemctl reload postfix'.
 +</code>
 +
 +<file bash /etc/postfix/main.cf>
 +# Имя хоста (в HELO), по умолчанию берётся из hostname -f, но можно задать принудительно
 +myhostname = mail.example.com
 +# Домен, по умолчанию берётся из myhostname до первой точки. Если myhostname не задано, оно берётся из hostname в системе + $mydomain.
 +mydomain = example.com
 +# Домены, для которых принимается почта. По умолчанию - только локальный хост, ниже пример для всего родного домена.
 +mydestination = $mydomain
 +# Для домена и хоста:
 +mydestination = $mydomain, $myhostname
 +# Несколько значений, другая форма записи (значения должны иметь пробел в начале строки)
 +mydestination =
 + $mydomain,
 + $myhostname,
 + www.$mydomain,
 + ftp.$mydomain
 +# Добавление к исходящим адресам, если они указаны не полностью (если адрес root, то получится root@example.com)
 +# По умолчанию myorigin = $myhostname, полезно, если нужно узнать имя хоста, с которого отправлено (root@mail.example.com)
 +myorigin = $mydomain
 +
 +# Настройка адресов, с которых будет открыта ретрансляция (релей)
 +mynetworks_style = host # доверять только адресам сервера
 +# mynetworks_style = subnet # доверять подсетям, к которым принадлежит сервер
 +# mynetworks_style = class # доверять классам сетей, к которым принадлежит сервер
 +# Индивидуальная настройка:
 +mynetworks = 127.0.0.0/8, 192.168.100.0/24, 192.168.200.0/24, 10.0.0.0/30
 +# Вариант в файле:
 +# mynetworks = hash:/etc/postfix/mynetworks # CIDR-нотация не поддерживается
 +# mynetworks = cidr:/etc/postfix/mynetworks # для CIDR-нотации
 +
 +</file>
 +
 +/etc/postfix/aliases - список псевдонимов для доставки почты.
 +<file bash /etc/postfix/aliases>
 +<локальная часть адреса>: <имя пользователя или e-mail>
 +
 +# Перенаправление локальной почты для пользователя root пользователю ituser.
 +root: ituser
 +
 +# Доставка с ivan.petrov@example.com и i.petrov@example.com учётке petrov.
 +# Адрес petrov@example.com писать в псевдонимы не нужно, т. к. адрес, совпадающий с учёткой, уже есть.
 +ivan.petrov: petrov
 +i.petrov:    petrov
 +
 +# Группа sales@example.com - доставка в 3 учётки.
 +sales: petrov, sidorov, ivanov
 +
 +# Пересылка в другой домен:
 +outdoor: asdf@anotherdomain.com
 +
 +
 +# Создание индекса после правки алиасов (Postfix обращается только к индексу)
 +postalias hash:/etc/postfix/aliases
 +# или
 +newaliases
 +</file>
 +
 +===== Сервер с коммутируемым соединением =====
 +Такой сервер непостоянно подключен к интернету, а соединяется с ним временно, передавая и получая письма через провайдерский SMTP-сервер. В связи с этим IP-адрес сервера может быть непостоянным, сервер не может искать имена хостов, когда он не подключен к интернету, провайдерский сервер является ретранслятором, и он требует аутентификации для пересылки, почту нужно извлекать с провайдерского сервера с помощью fetchmail или иного POP/IMAP-клиента
 +
 +В связи с этим, необходимо:
 +<file bash /etc/postfix/main.cf>
 +# 1. отключить разрешение имён
 +disable_dns_lookups = yes
 +# 2. проверить разрешения на ретрансляцию (только для частной сети)
 +mynetworks = 192.168.0.0/24, 127.0.0.0/8
 +# 3. определить хост-ретранслятор ([] - отключить поиск MX-записи)
 +relayhost= [relay.example.com]
 +# 4. отложить передачу сообщений, ставить их в очередь (чтобы не подключаться к интернету при каждом полученном письме)
 +defer_transports = smtp
 +</file>
 +5. Инициировать доставку сообщений, когда соединение с интернетом появляется, и отключить её, когда оно пропадает. Для этого нужно менять конфигурацию Postfix. Например, если используется протокол PPP, то в /etc/ppp/ip-up.d нужно создать сценарий postfix, который будет выполняться после сценария, определяющего resolv.conf, примерно такого вида:
 +<file bash /etc/ppp/ip-up.d/postfix>
 +## запустить или перезагрузить Postfix
 +# если Postfix запускается через chroot, скопировать
 +# resolv.conf в используемый Postfix файл resolv.conf
 +cp -p /etc/resolv.conf `postconf -h queue_directory`/etc/resolv.conf
 +# отменить отложенную отправку, применить изменения конфигурации
 +postconf -e "defer_transports ="
 +postfix reload
 +# заставить очередь выгрузить всю ожидающую отправки почту
 +postfix flush
 +</file>
 +Смысл манипуляции с resolv.conf в том, чтобы сервер изменил свой файл resolv.conf при установлении соединения с Интернетом. Postfix также должен знать текущие серверы имен, поэтому команда копирует новую версию в файл, соответствующий chroot, с тем чтобы Postfix мог его найти.
 +
 +При отключении надо вернуть всё обратно:
 +<file bash /etc/ppp/ip-down.d/postfix>
 +## запустить или перезагрузить Postfix
 +# скопировать resolv.conf в resolv.conf, используемый
 +# Postfix (только для chroot)
 +cp -p /etc/resolv.conf `postconf -h queue_directory`/etc/resolv.conf
 +# включить отложенную отправку, применить изменения конфигурации
 +postconf -e "defer_transports = smtp"
 +postfix reload
 +</file>
 +
 +6. Пройти аутентификацию на хосте-ретрансляторе (POP-before-SMTP или SMTP-auth)\\
 +POP-before-SMTP - надо настраивать fetchmail, добавив триггер перед конфигурацией postfix в /etc/ppp.\\
 +
 +==== Очереди ====
 +Каталог очередей определяется параметром ''queue_directory'' в ''main.cf''. Стандартное разположение - ''/var/spool/postfix''.
 +  * incoming - новые сообщения, перемещаются диспетчером очередей в очередь active.
 +  * maildrop - сообщения, посланные командой sendmail, которые не были отправлены в первичные очереди Postfix сервисом pickup. (???)
 +  * active - сообщения, находящиеся в процессе доставки.
 +  * deferred - задержанные сообщения, которые не удаётся доставить некоторым адресатам. Периодически (параметр queue_run_delay) возвращаются в очередь active.
 +  * hold - сообщения, исключённые из обработки политиками smtpd access и проверками тела и заголовков с помощью cleanup. Не возвращаются в обработку, это можно сделать только вручную.
 +  * corrupt - повреждённые файлы очередей. Админ может исследовать их с помощью postcat.
 +
 +https://www.postfix.org/QSHAPE_README.html#queues
 +
 +==== Карты ====
 +Ключ-значение.
 +<code>
 +postmaster: John
 +postmaster@example.com John
 +192.168.254.12 REJECT
 +spammer@example.com REJECT
 +/^Subject: your account {25}[a-z]{8}/ REJECT Mimail Virus Detected
 +</code>
 +
 +Доступные типы карт можно посмотреть командой ''postconf -m''.
 +btree
 +cidr
 +environ
 +fail
 +hash
 +inline
 +internal
 +memcache
 +nis
 +pipemap
 +proxy
 +randmap
 +regexp
 +socketmap
 +static
 +tcp
 +texthash
 +unionmap
 +unix
 +
 +
 +**Индексированные карты (hash, btree, dbm и др)** - двоичные БД, созданные из текстовых файлов командами newaliases, postalias и postmap. Часто используются для aliases, virtual, transport, relocated и sasl_passwd.\\
 +**Линейные карты (PCRE, regexp, CIDR и обычные файлы)** - простые текстовые файлы, читаются сверху вниз, первое же совпадение определяет действие, дальнейшие записи игнорируются. Например, для regexp-карты здесь для john.doe@example.com будет возвращено ОК,
 +<code>
 +/john\.doe@example\.com/ OK
 +/example\.com/ REJECT
 +</code>
 +а здесь - нет.
 +<code>
 +/example\.com/ REJECT
 +/john\.doe@example\.com/ OK
 +</code>
 +Часто используются для header_checks, body_checks и mime_header_checks.
 +
 +Когда линейных карт становится много, может начать тормозить, особенно если используются параметры *_chexks с регулярками regexp и PCRE. Чтобы применить изменения в линейных картах, нужно выполнить ''postfix reload''.
 +
 +**Базы данных (MySQL, PostgreSQL, LDAP)** - воспринимаются так же, как индексированная карта. При работе с БД не требуется перезапускать демон, но есть недостатки - высокая задержка и риск медленной работы при высокой нагрузке.
 +
 +===== Управление сообщениями, ограничения =====
 +Postfix имеет три отдельных группы параметров управления содержимым, которые непосредственно связаны с различными частями сообщения:
 +  - **smtpd_*_restrictions** управляют клиентским соединением и конвертом в процессе передачи сообщений (этап HELO/EHLO и заголовков конверта FROM/TO). Отбойника на этом этапе нет, т. к. клиенту отказывают в обслуживании.
 +  - ***_checks** контролируют заголовок письма, тело и вложения. 
 +  - **Фильтры** - передача задач другим (внешним) отбраковывающим приложениям. Фильтры универсальны – они могут контролировать любую часть сообщения, от конверта до вложения.
 +
 +
 +===== DKIM =====
 +http://www.opendkim.org/opendkim.conf.5.html
 +<code bash>
 +DKIMDIR=/etc/postfix/dkim
 +DOMAIN=example.com
 +KEY=mail
 +
 +# Установка
 +apt-get install opendkim opendkim-tools
 +# Каталог, генерация ключей
 +mkdir $DKIMDIR
 +opendkim-genkey -D $DKIMDIR -d $DOMAIN -s $KEY
 +# Права на ключи
 +chgrp opendkim $DKIMDIR/*
 +chmod g+r $DKIMDIR/*
 +gpasswd -a postfix opendkim
 +
 +# Конфиг opendkim
 +tee -a /etc/opendkim.conf  <<EOF
 +Canonicalization relaxed/relaxed
 +SyslogSuccess yes
 +KeyTable file:$DKIMDIR/keytable
 +SigningTable file:$DKIMDIR/signingtable
 +SoftwareHeader yes
 +# на время отладки включим расширенное логирование:
 +LogWhy yes
 +# если вы подписываете и на других серверах:
 +#ExternalIgnoreList file:$DKIMDIR/trusted
 +# список внутренних хостов, почта которых требует подписи:
 +#InternalHosts file:$DKIMDIR/internal
 +EOF
 +
 +# keytable file
 +echo $KEY._domainkey.$DOMAIN $DOMAIN:$KEY:$DKIMDIR/$KEY.private | tee -a $DKIMDIR/keytable
 +# signingtable file
 +echo $DOMAIN $KEY._domainkey.$DOMAIN | tee -a $DKIMDIR/signingtable
 +
 +# Postfix
 +postconf -e milter_default_action=accept
 +postconf -e milter_protocol=2
 +postconf -e smtpd_milters=unix:/var/run/opendkim/opendkim.sock
 +postconf -e non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock
 +</code>
 +https://habr.com/ru/post/151904/\\
 +https://www.opennet.ru/openforum/vsluhforumID1/96371.html\\
 +
 +Открытый ключ надо прописать во внешний DNS + общую запись _domainkey. Примерный вид записей:
 +<code>
 +_domainkey.example.com. TXT "t=s; o=~;"
 +mail._domainkey.example.com. TXT "k=rsa\; t=s\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQm/и/так/далее"
 +</code>
 +ADSP запись (_adsp._domainkey.example.com.) неактуальна, вместо них теперь DMARC.\\
 +https://habr.com/ru/post/106589/
 +
 +Проверка DKIM-записи: https://dmarcian.com/dkim-inspector/
 +==== opendkim.sock: No such file or directory ====
 +В логах:
 +<code>
 +Apr 22 15:48:37 mailsrv postfix/smtpd[7790]: warning: connect to Milter service unix:/run/opendkim/opendkim.sock: No such file or directory
 +</code>
 +
 +Проблема в том, что postfix работает не от рута и у него нет доступа к /run/opendkim, надо переносить сокет в каталог /var/spool/postfix.
 +
 +<code bash>
 +vi /etc/default/opendkim
 +Socket                  local:/var/spool/postfix/var/run/opendkim/opendkim.sock
 +
 +mkdir -p /var/spool/postfix/var/run/opendkim
 +chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
 +service opendkim restart
 +</code>
 +https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki/74491#74491
 +
 +===== Статистика =====
 +За вчерашний день
 +<code bash>
 +apt install mailutils pflogsumm -y
 +pflogsumm -d yesterday /var/log/mail.log |mail -aFrom:cron@mailsrv.example.com -s "Postfix - статистика за $(date -d "yesterday" +'%d.%m.%Y')" admin@example.com
 +</code>
 +https://www.in1.lt/postfix-monitoring/
 +
 +С фильтрацией по IP-отправителю (за вчерашний день)
 +<code bash>
 +#!/bin/bash
 +
 +logfiles="/var/log/mail.log /var/log/mail.log.1"
 +# %_d - число без нуля в начале, вместо него пробел (так в логах: Apr 30, но May  1)
 +yesterdaylog=$(date -d "yesterday" +'%b %_d')
 +yesterdaymark=$(date -d "yesterday" +'%d.%m.%Y')
 +
 +entries=$(egrep -h "^$yesterdaylog.*?\[192\.168\.0\.2" $logfiles)
 +
 +# ids=$(echo "${entries[@]}" |awk -F: '{if(length($4)==11) print $4}')
 +# Когда сообщений >≈12000, ошибка "-bash: /usr/bin/egrep: Argument list too long"
 +# report=$(egrep -h "$(echo ${ids[@]} |tr " " "|")" $logfiles |pflogsumm)
 +
 +# Поэтому надо разбивать на порции (здесь: 4000)
 +ids=(`echo "$entries" |awk -F: '{if(length($4)==11) print $4}' |xargs -n 4000 |tr " " "|"`)
 +messages=$(for i in ${ids[@]}; do egrep -h "$i" $logfiles; done)
 +report=$(echo "$messages" |pflogsumm)
 +
 +# Тэг <pre> в html решает 2 задачи - сохранение отступов и моноширинный шрифт.
 +echo "<html><body><pre>$report</pre></body></html>" | \
 +mail -a 'From:cron@mailsrv.example.com' -a 'Content-Type: text/html' \
 +-s "Postfix - статистика за $yesterdaymark" \
 +admin@example.com,user@example.com
 +
 +# Сс и Bcc надо указывать как заголовки (-a 'Сс:ccuser@example.com,ccuser2@example.com'), т. к. ключи -с и -b не работают.
 +
 +# /etc/crontab
 +# Postfix - статистика по письмам c IP 192.168.0.2
 +0 8     * * *   root    /scripts/postfix-stat.sh
 +</code>
 +https://stackoverflow.com/questions/51540730/proper-export-from-txt-to-html-in-powershell\\
 +https://infoheap.com/bash-append-text-to-a-variable/

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki