我正在尝试设置 Postfix,以便仅当邮件来自本地主机并且发往特定域时才转发邮件。但是,一旦我指定了中继服务器,所有内容(本地投递除外)都会发往那里。我以为我的限制错了,所以我最终选择“拒绝所有内容”,但邮件仍然会通过。想知道是否mynetworks
会绕过所有内容,我未定义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
Postfix 术语中的中继服务器是 Postfix 将所有非本地电子邮件传送到的服务器(例如,公司内部网络中的 Postfix 会将公司的主电子邮件服务器定义为其中继,因此它根本不会尝试联系目标服务器)。这用于发送电子邮件,由relayhost
指示。
Postfix 通过配置来知道哪些域是他的mydestination
指令。此列表中的域名将在本地交付(如果它们具有正确的 MX 记录)。
主办方mynetworks
允许从任何地方向任何地方发送电子邮件。因此,您应该在此处仅设置您信任的网络(仅限本地主机或内部网络)。据说 Postfix 会将这些主机上的电子邮件转发到互联网。这是默认设置,在v2.10smtpd_relay_restrictions
或smtpd_recipient_restrictions
之前版本中设置了该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
另一个很好的 Postfix 调试提示:本地反弹消息(即,立即拒绝中继)仍然包含中继主机的名称,即使中继主机没有受到影响!
我也研究过master_service_disable = inet
,但是足够多的东西通过连接到 localhost:25 来处理本地邮件发送,所以它并不实用。