Linux 如何禁止出站 SMTP?正确封禁 25、465、587 端口

· 发布:iVPSer · Linux教程

服务器不需要发邮件时,可以阻止它主动连接外部 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 等工具可能建立自己的转发链,主机普通规则未必覆盖容器流量。