Linux 防火墙配置错误,端口被恶意扫描
Linux防火墙配置错误导致端口被恶意扫描?这份排查与加固指南请收好
刚接触Linux服务器运维的朋友,常常会遇到一个棘手的问题:明明装了防火墙,服务器端口还是被公网扫描器频繁探测。
很多时候,这并不是防火墙没装,而是配置不合理,导致端口裸奔。
本文将带你从零开始,检查并修复常见的Linux防火墙配置错误,有效防御恶意端口扫描。
准备工作:先摸清底牌
在动手修改防火墙之前,先确认两件事:
- 防火墙工具是哪款?主流Linux发行版常用
iptables(传统)或firewalld(新版CentOS/RHEL 7+),Ubuntu也支持ufw。 - 当前正在监听哪些端口?运行以下命令查看系统监听端口:
ss -tlnp
或(老系统用)
netstat -tlnp
重点关注 0.0.0.0:端口 或 :::端口 的条目,表示该端口对所有IP开放。如果这些端口在防火墙规则中没有限制来源IP,就相当于对公网裸奔。
第一步:检查当前防火墙规则是否出错了
使用 firewalld(CentOS/RHEL 8+)
sudo firewall-cmd --list-all
输出会包含 ports: 和 services: 等行。
例如看到 ports: 3306/tcp,表示MySQL端口已开放。如果本应只允许内网访问的端口出现在这里,就是配置错误。
使用 iptables(传统)
sudo iptables -L -n --line-numbers
检查 Chain INPUT 下是否有允许所有来源访问目标端口的规则,例如:
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
这样的规则意味着任何人都能访问SSH端口,非常危险。
使用 ufw(Ubuntu)
sudo ufw status numbered
查看是否开放了不必要的端口。
第二步:修复配置错误,精准放行必要端口
修复原则:只允许必要的来源IP访问特定端口,其他一律拒绝。
场景1:仅允许内网访问MySQL(3306)
- firewalld:
sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
sudo firewall-cmd --permanent --zone=internal --add-port=3306/tcp
sudo firewall-cmd --reload
- iptables:
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
- ufw:
sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw deny 3306 # 注意顺序:先允许,后拒绝(ufw默认按顺序处理)
场景2:删除冗余的对外开放规则
- firewalld:移除端口
sudo firewall-cmd --permanent --remove-port=3306/tcp
sudo firewall-cmd --reload
- iptables:删掉对应行(先用
iptables -L -n --line-numbers找到行号)
sudo iptables -D INPUT 行号
- ufw:删除规则编号(通过
sudo ufw status numbered查看)
sudo ufw delete 编号
第三步:验证修复效果,确认扫描已失效
- 查看新规则:重复第一步的命令,确认不必要的端口已关闭,或者来源IP已限制。
- 主动扫描测试:在另一台机器或使用在线端口扫描工具(如 [yougetsignal.com/tools/open-ports]())扫描服务器公网IP。之前开放的端口现在应显示“closed”或“filtered”,而非“open”。
- 查看系统日志:检查是否有来自恶意扫描的拒绝记录。
sudo journalctl -u firewalld | grep -i denied
sudo tail -f /var/log/messages | grep -i drop
如果看到大量 DROP 条目,说明防火墙已经生效,恶意扫描被拒绝。
避坑指南
- 别忘记保存规则:
iptables规则重启后失效,需执行sudo iptables-save > /etc/iptables/rules.v4(Ubuntu)或sudo service iptables save(CentOS 6)。firewalld和ufw会自动持久化。 - 千万别在远程连接中关闭SSH端口:如果错误地封掉了自己的SSH端口(22),将无法再远程登录。建议先加一条允许自己IP的规则,或用
screen等工具保留回退路径。 - 内网服务不要在公网防火墙放行:数据库、Redis等内部组件,永远只绑定内网IP或通过防火墙限制来源IP。使用
ss -tlnp核对监听地址是否为127.0.0.1或内网地址。 - 默认规则策略:
iptables默认策略建议设为DROP(丢弃),只放行明确允许的流量。修改默认策略:sudo iptables -P INPUT DROP,但执行前确保已放行SSH。
高频问题解答
Q: 为什么我关掉了端口,扫描器仍然显示开放?
A: 可能原因:1) 防火墙未重载配置;2) 服务本身监听在 0.0.0.0,但防火墙规则没有生效;3) 云服务商的安全组开放了该端口,需同步检查云平台控制台。
Q: firewalld 和 iptables 能同时用吗?
A: 不建议。二选一,否则规则会混乱。新系统优先用 firewalld,更友好。
Q: 如何临时关闭防火墙应急?
A: sudo systemctl stop firewalld(firewalld)或 sudo iptables -P INPUT ACCEPT(iptables),但记得事后恢复。
总结
Linux防火墙配置错误是端口被恶意扫描的头号原因。
通过本文的步骤,你可以快速定位并修复常见错误:检查规则 → 精确放行 → 验证 → 持久化。
记住:最小权限原则 + 默认拒绝 + 内网隔离,能大幅降低服务器暴露风险。
如果你在处理类似问题,建议按顺序执行一遍,遇到异常优先回看避坑部分。
安全加固不是一次性的,定期审查规则同样重要。