背景
我认为我的 POSTFIX 设置已接近我所期望的水平。我运行了一些 SMTP 在线检查,我的 SMTP 通过了所有基本的安全测试。
我在 Thunderbird 中收到证书警告。我使用的是临时自签名证书,所以我知道为什么会出现证书异常。这不是我的问题。
目标
我想禁用 SMTP 服务器上任何未加密和未经身份验证的邮件发送。我只想使用 TLS。
问题
我不确定我是否有问题,但是当我连接 Thunderbird 时,我收到有关证书的警告端口 25。无论我使用哪种连接安全性或端口,我都会收到此警告。我已在端口 465 上尝试了 SSL/TLS,在 587 上尝试了 STARTTLS,在端口 25 上没有尝试。我希望证书位于端口 465 或 587 上。
另一个让我感到困惑的是,为什么我仍然可以设置 Thunderbird 使用没有安全性的端口 25,并且这个安全异常在发送时仍然会出现。
发送这封电子邮件仍然加密吗?
我是否遇到了我不知道的问题?
我怎样才能让我的服务器在端口 465 上响应?
postfix/master.cf
smtp inet n - - - - smtpd
-o smtpd_tls_auth_only=yes
-o smtp_sasl_auth_enable=no
-o smtp_tls_security_level=none
# SMTP with TLS on port 587. Currently commented.
submission inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_enforce_tls=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
-o smtpd_sasl_tls_security_options=noanonymous
-o smtpd_sasl_security_options=noanonymous,noplaintext
# SMTP over SSL on port 465.
smtps inet n - - - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
-o smtpd_sasl_security_options=noanonymous,noplaintext
-o smtpd_sasl_tls_security_options=noanonymous
后配置-n
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
content_filter = amavis:[127.0.0.1]:10024
disable_vrfy_command = yes
dovecot_destination_recipient_limit = 1
enable_original_recipient = no
header_checks = regexp:/etc/postfix/header_checks
inet_interfaces = all
mailbox_size_limit = 0
maximal_backoff_time = 8000s
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
mydestination =
myhostname = localbark.info
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mynetworks_style = host
myorigin = /etc/hostname
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
smtp_helo_timeout = 60s
smtp_sasl_security_options = noplaintext, noanonymous
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_delay_reject = yes
smtpd_hard_error_limit = 12
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
smtpd_recipient_limit = 16
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_relay_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
smtpd_soft_error_limit = 3
smtpd_tls_CAfile = /rootCA.pem
smtpd_tls_cert_file = /device.crt
smtpd_tls_key_file = /device.key
smtpd_tls_loglevel = 3
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
unknown_local_recipient_reject_code = 450
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
virtual_gid_maps = static:8
virtual_mailbox_base = /var/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_transport = dovecot
virtual_uid_maps = static:150
2015 年 1 月 27 日更新
我的邮件服务器正在使用 STARTTLS,但仅在端口 25 上使用。并且邮件在端口 25 上成功发送。当我尝试在 587 上使用 STARTTLS 时,我的邮件客户端 (Thunderbird) 超时。以下是 mail.log 文件中的内容
Jan 27 11:55:21 mail2 postfix/submission/smtpd[2229]: initializing the server-side TLS engine
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: warning: hostname XXXXXXX.com does not resolve to address XX.XX.XX.XX: Name or service not known
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: connect from unknown[XX.XXX.XX.XX]
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: setting up TLS connection from unknown[XX.XXX.XX.XX]
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: unknown[XX.XXX.XX.XX]: TLS cipher list "aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH"
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: SSL_accept:before/accept initialization
Jan 27 11:55:22 mail2 postfix/submission/smtpd[2229]: read from 7F3F40B73C60 [7F3F40B86E70] (11 bytes => -1 (0xFFFFFFFFFFFFFFFF))
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: read from 7F3F40B73C60 [7F3F40B86E70] (11 bytes => 0 (0x0))
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: SSL_accept error from unknown[XX.XXX.XX.XX]: lost connection
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: lost connection after CONNECT from unknown[XX.XXX.XX.XX]
Jan 27 11:57:11 mail2 postfix/submission/smtpd[2229]: disconnect from unknown[XX.XXX.XX.XX]
以下是远程计算机通过 telnet 访问 587 时得到的结果
telnet mail.example.com 587
Trying xxx.xxx.xxx.xx...
Connected to mail.example.com.
Escape character is '^]'.
ehlo testing
Connection closed by foreign host.
答案1
好吧,看起来你把 SMTPD 与 SMTP 混淆了。从后缀的角度来看,这两个东西有不同的用途。SMTPsmtpd
服务器用于接收电子邮件,它绑定到特定端口(例如 25、587、465)。SMTPsmtp
客户端用于发送电子邮件,它连接到 SMTP 服务器端口。
这里的另一个混淆是关于 STARTTLS、SMTPS 和未加密电子邮件。默认情况下,postfix 将发送和接收未加密的电子邮件。对于加密方法,SMTP 有两种模式:STARTTLS 和 SMTPS。使用 STARTTLS,客户端将以未加密的形式启动连接,然后稍后将其升级为加密形式。现在 SMTP 的 SMTPS 就像 HTTP 的 HTTPS。与 STARTTLS 不同,客户端将通过 TLS 协商启动连接,然后在顶部 TLS 上启动 SMTP 闲聊。通常具有 STARTTLS 功能的 smtpd 在端口 587 上监听,STMPS 在端口 465 上监听。有关其他参考,请参阅此 SO 问题:465端口和587端口有什么区别?
现在,我们将讨论 postfix。默认情况下,postfix 中的每个进程都将从中获取配置main.cf
(您可以通过上述方式查看更改postconf -n
)。当然,您可以通过覆盖每个 postfix 服务,master.cf
就像您对不同端口的三个 smtpd 进程所做的那样。在这种情况下,您想要覆盖该选项,因此
- 端口 25 (smtp) 不应向您发出证书警告,也不应提供 STARTTLS
- 端口 587(提交)应提供 STARTTLS 并向您发出证书警告
- 端口 465 (smtps) 应与 SMTPS 通信并向您发出证书警告
要关闭端口 25 中的证书警告,只需smtpd_tls_security_level = none
指定
smtp inet n - - - - smtpd
-o smtpd_tls_auth_only=yes
-o smtpd_sasl_auth_enable=no
-o smtpd_tls_security_level=none
您会注意到,我将smtp_
参数替换为smtpd_
。请参阅官方文档smtpd_tls_security_level。
要为端口 465 启用 SMTPS,请使用参数smtpd_tls_wrappermode = yes
。上面的配置看起来没问题。
现在,因为我们需要在端口 587 上使用 STARTTLS(而不是 SMTPS),所以您不需要smtpd_tls_wrappermode = yes
在提交服务中指定。将其删除。
连接到端口 587 时出现的错误就是由此引起的smtpd_tls_wrapper模式参数。Postfix 希望您使用加密流量进行通信,并以纯文本形式指定命令。
答案2
该参数-o smtpd_tls_wrappermode=yes
导致邮件服务器不响应协议sumission
。我刚从 master.cf 中删除该参数,EHLO 就收到了对端口 587 上的 telnet 的响应,Thunderbird 邮件客户端成功将邮件发送到端口 587 而不是 25。因此,下面是我的 master.cf 提交 (TLS) 协议代码片段:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_enforce_tls=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
-o smtpd_sasl_tls_security_options=noanonymous
-o smtpd_sasl_security_options=noanonymous,noplaintext
# -o smtpd_tls_wrappermode=yes # This one was the issue*****
我想知道我是否只是盲目地看不到导致问题的原因。我没有在 postfix 文档中或在 serverfault.com、Google 等网站上的任何搜索中看到任何参考。
希望这能在未来帮助到一些不幸的可怜人。:-)
答案3
除了 postfix 配置之外,你还应该使用类似的工具https://www.wireshark.org/检查传输过程中到底发生了什么。您还应该看到 STARTTLS 和(未)加密的流量。