====== 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'. # Имя хоста (в 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 - список псевдонимов для доставки почты. <локальная часть адреса>: <имя пользователя или 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-клиента В связи с этим, необходимо: # 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, примерно такого вида: ## запустить или перезагрузить 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 мог его найти. При отключении надо вернуть всё обратно: ## запустить или перезагрузить 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 имеет три отдельных группы параметров управления содержимым, которые непосредственно связаны с различными частями сообщения: - **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/