我有一台 Postfix 服务器,用于处理多个域的邮件。如果客户端请求 ist,服务器将使用 TLS 加密,但出于兼容性原因,目前不强制执行。
现在有一个新的域,该服务器应该为其处理邮件,应该强制执行 TLS,并且客户端必须使用客户端证书进行身份验证。
是否可以针对此场景配置 postfix,同时不更改所有其他域的设置?如果可以,该怎么做?
答案1
单个实例无法实现这一点smtpd
,但您可以smtpd
通过 配置多个实例master.cf
,因为您已经应该有一个实例用于处理端口上的传入邮件25
,另一个实例用于处理端口上的出站邮件465
(每个隐式 TLSRFC 8314,3)587
或提交使用纯文本和 STARTTLS。
我建议587
为旧客户端配置端口,因为它已经支持纯文本并且 TLS 仅通过 STARTTLS 可用,而在端口上465
TLS 握手立即开始 - 这完全符合新域的要求。
我们假设example.com
这是遗留域和example.net
受保护的域。
关键在于:
- 使用不同的
myhostname
配置 - 限制允许的发件人地址
smtpd_sender_restrictions=reject_unlisted_sender
在master.cf
:
# Legacy access on submission port 587 for example.com
submission inet n - - - - smtpd
-o myhostname=example.com
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_restrictions=reject_unlisted_sender
-o { smtpd_recipient_restrictions=
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_sasl_authenticated, reject }
# Client certificate required on port 465 for example.net
smtps inet n - - - - smtpd
-o myhostname=example.net
-o smtpd_tls_wrappermode=yes
-o smtpd_tls_req_ccert=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_restrictions=reject_unlisted_sender
-o { smtpd_recipient_restrictions=
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_sasl_authenticated, reject }
您甚至可以强制某些用户只能使用某些地址,这适用于两种配置,例如,
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual
-o { smtpd_sender_restrictions =
reject_unlisted_sender,
reject_sender_login_mismatch }