воскресенье, 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.

1 комментарий:

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

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