Linux 如何禁止出站 SMTP?正确封禁 25、465、587 端口
服务器不需要发邮件时,可以阻止它主动连接外部 SMTP 服务。真正需要限制的是 TCP 25、465 和 587;110、143、993、995 用于 POP3 或 IMAP 收信,不应因为“都是邮件端口”一起封掉。
防火墙只能减小被滥用后的影响,不能替代查杀、更新和凭据轮换。已经收到 abuse 投诉时,先保存必要日志并找出发信进程,再加规则。
先确认业务是否需要发信
网站注册、密码找回、监控告警和账单系统可能通过 SMTP 发信。先查应用配置和当前连接:
sudo ss -ntp | grep -E ':(25|465|587)\b'
如果应用使用邮件服务商的 HTTPS API,封 SMTP 通常不影响它;仍要按实际域名和端口验证。云厂商本身可能已经限制 25 端口,这不代表 465、587 也被封。
Ubuntu、Debian 使用 UFW
先查看 UFW 是否正在管理防火墙:
sudo ufw status verbose
确认已启用后,添加三条出站拒绝规则:
sudo ufw deny out 25/tcp
sudo ufw deny out 465/tcp
sudo ufw deny out 587/tcp
sudo ufw status numbered
回滚时先从 status numbered 找到规则编号,再用 sudo ufw delete 编号 删除。不要在远程服务器上为整理规则而随手重置整个 UFW。
RHEL 系使用 firewalld policy
当前 firewalld 已弃用 --direct 接口,出站过滤应使用 policy。下面创建一条从本机到任意外部区域的策略:
sudo firewall-cmd --permanent --new-policy block-outbound-smtp
sudo firewall-cmd --permanent --policy block-outbound-smtp --add-ingress-zone HOST
sudo firewall-cmd --permanent --policy block-outbound-smtp --add-egress-zone ANY
sudo firewall-cmd --permanent --policy block-outbound-smtp --add-rich-rule='rule port port="25" protocol="tcp" reject'
sudo firewall-cmd --permanent --policy block-outbound-smtp --add-rich-rule='rule port port="465" protocol="tcp" reject'
sudo firewall-cmd --permanent --policy block-outbound-smtp --add-rich-rule='rule port port="587" protocol="tcp" reject'
sudo firewall-cmd --reload
核对持久化结果:
sudo firewall-cmd --permanent --info-policy block-outbound-smtp
要完整回滚,删除这条 policy 后 reload:
sudo firewall-cmd --permanent --delete-policy block-outbound-smtp
sudo firewall-cmd --reload
旧教程常见的 firewall-cmd --direct 已被官方标记为弃用,详见 firewalld policy 文档。
验证时不要真的发送测试邮件
用已有应用的无副作用连接检查,或从防火墙计数器和日志确认规则命中。不要为了“测一下”向外部地址发送邮件,也不要把 SMTP 密码写进终端历史。
如果拦截后仍有投诉,继续检查容器网络、旁路防火墙和云平台出口。Docker 等工具可能建立自己的转发链,主机普通规则未必覆盖容器流量。