关闭Postfix中继后服务器仍发送垃圾邮件的排查方法求助
看起来你的服务器确实遇到了未授权发信的问题,结合你贴出的Postfix配置和邮件日志,咱们一步步来定位问题根源:
先抓日志里的关键线索
从你提供的mail.log片段能看到核心信息:
May 30 06:16:47 Ubuntu-T postfix/pickup[35351]: 87478220358: uid=33 from=
uid=33对应的是Linux系统里的www-data用户——也就是运行Nginx/PHP-FPM的Web服务用户,这说明垃圾邮件是从你服务器内部的Web进程发出来的,不是外部攻击者通过中继漏洞发的,你之前配置的中继限制(smtpd_relay_restrictions)是生效的,问题出在本地进程的未授权调用。
第一步:排查Web服务进程(重点是WordPress站点)
既然是www-data在发信,大概率是某个WordPress站点被入侵了,先做这些检查:
- 逐个检查所有WordPress站点的
wp-content/plugins、wp-content/themes目录,找有没有陌生文件名(比如乱码、带奇怪后缀的PHP文件),或者最近被修改过的可疑文件(用ls -lt按修改时间排序查看)。 - 登录每个WordPress后台,检查用户列表,有没有新增的陌生管理员账号,或者原有账号的权限被篡改。
- 打开
wp-config.php文件,看末尾有没有被添加恶意代码(比如隐藏的eval、base64_decode之类的内容)。 - 查看Nginx的访问日志(
/var/log/nginx/access.log),找有没有大量异常请求:比如频繁访问xmlrpc.php的暴力破解请求、访问可疑路径(比如/wp-admin/xxxx.php)的请求。
第二步:追踪具体发信的进程
要精准定位是哪个脚本在调用Postfix发信,可以用系统监控工具:
- 用auditd追踪:先安装auditd(
sudo apt install auditd),然后添加追踪规则:
之后实时查看audit日志:sudo auditctl -a exit,always -F uid=33 -F comm=sendmail
当再有垃圾邮件发送时,日志里会显示触发sendmail的进程路径和PID,顺着这个线索就能找到恶意脚本。tail -f /var/log/audit/audit.log - 用strace临时监控:先找出所有
www-data的进程:
对可疑的PHP-FPM进程(比如PID比较新的)执行strace,监控它的系统调用:ps aux | grep www-data
如果这个进程在发信,就能捕捉到它调用sendmail的行为,进而定位到对应的脚本文件。sudo strace -p <进程PID> -e execve
第三步:修复Postfix配置的小问题
你贴的main.cf里有个语法错误:
smtpd_recipient_restrictions = reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_non_fqdn_recipient,>
最后那个,>是不完整的,先把这个修复成合法的配置(比如补全规则或者删掉多余的符号),避免Postfix加载配置时出现异常。
另外,检查/etc/postfix/sasl/sasl_passwd的权限,必须设置为600且属主是root,防止其他用户读取你的Gmail认证信息:
sudo chmod 600 /etc/postfix/sasl/sasl_passwd sudo postmap /etc/postfix/sasl/sasl_passwd sudo systemctl reload postfix
第四步:临时止损(可选)
如果垃圾邮件发得很频繁,想先止住的话,可以临时限制www-data发信,但注意这会影响WordPress的正常邮件(比如密码重置、订单通知):
在main.cf里添加:
smtpd_sender_login_maps = hash:/etc/postfix/sender_login_maps smtpd_sender_restrictions = reject_sender_login_mismatch, permit_sasl_authenticated, permit_mynetworks
然后创建/etc/postfix/sender_login_maps文件,只允许需要发信的用户(比如你的合法邮箱):
your-legit-email@gmail.com your-legit-email@gmail.com
生成哈希文件并重启Postfix:
sudo postmap /etc/postfix/sender_login_maps sudo systemctl restart postfix
备注:内容来源于stack exchange,提问作者Henri

