Я пытаюсь настроить Postfix на ретрансляцию почты, только если она приходит с локального хоста, И только если она отправляется на определенный домен. Однако, как только я указал сервер ретрансляции, все (кроме локальной доставки) отправляется туда. Я думал, что неправильно указал ограничения, поэтому я в конце концов перешел на «отклонить все», и оно все равно проходит. Интересно, mynetworks
обходит ли все, я undefined mynetworks
. Все равно ретранслирует все.
На данном этапе postconf -n
дает:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = all
mailbox_size_limit = 0
mydestination = host.domain.com, localhost.domain.com, localhost
myhostname = host.domain.com
mynetworks =
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relay_domains = domain.com
relayhost = [mailserver.domain.com]:587
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_client_restrictions = reject
smtpd_recipient_restrictions = reject
smtpd_relay_restrictions = reject
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
Изначально я пытался сделать что-то вроде этого (показываю только, в чем разница):
mydestination = host.domain.com, localhost.domain.com, localhost
myhostname = host.domain.com
mynetworks = 127.0.0.1 [::1]/128
smtpd_client_restrictions = permit_mynetworks reject
smtpd_recipient_restrictions = permit_auth_destination reject
smtpd_relay_restrictions = permit_auth_destination reject
Я в растерянности. Нет транспортной таблицы. Postfix 2.11.0 (Ubuntu 14.04).
решение1
Relay server в терминологии postfix — это сервер, на который postfix будет доставлять всю нелокальную почту (например, postfix во внутренней сети компании определит основной почтовый сервер компании как свой relay, поэтому он вообще не будет пытаться связаться с серверами назначения). Он предназначен для отправки электронной почты и управляетсяrelayhost
директива.
Postfix знает, какие домены принадлежат ему, по конфигурацииmydestination
директива. Домены в этом списке будут доставлены локально (если у них есть правильная запись MX).
Хозяева вmynetworks
разрешено отправлять почту отовсюду и куда угодно. Поэтому вы должны указать здесь только ту сеть, которой вы доверяете (только localhost или внутреннюю сеть). Говорят, что postfix ретранслирует почту с этих хостов в интернет. Это настройка по умолчанию, которая установлена в smtpd_relay_restrictions
(или smtpd_recipient_restrictions
до v2.10) с использованием permit_mynetworks
значения. Если вы permit_mynetworks
полностью удалите этот параметр из конфигурации postfix, то mynetworks
он ничего не сделает.
Директиваrelay_domains
контролирует, для каких нелокальных доменов postfix принимает почту со всего мира. Обычно это используется, когда ваш postfix является резервным MX для некоторого домена.
Таким образом, в вашем случае конфигурация должна быть mynetworks
пустой (если оставить пустым невозможно, используйте какой-либо внутренний IP-адрес, который не используется в вашей сети, например 10.10.10.10)ИЛИудалить permit_mynetworks
из smtpd_client_restrictions
.
relay_domains = domain.com
mydestination = host.domain.com localhost
relayhost = [mailserver.domain.com]:587
решение2
Вот что я наконец-то заставил работать. Ключ был в том default_transport = error
, чтобы все, что не соответствует реле, просто отбрасывалось. Спасибо @Marki555 за то, что заставил меня думать дальше настроек smtpd.
default_transport = error
inet_interfaces = loopback-only
mydestination = host.domain.com, localhost.domain.com, localhost
myhostname = host.domain.com
mynetworks = 127.0.0.1 [::1]/128
relay_domains = domain.com
relay_transport = smtp
relayhost = [mailserver.domain.com]:587
smtpd_client_restrictions = permit_mynetworks reject
smtpd_recipient_restrictions = permit_auth_destination reject
smtpd_relay_restrictions = permit_auth_destination reject
Еще один хороший совет по отладке постфикса: локальное сообщение о недоставке (т. е. сообщение о немедленном отказе ретранслятора) все еще содержит в себе имя хоста ретранслятора, даже если хост ретранслятора не был затронут!
Я также рассмотрел master_service_disable = inet
, но там достаточно много всего, что обрабатывает локальную отправку почты путем подключения к localhost:25, поэтому это не совсем практично.