воскресенье, 8 июня 2014 г.

Postfix как локальный SMTP-ретранслятор

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

Возможно это не самая подходящая программа для использования в подобных целях, тем не менее она довольно распространена и обладает достаточной гибкостью для того, чтобы её можно было использовать даже таким нестандартным способом. В сочетании с локальными fetchmail и dovecot можно вообще организовать полнофункциональную локальную почтовую систему, не имеющую постоянного доступа в интернет и всё же работающую ожидаемым образом через внешние серверы в интернете.

Для начала установим необходимые пакеты:
# apt-get install postfix libsasl2-modules bsd-mailx
Для отправки почты с подменой отправителя и аутентификацией на сервере провайдера можно настроить Postfix. Настроим в файле /etc/postfix/main.cf следующую конфигурацию:
# Имя сервера и его почтового домена
myhostname = server.domain.tld
mydomain = domain.tld

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

# К адресам локальных отправителей добавлять этот домен
masquerade_domains = domain.tld

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

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

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

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

# Если в таблице отправителей нет соответствия, использовать этот почтовый сервер ISP
relayhost = [mailserver.domain.tld]:587

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

# Разрешаем использовать механизмы аутентификации PLAIN и LOGIN
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login
После настройки самого Postfix, его можно перезапустить, чтобы настройки вступили в силу:
# /etc/init.d/postfix restart
Теперь создадим необходимые карты. Укажем в файле /etc/aliases, на какие ящики на сервере провайдера перенаправлять почту для локальных пользователей:
postmaster root
root recipient@domain.tld
Почта для пользователя root будет перенаправляться в ящик recipient@domain.tld.

Укажем в файле /etc/postfix/sender_maps, какой ящик на сервере провайдера использовать для отправки почты от локального отправителя:
root 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:password
Когда пользователь root попытается отправить почту, письмо, в соответствии с настройками в файле /etc/postfix/sender_maps, будет отправлено с адреса sender@domain.tld. Письмо от этого отправителя, в соответствии с настройками в файле /etc/postfix/sender_relays, нужно отправить через порт 587 сервера mailserver.domain.tld. В соответствии с настройками в этом файле для аутентификации на сервере провайдера нужно будет использовать имя пользователя sender и пароль password.

Для файла /etc/postfix/passwords стоит задать разрешения, ограничивающие возможность подсмотреть пароли локальными пользователями системы:
# chown root:root /etc/postfix/passwords
# chmod ug=rw,o= /etc/postfix/passwords
При каждом обновлении файлов карт нужно не забывать обновлять их двоичные копии одной из следующих команд:
# postalias /etc/aliases
# postmap /etc/postfix/sender_maps
# postmap /etc/postfix/sender_relays
# postmap /etc/postfix/passwords
Двоичные копиии имеют то же имя, но с расширением .db. Права доступа к оригинальному файлу полностью переносятся и на его двоичную копию.

Осталось проверить правильность работы системы. Попробуем отправить тестовое письмо от имени пользователя root пользователю root:
# mail -s test root
test
.
На ящик recipient@domain.tld должно прийти письмо от ящика sender@domain.tld.

5 комментариев:

Alexey комментирует...

У меня с этим:
sender_canonical_maps = hash:/etc/postfix/sender_maps
не заработало, но получилось с этим:
smtp_generic_maps = hash:/etc/postfix/sender_maps

Сергей комментирует...

Как настроить postfix когда у тебя для виртуального сервера стоит основным 1 домен, но почту надо отправлять от другого домена?

morbo комментирует...

Сергей, вопрос не понятен.

Где для виртуального сервера стоит основным один домен? Важно ли, что сервер виртуальный? При чём тут другой домен? Почему почта отправляется не с почтового ящика, а с домена?

В контексте этой статьи не вижу проблем с отправкой почты с какого угодно домена, если указать правильные настройки почтового ящика. Можно отправлять хоть с домена gmail.com, если почтовый ящик на gmail завести и прописать его настройки.

Сергей комментирует...

у меня была следующая ситуация, на ubuntu стоял exim4 и dovecot с панелью веста, из за не правильных конфигов МХ записей не правильно работала почта, я решил поставить постфикс, получился конфликт с ексимом, но так как я с линуксом на Вы, я то удалял то ставил все подряд, пока не понял кто за что отвечает и не снес постфикс с довекот, перенастроил конфиги ДНС и все заработало
Но вопрос вот такой, если основным доменом виртуального сервера является один сайт, а почта отправляется от другого сайта, как настроить постфикс, чтобы основной домен не попадал в заголовки писем другого домена на этом же сервере?

morbo комментирует...

Сергей, если человек в принципе не понимает что и как работает, то любое объяснение будет для него недостаточным.

Краткий ответ - никак.

Вот вам пример (лишнее вырезано):
$ dig mail.ru MX
mail.ru. 146 IN MX 10 mxs.mail.ru.

$ dig bk.ru MX
bk.ru. 3202 IN MX 10 mxs.mail.ru.

$ telnet mxs.mail.ru 25
Trying 94.100.180.104...
Connected to mxs.mail.ru.
Escape character is '^]'.
220 Mail.Ru ESMTP
EHLO stupin.su
250-mx163.mail.ru ready to serve
250-STARTTLS
250-SIZE 73400320
250 8BITMIME
QUIT
221 mx163.mail.ru closing connection
Connection closed by foreign host.

Как вы ни старайтесь, а в заголовках письма всегда будет фигурировать домен mail.ru, даже если письмо отправлено с домена bk.ru, т.к. у почтового сервера имя не может совпадать сразу со всеми почтовыми доменами, которые он обслуживает.