CentOS 邮件服务器连接问题排查与修复
一、快速定位思路
- 明确方向:是服务器对外发信被拒(出站),还是外部连不上你的 MTA(入站),或本机 mail 命令连第三方 SMTP 失败。
- 先看日志:定位 MTA 日志(常见为 /var/log/maillog 或 /var/log/mail.log),搜索关键字 error、warning、fail,优先从重复报错入手。
- 再看服务:确认 Postfix/sendmail 是否运行(如 systemctl status postfix),必要时查看端口监听与进程占用(如 ss -lntp | grep :25)。
- 网络连通:对外部 SMTP 做连通性测试(如 telnet smtp.xx.com 25/587/465),必要时用 mtr/traceroute 看链路质量。
二、常见原因与对应修复
- 云厂商封禁出站 25 端口:很多公有云默认阻断服务器对外 TCP 25,导致直连外域 SMTP 超时或连接被拒。优先改用 587(Submission,STARTTLS) 或 465(SMTPS) 出站;若业务必须 25,需在云控制台提交工单申请解封。
- 防火墙/安全组未放行:本机 firewalld 或云安全组未放行 25/465/587。放行示例:firewall-cmd --permanent --add-service=smtp --add-service=smtps --add-service=submission && firewall-cmd --reload;同时检查云安全组入/出站规则。
- 端口与协议不匹配:目标只支持 SMTPS(465) 时,客户端仍用 STARTTLS 会失败;或反之。请按服务商要求选择正确协议与端口(465=SSL,587=STARTTLS)。
- 认证与权限问题:日志出现认证失败或 Relay 被拒,检查 Postfix 的 smtpd_relay_restrictions、smtpd_sasl_auth_enable、mynetworks 等配置,确保发信域、SASL 与中继策略正确。
- 证书与信任链问题:使用 mailx/openssl 连接第三方 SMTP 出现证书不受信任或 “Error in certificate: Peer’s certificate issuer is not recognized.”,需将服务器证书导入本地 NSS 数据库(certutil -A),或改用受信任 CA 的证书。
三、面向本机 mail 命令连第三方 SMTP 的配置示例(QQ 邮箱)
- 安装与准备
- yum install -y mailx
- 在 QQ 邮箱开启 POP3/SMTP/IMAP,生成 授权码(第三方客户端专用密码)。
- 获取并信任服务器证书(消除证书告警)
- mkdir -p /root/.certs
- 465 端口:echo -n | openssl s_client -connect smtp.qq.com:465 -servername smtp.qq.com | sed -ne ‘/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p’ > /root/.certs/qq.crt
- 导入证书(NSS 数据库):certutil -A -n “QQ-SMTP” -t “P,P,P” -d /root/.certs -i /root/.certs/qq.crt
- 配置 /etc/mail.rc(或 ~/.mailrc)
- set from=123456@qq.com
- set smtp=smtps://smtp.qq.com:465
- set smtp-auth-user=123456@qq.com
- set smtp-auth-password=你的授权码
- set smtp-auth=login
- set ssl-verify=strict
- set nss-config-dir=/root/.certs
- 测试
- echo “test body” | mail -v -s “test subject” target@example.com
- 常见报错速解
- “535 Login Fail.”:账号或授权码错误,或需先在邮箱开启 SMTP 并使用授权码。
- “Unexpected EOF on SMTP connection”:端口/协议不匹配,465 用 smtps://,587 用 smtp:// 并启用 STARTTLS。
- 证书告警:改用 ssl-verify=strict 并正确导入根/中间证书到 NSS 数据库。
四、面向自建 MTA(Postfix)对外发信与入站连接
- 基本配置要点(/etc/postfix/main.cf)
- myhostname = mail.example.com
- mydomain = example.com
- inet_interfaces = all
- inet_protocols = ipv4
- mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
- home_mailbox = Maildir/
- smtpd_sasl_auth_enable = yes
- smtpd_sasl_security_options = noanonymous
- smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
- smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
- smtpd_tls_security_level = may
- smtpd_tls_cert_file = /etc/pki/tls/certs/localhost.crt
- smtpd_tls_key_file = /etc/pki/tls/private/localhost.key
- 启动与放行
- systemctl start postfix && systemctl enable postfix
- firewall-cmd --permanent --add-service={smtp,smtps,submission} && firewall-cmd --reload
- 测试
- 本机:telnet localhost 25(应见 220 欢迎语);或 openssl s_client -connect localhost:25 -starttls smtp
- 外部:从外网测试 telnet 你的公网IP 25/587/465,或邮件客户端配置 587/STARTTLS 或 465/SMTPS 发信。
五、DNS 与网络连通性检查清单
- DNS 记录:为发信域名配置有效的 MX 记录 指向你的 MTA;必要时配置 SPF、DKIM、DMARC 提升到达率与信誉。
- 连通性测试
- 解析:dig mx yourdomain.com +short;nslookup -type=mx yourdomain.com
- 端口:nc -vz smtp.xx.com 25/587/465;mtr/traceroute 排查链路丢包与绕行
- 本机监听:ss -lntp | egrep ‘:(25|465|587)’
- 云侧策略:再次确认云安全组与平台策略未阻断 25/465/587 的出站/入站流量。