问题
大概1周之前,我的一台Debian 11的机器,上面的邮件转发服务无法正常工作了。经过检查,监听25端口的sendmail服务不见了,只剩下我做的邮件验证服务和nginx对外监听的587和465端口。
这个问题该如何解决?
排查
从报错信息入手
首先查看sendmail的服务的报错信息
1 2 |
systemctl status sendmail |
通过systemctl查看服务状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
● sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent Loaded: loaded (/etc/init.d/sendmail; generated) Active: active (running) since Sat 2024-12-14 22:57:58 CST; 42s ago Docs: man:systemd-sysv-generator(8) Process: 17402 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 1112) Memory: 8.7M CPU: 112ms CGroup: /system.slice/sendmail.service └─17512 /usr/sbin/sendmail-mta -Am -L sm-mta -bd -q10m Dec 14 22:58:21 ali-qd-0001 sm-mta[17512]: daemon MSP-v4: problem creating SMTP socket Dec 14 22:58:23 ali-qd-0001 sm-mta[17486]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MSP-v4: cannot bind: Address already in use Dec 14 22:58:23 ali-qd-0001 sm-mta[17486]: daemon MSP-v4: problem creating SMTP socket Dec 14 22:58:23 ali-qd-0001 sm-mta[17486]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MSP-v4: server SMTP socket wedged: exiting Dec 14 22:58:26 ali-qd-0001 sm-mta[17512]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MSP-v4: cannot bind: Address already in use Dec 14 22:58:26 ali-qd-0001 sm-mta[17512]: daemon MSP-v4: problem creating SMTP socket Dec 14 22:58:31 ali-qd-0001 sm-mta[17512]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MSP-v4: cannot bind: Address already in use Dec 14 22:58:31 ali-qd-0001 sm-mta[17512]: daemon MSP-v4: problem creating SMTP socket Dec 14 22:58:36 ali-qd-0001 sm-mta[17512]: NOQUEUE: SYSERR(root): opendaemonsocket: daemon MSP-v4: cannot bind: Address already in use Dec 14 22:58:36 ali-qd-0001 sm-mta[17512]: daemon MSP-v4: problem creating SMTP socket |
似乎是sm-mta服务无法启动,但是为什么是报告MSP-v4无法监听端口呢?
使用netstat -ntlp
查看, 没有其他服务占据25端口,所以应该不是25端口被其他服务占用的问题。
使用搜索引擎搜索相关问题
这次我搜先搜索了下google,真的没有发现什么有效的信息。
从端口配置入手
那还是继续排查下,看一下关于sendmail的配置文件。
经过搜索,sendmail的有效配置文件是/etc/mail/sendmail.cf
从上往下看,有一个写着监听地址的位置引起了我的注意
1 2 3 4 5 |
# SMTP daemon options O DaemonPortOptions=Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1 O DaemonPortOptions=Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1 |
我看到了关键词MSP-v4,前面一行是MTA-v4,Port=smtp和Port=submission,会不会是这里有问题呢?
使用GPT-4o助理
这次为了确定端口是什么,我选择使用GPT-4o来询问下
O DaemonPortOptions=Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1
O DaemonPortOptions=Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1sendmail的这两个配置项会冲突么,会导致服务无法启动么
回复
您提到的 sendmail 配置项 DaemonPortOptions 中的两个条目:
O DaemonPortOptions=Family=inet, Name=MTA-v4, Port=smtp, > Addr=127.0.0.1
O DaemonPortOptions=Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1配置项说明
• DaemonPortOptions 用于定义 sendmail 的侦听端口及其相关属性。
• 这两个配置项分别用于以下目的:
1. MTA 端口 (smtp):
• Name=MTA-v4: 指定该端口为 MTA(Mail Transfer Agent),即邮件传输代理。
• Port=smtp: 指定端口为 SMTP(一般是 25 端口)。
• Addr=127.0.0.1: 指定地址为仅限本地访问。
2. MSP 端口 (submission):
• Name=MSP-v4: 指定该端口为 MSP(Mail Submission Program),用于邮件提交。
• Port=submission: 一般为 587 或 465 端口(或根据配置设定的其他端口)。
• Addr=127.0.0.1: 同样指定为本地访问。冲突与服务启动
这两个配置本质上是定义了两个不同的服务端口。以下是几个关键点:
- 不同功能: smtp 端口主要用于邮件的发送和接收,而 submission 端口用于客户端发送邮件(提交邮件)。因此,二者的功能是不同的。
- 不同端口:如果 submission 端口是 587(或其他未被使用的端口),与 smtp(25 端口)不会冲突。确保这两个端口没有被其他服务占用。
- 服务启动:在没有其他配置问题或端口占用(冲突)的情况下,这两个端口应当可以正常启动,二者不会互相冲突。
检查与建议
• 端口占用:使用命令行工具(如 netstat 或 ss)检查端口是否已被其他服务占用。例如:
netstat -tuln | grep :25
netstat -tuln | grep :587• 错误日志:如果 sendmail 无法启动,检查系统日志或 sendmail 的错误日志,通常能够提供更多的错误信息。
• 配置文件:确保没有其他的 DaemonPortOptions 配置项可能导致冲突。综合以上分析,这两个配置项在正常情况下不会导致服务冲突或无法启动。
回答中包含了submission默认是587,MSP服务是用于接收邮件提交的服务,这个部分原来我是交给nginx来承担的,为什么这个部分也被sendmail接管了呢?
尝试解决
到这里基本就清楚了。我把MSP这一行直接加#注释掉了,然后重启服务
1 2 |
systemctl restart sendmail |
等待了一会儿,再次使用netstat -ntlp | grep 25
发现确实看到有监听了。
然后尝试发了一封邮件,也能正常收到了。
至此问题解决。
后记
那这个问题是怎么造成的呢?
回想了一下,似乎上周我apt更新了所有服务,其中似乎包含sendmail的软件包,然后默认配置文件也一起更新了,于是就不能启动了。。。
如此说来,问题就在于sendmail的软件包的默认配置文件默认增加了MSP的配置文件,多监听了587端口。然后如此一来,587被nginx占用,于是sendmail就把自己的服务结束了,于是连25端口也不监听了。
感觉这种配置文件的更新实在是有点太坑了。。。