Postfix из базовой системы NetBSD как локальный SMTP-ретранслятор

Ранее я уже настраивал Postfix в Debian: Postfix как локальный SMTP-ретранслятор и во FreeBSD: Postfix как локальный SMTP-ретранслятор во FreeBSD. Здесь я выложу ту же заметку, адаптированную применительно к NetBSD.

В целом настройка Postfix в NetBSD похожа на таковую во FreeBSD. Первое отличие заключается в том, что в NetBSD Postfix уже имеется в составе базовой системы. В Postfix из базовой системы NetBSD нет одной полезной для меня функции: поддержки словарей типа pcre. Убедиться в этом можно при помощи следующей команды:

# postconf -m | grep pcre

Словари pcre я использую для добавления к заголовкам писем имени сервера. Если вам не требуется такая функция, можете воспользоваться этой статьёй. Если же вам, как и мне, хочется чтобы к теме письма добавлялось имя сервера, с которого это письмо было отправлено, то рекомендую воспользоваться Postfix из pksrc. Его настройка описана в статье Postfix из pkgsrc как локальный SMTP-ретранслятор в NetBSD.

Настройка Postfix

Настроим Postfix для отправки почты с подменой отправителя и аутентификацией на сервере провайдера. Настроим в файле /etc/postfix/main.cf следующую конфигурацию:

# Имя сервера и его почтового домена
myhostname = server.domain.tld
mydomain = server.domain.tld

# Откуда и для кого принимать почту к доставке
inet_protocols = ipv4
inet_interfaces = 127.0.0.1
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8

# Карта соответствия локальных получателей адресам на почтовом сервере ISP
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases

# Использовать защищённые подключения при отправке писем
smtp_use_tls = yes

# Включаем выбор учётных данных на сервере провайдера в зависимости от отправителя
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relays

# Включаем использование аутентификации на сервере провайдера
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/passwords

# Разрешаем использовать механизмы аутентификации PLAIN и LOGIN
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login

# Карта соответствия локальных отправителей ящикам на почтовом сервере ISP
sender_canonical_maps = regexp:/etc/postfix/sender_maps

# Устанавливаем не более одного исходящего подключения на каждый домен
default_destination_concurrency_limit = 1

# Отключение опций совместимости с предыдущими версиями Postfix
compatibility_level = 2

# Отключение использования UTF-8 по умолчанию в адресах и темах писем
smtputf8_enable = no

Теперь создадим необходимые карты. Укажем в файле /etc/mail/aliases, на какие ящики на сервере провайдера перенаправлять почту для локальных пользователей. Я отредактировал уже имеющийся файл и вписал настоящие адреса получателей писем, адресованных root и operator:

# Well-known aliases -- these should be filled in!
root: recipient@domain.tld
operator: recipient@domain.tld

Почта для пользователя root будет перенаправляться в ящик recipient@domain.tld.

Укажем в файле /etc/postfix/sender_maps, какой ящик на сервере провайдера использовать для отправки почты от локального отправителя:

/^.*$/ sender@domain.tld

Когда пользователь root попытается отправить письмо, то на сервер провайдера оно уйдёт от отправителя sender@domain.tld.

Укажем в файле /etc/postfix/sender_relays, какой сервер следует использовать для отправки писем от определённого отправителя:

sender@domain.tld [mailserver.domain.tld]:587

Когда пользователь root попытается отправить почту, письмо, в соответствии с настройками в файле /etc/postfix/sender_maps, будет отправлено с адреса sender@domain.tld. Письмо от этого отправителя нужно отправить через порт 587 сервера mailserver.domain.tld.

Укажем в файле /etc/postfix/passwords учётные данные каждого из ящиков на сервере провайдера:

sender@domain.tld sender@domain.tld:password

Когда локальный пользователь попытается отправить почту, письмо, в соответствии с настройками в файле /etc/postfix/sender_maps, будет отправлено с адреса sender@domain.tld. Письмо от этого отправителя, в соответствии с настройками в файле /etc/postfix/sender_relays, нужно отправить через порт 587 сервера mailserver.domain.tld. В соответствии с настройками в этом файле для аутентификации на сервере провайдера нужно будет использовать имя пользователя sender@domain.tld и пароль password.

Для файла /etc/postfix/passwords стоит задать разрешения, ограничивающие возможность подсмотреть пароли локальными пользователями системы:

# chown root:wheel /etc/postfix/passwords
# chmod u=rw,g=r,o= /etc/postfix/passwords

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

# postalias /etc/mail/aliases
# postmap /etc/postfix/sender_maps
# postmap /etc/postfix/sender_relays
# postmap /etc/postfix/passwords

Двоичные копии имеют то же имя, но с расширением .db. Права доступа к оригинальному файлу полностью переносятся и на его двоичную копию.

Включение Postfix

По умолчанию Postfix должен быть уже включен. Убедимся, что в файле /etc/rc.conf прописана следующая опция:

postfix=YES

Исторически сложилось так, что первой почтовой системой был Sendmail и в течение некоторого времени не существовало никаких других систем. Поэтому многие программы, взаимодействующие с почтовой системой, были написаны в расчёте только на Sendmail. Возникшие позже почтовые системы в целях совместимости как правило поставляются вместе с некоторыми утилитами, имитирующими таковые из состава Sendmail. Чтобы безболезненно менять почтовую систему в NetBSD предусмотрен файл /etc/mailer.conf, в котором прописаны полные пути к утилитам, имитирующим Sendmail. Именно при помощи этого файла можно заменить Postfix из базовой системы NetBSD на Postfix (или другую почтовую систему) из pkgsrc.

Убедимся, что файл /etc/mailer.conf указывает на утилиты из базовой системы. Содержимое файла должно быть таким:

#       $NetBSD: mailer.conf,v 1.18 2011/07/24 08:28:11 mbalmer Exp $
#
# This file configures /usr/sbin/mailwrapper, which selects the MTA
# (Mail Transport Agent) that is invoked when programs like
# /usr/sbin/sendmail are executed.
# 
# See mailwrapper(8) and mailer.conf(5) for an explanation of how this works.
# See also rc.conf(5) and afterboot(8) for more details on setting up an MTA.
#
# The following configuration is correct for Postfix.
#
# Notes for running postfix:
#  - postfix configuration requires either 
#    hostname to be a FQDN, or for $mydomain 
#    to be set in /etc/postfix/main.cf
#  - postfix does not listen on the network
#    by default; to enable inbound mail reception,
#    configure /etc/postfix/main.cf and then uncomment
#    the smtp service in /etc/postfix/master.cf
#
sendmail        /usr/libexec/postfix/sendmail
mailq           /usr/libexec/postfix/sendmail
newaliases      /usr/libexec/postfix/sendmail

Теперь, когда с настройкой покончено, настало время перезапустить Postfix. Для этого выполним следующую команду:

# /etc/rc.d/postfix restart

Проверка отправки почты

Осталось проверить правильность работы системы. Попробуем отправить тестовое письмо от имени пользователя root пользователю root:

# mail -s test root
test
.

На ящик recipient@domain.tld должно прийти письмо от ящика sender@domain.tld.