Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Особенности работы Postfix

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
03 марта 2022 г.
3322
17 минут чтения
Средний рейтинг статьи: 5

New Documentation

Этот почтовый агент выполняет те же функции, что и Sendmail, но более устойчив, гибок и безопасен. Он появился в 1999 году. Разработчики постоянно совершенствуют свой продукт. В версию Postfix 3 встроена поддержка отправки почты как через устаревшую службу SMTPS, так и через протокол SMTP, а также поддерживается расширение для создания зашифрованных соединений STARTTLS.

Вместо Sendmail — Postfix Mac Os, начиная с версии 10.3. Этот почтовик также входит в состав инсталляционного пакета Linux. Поговорим о том, как установить и настроить Постфикс, об основных особенностях его работы и архитектуре.

Особенности Работы Postfix (1)

Установка Postfix

Чтобы инсталлировать приложение, наберите: 

apt-get install postfix

Запустится конфигурирование. Вам начнут задавать вопросы. Среди профилей, которые вам предложат, выберите Internet Site — тогда программа сконфигурирует конфиг main.cf и сразу же запустится. Иначе вам придется конфигурировать самостоятельно.

Справка. Main.cf может содержать свыше 330 строк. 

Первичные настройки

После инсталляции программные настройки запишутся в подкаталог /etc/postfix. Здесь же будет храниться main.cf — главный конфигурационный файл. 

Решим, как будет использоваться клиент mail Postfix: чтобы пересылать корреспонденцию на иной хост или хранить одну часть локально, а другую — пересылать.

Обычная локальная доставка, которая базируется на авторизации и учитывает юзеров вашей системы, не отличается гибкостью. Но мы ее рассмотрим, так как с этими командами взаимодействуют другие. 

Зайдите в подкаталог etc/postfix и раскройте файл конфигурации main.cf. Вы увидите строки такого вида: 

имя_параметра = значение

Их можно закомментировать, прописав в начале #

Если параметру может быть присвоено больше одного значения, это записывается одним из способов: 

имя_параметра = знач1 знач2 знач3
имя_параметра = знач1, значение2, значение3
имя_параметра =
 знач1
 знач2
 знач3
имя_параметра =
 знач1,
 знач2,
 знач3

Если значения перечисляются в столбик, как в двух последних способах, то в начале записи должен быть пробел.

После присваивания значения можно указать перед его именем $ и использовать его величину в других выражениях. Для этого укажите $имя_параметра там, где требуется «вытащить» значение. 

Это может быть выглядеть так: 

mydomen = example.net
mydestination=mail.$mydomen

Но, как правило, явные значения предпочтительней. Так как параметров используется меньше, их проще менять и вероятность ошибки ниже. 

Полезные команды 

Статус доставки

Задача DSN Postfix — оповестить о статусе доставки корреспонденции: успех, неудача, задержка или не отправлено. 

Вы можете запретить оповещения: 

/etc/postfix/main.cf:
smtpd_discard_ehlo_keywords=silent-discard, dsn

Или разрешить лишь отобранным:

/etc/postfix/main.cf:
smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/esmtp_access

Перечень выбранных сетей — в файле esmtp_access. Например: 

192.168.0.0/25 silent-discard
0.0.0.0/0 silent-discard, dsn

Работа с очередью

  • С помощью утилиты postcat Postfix вы сможете просматривать содержимое сообщений, которые застряли в очереди.
  • С помощью qshape Postfix можно увидеть письма, стоящие в очереди по каждому из доменов. 
  • Просмотр очереди:
postqueue -p | less
  • Узнать количество писем в очереди:
mailq | grep Request
  • Установить наименование сервера 

Имя узнается с помощью команды:

hostname

Если имя не установлено, или не такое, его можно прописать:

echo "server" > /etc/hostname
hostname -F /etc/hostname

Справка. Hostname сервера не совпадает с его доменом. Например, server.example.com — полное имя домена, а server — его hostname.

Postfix: настройка отправки почты 

Для того чтобы отправленные через MTA письма не попали под спам, а пришли адресату, вам будут нужны:

  • внешний белый IP-адрес, приобретенный или взятый в аренду;
  • реальный домен, вы настроите его поддомен как имя сервера и будете управлять настройками DNS.

Обязательные параметры

При настройке обязательно указываются такие параметры: myhostname, mydomain и mydestination.

Хост и домен прописываются так:

myhostname = mail. example.org
mydomain = example.org

Если не указать название хоста, система определит его сама, но лучше прописать явно. Имя домена получится из названия хоста, если отбросить левую часть до первой точки. Поэтому можно не прописывать его вручную. Mydomain — это публичное наименование почтового сервиса. К адресу, откуда отсылается корреспонденция, автоматически дописывается домен локальной почты:

myorigin = $mydomain

Прописываем почтовые домены, к которым сервер доставит почту. В mydestination перечисляются DNS-имена, для которых этот почтовый сервер сможет принимать корреспонденцию. Их лучше обрабатывать механизмом virtual, так что значения не присваиваем.

my destination =  
localhost
$myhostname

Затем подключаем виртуальные домены, чтобы доставить почту:

local_recipient_maps = 

Так как обычная локальная доставка нас не интересует, оставляем перечень адресатов без значений.

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

1. Прописываем сетевые интерфейсы, работающие на приеме почты, например, все: 

inet_interfaces = all

Выбираем из ipv4, ipv6, all нужный нам протокол:

inet_protocols = all 

2. Указываем доверенные сети, где разрешены практически любые соединения:

mynetworks =
127.0.0.0/7
[::ffff:127.0.0.0]/108
[::1]/121
192.168.0.0/9

3. Если вы планируете отправлять корреспонденцию через relay, пропишите это в relayhost.

Справка. Relay — это узел, перенаправляющий входящую почту. В его задачи входит:

  • получение корреспонденции;
  • хранение на протяжение указанного периода;
  • пересылка писем получателю или другому relay.

Relay для отправляемой корреспонденции:

relayhost = smtp.myprovider.net

Так как вы отправляете всю переписку на релей, вам нет смысла опрашивать DNS. Поэтому отключаем эти запросы:

disable_dns_lookups = yes

4. Прописываем домены, на которые разрешим пересылать сообщения от клиентов недоверенных сетей. Возможен один из вариантов:

  • По умолчанию
relay_domains = $mydestination
  • Запрет пересылки корреспонденции от посторонних:
relay_domains =
  • Отправление корреспонденции своим доменам:
relay_domains = $mydomain

Справка. По умолчанию, Постфикс:

  • переправляет корреспонденцию исключительно авторизованным доменам;
  • воспринимает авторизованными те домены, что прописаны в mydestination.

Особенности работы

Чем интересен этот почтовый сервер?

  • Его исходный код открыт, а файлы конфигурации состоят всего из двух строк. Он готов отправлять сообщения сразу же после установки, но в нем нет встроенного механизма авторизации. 
  • Если не установить плагин Dovecot, любой желающий может подсоединиться к почтовику и начать отправлять или получать письма со всех ящиков. 
  • Возможна настройка виртуальных доменов.
  • Фильтруется спам.
  • Postfix и Sendmail — две совместимые программы. Персональные файлы пользователей с расширением *.forward и алиасы, хранящие пути перенаправления e-mail пользователей, имеют сходную семантику и формат.
  • Server Postfix комуницирует не только по SMTP, POP3 и IMAP, а также по расширенному протоколу ESMTP. В Постфиксе адреса не подставляются, а «вытягиваются» из табличных файлов или SQL-базы пользователя.

Добавление пользователей

Если вы хотите добавить еще одного user postfix, то самым простым способом будет введение новой учетки в систему, об остальном почтовый клиент позаботится сам. 

Чтобы создать нового пользователя, в терминале Ubuntu наберите команду:

adduser имя_пользователя

Добавленный пользователь сможет пользоваться почтовиком. Такой метод подходит небольшим организациям. Если же в организации много пользователей, систему наращивают. 

  1. Устанавливаем MySQL, в которой будет храниться информация о пользователях.
  2. Добавляем Постфикс Admin — интерфейс администрирования и управления почтовым клиентом.
  3. Переносим учетные записи пользователей в базу данных.

Этот процесс подробнее описан в блоге timeweb.cloud, разбирается настройка Postfix и Dovecot.

Меняем темы писем с Postfix Pcre

В Постфикс можно заменять темы писем. Для этого потребуется доустановить библиотеку pcre, введя в терминале команду:

apt install postfix-pcre

Рассмотрим пример, где почтовик приписывает имя сервера к теме сообщения.

1. Добавляем в файл конфигурации запись:

header_checks = pcre:/etc/postfix/rewrite_subject

2. Создаем файл rewrite_subject в подкаталоге etc/postfix.

3. Записываем в этот файл правило, по которому наименование сервера припишется к теме письма.

/^Subject: (.*)$/ REPLACE Subject: $1 (from server.domain.tld)

Здесь:

  • /^Subject: (.*)$/ — регулярное выражение, которое совпадет с текстом заголовка, идущего после слова «Subject». 
  •  (.*) — любая из тем письма, ее значение присвоится переменной $1.
  • REPLACE — замена текста.

Результатом этой команды будет замена заголовка на «заголовок + имя сервера». 

4. Перезапускаем почтовый сервер, чтобы изменения вступили в силу.

Справка. Регулярные выражения pcre можно применять не только для правки заголовков, но и для фильтрации сообщений.

Алиасы и преобразования адресов

Alias, или никнейм — это короткое имя, которое легко запомнить. Оно присваивается сложным и длинным наименованиям. 

Имя адресата может быть таким же, как и имя пользователя системы, но также их можно извлечь из таблицы алиасов. Например: 

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases

Во время первой установки почтового клиента таблица пополняется записью с алиасом суперпользователя root. Ему будут отправляться все письма, отправленные на системные адреса или администратору (по умолчанию им становится первый зарегистрированный пользователь). 

При установке Postfix “с нуля” в этой таблице создаётся алиас на имя root для доставки всей корреспонденции, предназначенной администратору и поступающей на другие системные адреса, на имя реального пользователя, который осуществляет функции администратора. Изначально им становится первый зарегистрированный в системе реальный пользователь. Таблица алиасов отличается от остальных таблиц, используемых Postfix; имена слева, которые являются ключами для поиска, отделяются от значений справа двоеточиями. Адресаты справа перечисляются через запятую и могут быть адресами, командами (обозначаются символом | в начале правой части; сообщение подаётся на стандартный поток ввода команды) и именами файлов:

Рассмотрим на примере, как выглядит таблица. 

      Fitzwilliam Darcy: fitzwilliam
      accountant: accountant@chiefcomputer
      result: calendars, plans, reports
      view: | postcat -q mail_id

Слева, до двоеточия — имена, выступающие как поисковые ключи. Справа могут быть адреса, имена файлов и команды (в этом случае в начале правой части ставится символ |).

Утилита postalias создает базы псевдонимов и обрабатывает запросы к ним. Чтобы построить рабочую таблицу, наберите команду:

postalias /etc/postfix/aliases

Виртуальные почтовые ящики

Это альтернатива ящикам, созданным для каждого из пользователей системы. Если на обслуживании вашего почтовика числятся сотни клиентов, то будет непрактично создавать всем им системные учетные записи для работы с почтой. Чтобы воспользоваться виртуальными п/я, вам нужно будет подкорректировать настройки программы и прописать окружение операционки.

Рассмотрим общий принцип функционирования виртуальных ящиков в системе. Если сервер почты не является релеем, то вся почтовая информация записывается на диск. При использовании постфиксом системных учеток, почтовые записи можно распознать по уникальным идентификаторам. Но, когда эксплуатируются виртуальные п/я, потребуется каким-то образом сообщить приложению о необходимости сохранения почтовой информации под определенной учеткой ОС. 

Идентификаторы пользователей и групп, а также их права можно задать с помощью параметров virtual_uid_maps, virtual_gid_maps. Кроме того, необходимо прописать папку, в которой будет храниться почта.

Класс виртуальных п/я создан для того, чтобы доставлять корреспонденцию для hosted_domains. Транспорт, который доставляет письма, прописывается в параметре Postfix virtual transport. По молчанию ему присвоено значение virtual, что обозначает доставку виртуальным агентом. Параметр mailbox_domains отвечает за наименования доменов, а в maps указываются допустимые адресаты.

Postfix logs

Журнальные файлы по умолчанию хранятся в файле mail.log, расположенном в подкаталоге /var/log/mail.log. 

Если вы или ваш провайдер изменили их местоположение, то для возврата к первичным настройкам потребуется выполнить apt-get install rsyslog и перезапустить службы постфикса.

По каждому из писем в логах фиксируются базовые данные: отправитель и адресат, а также факт и время обработки. Анализируя файлы журналов, вы можете: 

  • выяснить, отправлялось ли письмо с указанного адреса;
  • изучить статистику работы с почтовиком;
  • узнать объем сообщений, прошедших через SMTP.

Из этих строк не всегда можно понять, какое послание было обработано, так как одному и тому же получателю их могло быть отправлено несколько. Рассмотрим, как добавить в логе заголовки, которые смогут идентифицировать письмо с помощью директивы header_checks.

1. Создаем в подкаталоге etc/postfix файл header_checks и пишем в него правило для проверки заголовков:

/^X-Message-(.*)$/ Information $1 

2. Проверяем. Если нет ошибок в формате файла, то по команде:

postmap -q “X-Message-Result: 79461” pcre:/etc/postfix/header_checks

выведется результат:

Information Result: 79461

3. Подключим этот файл в почтовый сервер:

postconf –e header_checks=pcre:/etc/postfix/header_checks postfix reload

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

Архитектура

Соответствует стилю UNIX:

  • приложения просты;
  • количество функций минимально;
  • выполнение — быстрое и надежное.

Концепция подсистем

В Sendmail работает одно большое приложение, а в Постфикс — компактные программы, функционирующие совокупно. Они связаны алгоритмами FIFO и сокетами Unix. Каналы обмена размещены в защищенном каталоге. К функциям программ относятся отправление/прием сетевых сообщений и локальная доставка корреспонденции. 

Разбиение на подсистемы хорошо тем, что неиспользуемые модули отключаются. Все демоны завершаются не сами по себе, такую команду дает master. Когда почтовый сервер простаивает, демоны, которые в данный момент не нужны, прекращают работу и не занимают память. Если они понадобятся, master-демон может запустить их снова.

Запускает и контролирует процессы утилита master. В ее конфигурационном файле master.cf записаны сведения о вспомогательных программах и очередности их запуска. Процесс master активизируется, когда система стартует, и «живет», пока она работает. Он запускает остальные модули по требованию и перезапускает те, что из-за проблем были завершены аварийно. 

Некоторые утилиты 

В приложение входит набор утилит, которые работают через командную строку. Эти утилиты заточены на решение административных задач. С их помощью вы сможете обращаться к картам, просматривать очереди, ставить в нее сообщения и извлекать их, а также модифицировать конфигурацию. У всех их есть общая характеристика — post в начале имени, так что вы легко найдете их в таблице.

postsuper

Поддержание очередей администратором с правами root. 

Снятие и повторная отправка сообщений.

postqueue

Управление очередями обычными администраторами. Если сравнить с postsuper, часть функционала урезана.

postconf

Просмотр состояния переменных, входящих в конфиг. 

postlog

Запись информации в журналы. Пригодится при создании скриптов.

postcat

Просмотр очередей.

postmap

Запросы к дополнительным таблицам.

Формирование вспомогательных таблиц по текстовым данным.

Конверсия текста в таблицу.

postlock

Работа с блокировками.

postkick

Передача сигналов внутри почтового сервера.

Взаимодействие скриптов с приложением.

spawn

Подключение сторонних приложений для фильтрации сообщений. 

proxymap

Централизованные запросы к служебным таблицам.

Предоставление доступа в обход ограничений chroot.

smtpd 

Прием корреспонденции через порт SMTP.

Проверка авторизации пользователя перед отправкой почты. 

pickup

Сканирование каталога локальных писем.

Обработка найденных файлов.

cleanup

Обработка входящей почты.

Добавление заголовков.

Формирование адреса по картам virtual и canonical.

mailq

Просмотр списка писем в очередях. 

trivial-rewrite

Небольшая правка адресов.

Дописывание домена и не полностью заполненного адреса.

qmgr

Администратор очередей для корреспонденции, ожидающей доставки.

Как письма попадают в почтовую систему

1. Чаще всего — через сеть. Сначала их получает в postfix SMTP-демон. Проводится проверка на спам, если эту функцию включил администратор. 

Затем запускается процесс cleanup, отвечающий за зачистку. Он проверяет, правильно ли оформлено сообщение и допустимый ли у него формат. Цель — не допустить переполнение буфера, которое может быть причиной атак.

Trivial-rewrite дописывает служебные заголовки и приводит адреса к стандартному виду. Они становятся такими: имя_юзера@поддомен.домен. 

Обработанное письмо записывается в каталог incoming, выделенный для хранения входящей очереди.

2. Послание может быть отправлено с локальных серверов скриптами или командой, например, такой:

echo "text of the letter" | mail Dragon@domain.net -s "I wish you happiness"

3. Письмо появилось как ответ системы. Отправителю сообщается, что его послание не удалось доставить.

4. Письмо возникло как уведомление администратору. Сообщается, что есть проблемы c протоколом SMTP или настройки нарушены. Чтобы доставить письмо, сначала запускается процесс cleanup, а потом оно ставится в очередь. 

Как происходит доставка

Сообщения, поставленные в очередь incoming, должны быть доставлены адресатам. 

Queue manager — менеджер очередей. Когда приходит сигнал о прибытии новой почты, он ставит ее в активную очередь active и отправляет запрос демону trivial-rewrite. Он сообщает, локальный это адрес или удаленный. Дополнительные сведения находятся в файле Postfix transport.

Менеджер очередей на основе анализа данных выбирает программы доставки. Перечислим их.

  • Агент Local доставляет корреспонденцию внутри системы. Несколько таких процессов запускаются одновременно.
  • Virtual — урезанная версия Local. Виртуальная доставка применима к п/я в формате mailbox. С *.forward и системными псевдонимами работа не предусмотрена.
  • SMTP подключается, если послание адресовано удаленному клиенту. Менеджер очередей передает сведения о получателе: наименование очереди, адресные данные, домен или хост. По завершении пересылки выдается ее статус, например, успешно, фатальная ошибка или временная ошибка.
  • LMTP доставляет корреспонденцию локальному/удаленному серверу, предназначенному для сбережения п/я. Принцип работы LMTP аналогичен SMTP, но протоколы разные.
  • Интерфейс Pipe mailer работает с транспортными агентами со стороны, например, с UUCP. 

Виды очередей

Если доставка сорвалась, Queue manager отсылает это послание в директорию, выделенную отложенным сообщениям. Спустя какое-то время будет предпринята повторная проба. Если вам нужно попытаться отправить письмо раньше, запустите команду postfix flush.

Corrupt — очередь, куда отсылаются сообщения, которые повреждены, не читаются или у них недействительный формат. Подозрительные данные изолируются, пока администратор не примет решение о дальнейших действиях. 

Очередь hold — для тех писем, которые были приостановлены. Из этого состояния их можно вывести специальной командой.

Стратегии

Queue manager умеет функционировать в различных режимах/стратегиях, или комбинировать их. 

  • Leaky bucket. При этой стратегии число писем в активной очереди ограничивается.
  • Fairness. Если не заполнена активная очередь, то берутся письма, залежавшиеся в отложенной и входящей очередях.
  • Slow start. Режим направлен на предотвращение заторов, которые происходят, когда получатель задерживается с обработкой запросов. Подстройка проводится путем регулирования числа попыток одновременной отправки.
  • Round robin. Queue manager рассортировывает по очередям корреспонденцию в соответствии с местом доставки.
  • Exponential backoff. Та почта, что не отправилась с первого раза, уходит в отложенную очередь. Ее тайм-аут после последующих неудачных попыток умножается на 2. Это позволяет не тратить ресурсы на нерабочие узлы.
  • Кэширование статуса. Queue manager работает с таблицей, в которой содержатся статусы неудачных попыток доставки. 

Итоги

Настройте для пересылки почты собственный клиент, если планируете:

  • отправлять сообщения пользователей сервера за пределы локальной сети;
  • мониторить оборудование;
  • получать извещения о происшедших событиях. 

Число отказов снизится, а вероятность доставки возрастет с уменьшением количества посредников при пересылке писем.

В программе Postfix, server пересылает корреспонденцию либо напрямую, непосредственно на почтовый сервер адресата, либо через relay (посредника). Почтовик легко устанавливается и запускается, но нужно понимать тонкости его работы, чтобы внедрить или разобраться в проблемах.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону