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'.
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 имеет три отдельных группы параметров управления содержимым, которые непосредственно связаны с различными частями сообщения:
- **smtpd_*_restrictions** управляют клиентским соединением и конвертом в процессе передачи сообщений (этап HELO/EHLO и заголовков конверта FROM/TO). Отбойника на этом этапе нет, т. к. клиенту отказывают в обслуживании.
- ***_checks** контролируют заголовок письма, тело и вложения.
- **Фильтры** - передача задач другим (внешним) отбраковывающим приложениям. Фильтры универсальны – они могут контролировать любую часть сообщения, от конверта до вложения.
===== 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 <
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)
# Тэг в html решает 2 задачи - сохранение отступов и моноширинный шрифт.
echo "$report
" | \
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/