firewalld 防火墙配置教程:CentOS 服务器开放端口、限制 IP 访问与常见问题

适用场景与操作前的准备

firewalld 是 CentOS 7/8、RHEL、Rocky Linux、AlmaLinux 等系统的默认防火墙管理工具,在 Ubuntu 上对应的角色是 UFW。只要服务器使用这类系统,无论是开放网站端口、放行数据库远程访问、限制管理后台的登录 IP,还是排查"服务已经启动但外部连不上",都绕不开 firewalld。与直接写 iptables 规则相比,firewalld 通过区域(zone)和富规则(rich rule)把常用场景封装成了更易读的命令,出现误操作后也更容易回滚。

动手之前有三件事必须先做:一是确认当前 SSH 连接的端口,后续所有规则变更都要保证这个端口始终放行,否则一条错误的 drop 规则就可能让服务器失联;二是如果使用云服务器(阿里云、腾讯云等),要分清系统防火墙和云控制台"安全组"是两道门,只开一边依然访问不了;三是先执行 firewall-cmd --list-all 把现有规则保存下来,或者在修改前对系统做一次快照备份,出现意外时可以快速恢复。

第一步:查看 firewalld 运行状态与现有规则

修改任何规则之前,先确认 firewalld 本身在运行,并看清当前生效的规则。如果服务没有启动,后面所有的添加操作都不会真正过滤流量:

systemctl status firewalld
firewall-cmd --state
firewall-cmd --get-default-zone

--state 返回 running 表示防火墙正在工作;get-default-zone 显示默认区域,全新安装的 CentOS 一般是 public。接下来查看默认区域下的完整规则:

firewall-cmd --list-all

输出里的 interfaces 是网卡,sources 是来源,services 是放行的服务名(如 ssh、http),ports 是放行的端口,rich rules 是富规则。把这份输出保存好,它就是你的"改前基线",排查"改了什么导致异常"时非常有用。

第二步:开放与关闭端口

最常见的需求是开放业务端口。firewalld 的每条规则都有"运行时"和"永久"两个层级:直接 add 只对当前生效,重启或 reload 后丢失;加 --permanent 写入配置文件,但不会立即生效,需要再执行 --reload。规范做法是添加时同时带上 --permanent,然后统一 reload:

firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports

执行后用 --list-ports 检查 8080/tcp 是否出现在列表里。除了按端口号放行,firewalld 也支持按服务名放行,写起来更直观,例如放行网站和 SSH:

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

关闭端口时把 add 换成 remove,参数保持一致,同样要加 --permanent 并 reload。删除前建议先用 firewall-cmd --list-ports 确认端口拼写(含协议 tcp/udp)与添加时完全一致,否则 remove 会静默失败,这也是"删了规则端口还能访问"的常见原因。

firewalld 防火墙配置与数据中心网络安全
防火墙策略作用于服务器网络边界,规则变更前建议先保存现有规则作为回滚基线

第三步:限制 IP 访问(富规则 rich rule)

比"开端口"更安全的做法是"只给指定 IP 开口子",典型场景是数据库 3306、Redis 6379、面板端口只允许办公网或跳板机访问。这需要用到富规则,一条规则即可同时限定来源 IP、目标端口和动作:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
firewall-cmd --list-rich-rules

注意放行单个 IP 不等于拒绝其他 IP:默认 public 区域并没有全局 drop,其他来源依然按原有规则处理。如果确实要拒绝某个恶意 IP,把 accept 换成 reject(返回拒绝)或 drop(静默丢弃,攻击者看不到响应,通常更适合防护场景):

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.77" drop'
firewall-cmd --reload

删除富规则时用 --remove-rich-rule,参数必须与添加时一字不差,因此建议把最终生效的规则清单(firewall-cmd --list-rich-rules 的输出)留存到笔记里备用。

第四步:区域(zone)与端口转发

zone 是 firewalld 的核心设计,可以理解为"不同信任级别使用不同策略"。系统内置 public、trusted、drop、block 等区域,public 是默认区域;把某个来源网段划入 trusted 区域,该来源的流量就按 trusted 的宽松策略处理:

firewall-cmd --get-zones
firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent
firewall-cmd --reload

对于"外网 80 端口转发到本地应用端口"这类需求,可以用 add-forward-port 实现,例如把访问 80 端口的流量转发到本机 8080:

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
firewall-cmd --reload

端口转发依赖内核 netfilter,容器或虚拟化环境里可能还要额外开启 IP 转发,实践中更推荐直接用 Nginx 反向代理完成,规则更直观,也方便后期排查。

常见问题(FAQ)

Q1:已经添加端口并 reload,外网还是访问不了?按顺序查三点:用 firewall-cmd --list-ports 确认规则在运行层生效;用 ss -lntp 确认业务程序真的在监听该端口,且绑定的是 0.0.0.0 而不是 127.0.0.1;登录云服务器控制台检查安全组是否放行了相同端口。三者缺一不可,其中安全组是最容易被忽略的一环。

Q2:规则改错了,SSH 被断开怎么办?这是最危险的事故,预防重于补救。建议先在富规则里显式放行自己的出口 IP 访问 SSH 端口,再执行其他收紧操作;一旦失联,通过云厂商的 VNC/救援模式登录,先执行 firewall-cmd --panic-off 解除紧急模式,再回滚到改动前的规则基线。

Q3:firewalld 和 iptables 是什么关系,能不能混用?firewalld 是前端管理工具,底层依然调用 iptables(nftables)写入内核规则。两套命令混用会出现"iptables 能看到、firewall-cmd 查不到"的割裂状态,一次 --reload 就可能让手工添加的 iptables 规则全部丢失。日常只保留 firewall-cmd 一个入口,才是可控的做法。

Q4:能关掉 firewalld 直接用 iptables 吗?可以但不推荐无差别关闭。确认业务不依赖 firewalld 的区域管理后,再执行 systemctl stop firewalld 和 systemctl disable firewalld,并自行维护一套等价的 iptables 规则与开机恢复脚本。关闭系统防火墙等于摘掉一层防护,务必备份好替代方案再操作。

总结

firewalld 的日常管理可以归纳为四步:查状态、开端口、限 IP、管区域。记住两个关键习惯能避开大部分事故:修改一律加 --permanent 并及时 --reload,变更前留存规则基线;收紧访问前先确保 SSH 端口和自己的 IP 已被放行。防火墙是服务器的第一道门,规则越清晰,业务越稳定,排查网络问题时也越有底气。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容