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

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


service:postfix

Postfix

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'.
/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-нотации

/etc/postfix/aliases - список псевдонимов для доставки почты.

/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

Сервер с коммутируемым соединением

Такой сервер непостоянно подключен к интернету, а соединяется с ним временно, передавая и получая письма через провайдерский SMTP-сервер. В связи с этим IP-адрес сервера может быть непостоянным, сервер не может искать имена хостов, когда он не подключен к интернету, провайдерский сервер является ретранслятором, и он требует аутентификации для пересылки, почту нужно извлекать с провайдерского сервера с помощью fetchmail или иного POP/IMAP-клиента

В связи с этим, необходимо:

/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

5. Инициировать доставку сообщений, когда соединение с интернетом появляется, и отключить её, когда оно пропадает. Для этого нужно менять конфигурацию Postfix. Например, если используется протокол PPP, то в /etc/ppp/ip-up.d нужно создать сценарий postfix, который будет выполняться после сценария, определяющего resolv.conf, примерно такого вида:

/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

Смысл манипуляции с resolv.conf в том, чтобы сервер изменил свой файл resolv.conf при установлении соединения с Интернетом. Postfix также должен знать текущие серверы имен, поэтому команда копирует новую версию в файл, соответствующий chroot, с тем чтобы Postfix мог его найти.

При отключении надо вернуть всё обратно:

/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

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

Карты

Ключ-значение.

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

Доступные типы карт можно посмотреть командой 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 будет возвращено ОК,

/john\.doe@example\.com/ OK
/example\.com/ REJECT

а здесь - нет.

/example\.com/ REJECT
/john\.doe@example\.com/ OK

Часто используются для header_checks, body_checks и mime_header_checks.

Когда линейных карт становится много, может начать тормозить, особенно если используются параметры *_chexks с регулярками regexp и PCRE. Чтобы применить изменения в линейных картах, нужно выполнить postfix reload.

Базы данных (MySQL, PostgreSQL, LDAP) - воспринимаются так же, как индексированная карта. При работе с БД не требуется перезапускать демон, но есть недостатки - высокая задержка и риск медленной работы при высокой нагрузке.

Управление сообщениями, ограничения

Postfix имеет три отдельных группы параметров управления содержимым, которые непосредственно связаны с различными частями сообщения:

  1. smtpd_*_restrictions управляют клиентским соединением и конвертом в процессе передачи сообщений (этап HELO/EHLO и заголовков конверта FROM/TO). Отбойника на этом этапе нет, т. к. клиенту отказывают в обслуживании.
  2. *_checks контролируют заголовок письма, тело и вложения.
  3. Фильтры - передача задач другим (внешним) отбраковывающим приложениям. Фильтры универсальны – они могут контролировать любую часть сообщения, от конверта до вложения.

DKIM

http://www.opendkim.org/opendkim.conf.5.html

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

https://habr.com/ru/post/151904/
https://www.opennet.ru/openforum/vsluhforumID1/96371.html

Открытый ключ надо прописать во внешний DNS + общую запись _domainkey. Примерный вид записей:

_domainkey.example.com. TXT "t=s; o=~;"
mail._domainkey.example.com. TXT "k=rsa\; t=s\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQm/и/так/далее"

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

В логах:

Apr 22 15:48:37 mailsrv postfix/smtpd[7790]: warning: connect to Milter service unix:/run/opendkim/opendkim.sock: No such file or directory

Проблема в том, что postfix работает не от рута и у него нет доступа к /run/opendkim, надо переносить сокет в каталог /var/spool/postfix.

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

https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki/74491#74491

Статистика

За вчерашний день

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

https://www.in1.lt/postfix-monitoring/

С фильтрацией по IP-отправителю (за вчерашний день)

#!/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

https://stackoverflow.com/questions/51540730/proper-export-from-txt-to-html-in-powershell
https://infoheap.com/bash-append-text-to-a-variable/

service/postfix.txt · Последнее изменение: 30.07.2024 19:21 — 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki