1. 项目概述:为什么需要限定特定IP访问?
在CentOS服务器运维的日常里,防火墙配置是基础中的基础,但也是最容易出问题的一环。很多朋友配置完防火墙规则,比如开放了某个端口,测试时一切正常,结果服务器一重启,或者过段时间再访问,发现规则“消失”了,服务又连不上了。这种问题在 firewall-cmd 上尤其常见,因为它有两种配置模式:运行时(Runtime)和永久(Permanent)。更进阶的需求是,我们不仅想开放端口,还想精细控制——只允许某个特定的IP地址或者一个IP段来访问这个端口,其他来源一律拒绝。这不仅是安全加固的基本要求,在诸如数据库访问、管理后台、内部API接口等场景下更是刚需。
你可能会搜到很多命令,比如 firewall-cmd --add-rich-rule ,但照抄之后常常发现不生效,或者重启失效。这背后的原因在于对 firewall-cmd 的规则优先级、区域(zone)概念以及“富规则”(rich rule)的理解不够透彻。今天,我就以“限定特定的IP访问SSH服务(22端口)”和“限定IP段访问Web服务(80端口)”这两个最典型的场景为例,手把手带你走通整个流程,不仅告诉你命令怎么写,更重点解释每个参数的意义、不同命令间的区别,以及如何确保规则持久化。我会分享我在这上面踩过的坑,比如为什么直接添加规则有时会被默认规则覆盖,以及如何用最清晰的方式验证规则是否真正生效。
2. 核心概念与工具解析:理解firewall-cmd的工作逻辑
在动手敲命令之前,我们必须先理清几个关键概念。 firewall-cmd 是CentOS 7及以上版本默认的防火墙前端管理工具,其后台是 firewalld 守护进程。它和传统的 iptables 命令直接操作规则链的思路不同,引入了一套更抽象、更动态的管理模型。
2.1 区域(Zone):防火墙策略的容器
这是 firewalld 的核心概念。你可以把Zone理解为一套预设的防火墙策略模板。每个网络接口(如eth0、ens33)都会被分配到一个Zone中,从而继承该Zone的所有规则。常见的Zone有:
- public(默认) : 在公共区域使用,仅允许选定的传入连接。新安装的CentOS,网卡通常就在这个Zone。
- trusted : 信任所有连接,相当于临时关闭防火墙(但服务仍在运行)。
- internal : 用于内部网络,通常比public区域信任度更高。
- dmz : 用于非军事区(对外服务)的网络。
我们的规则都是绑定在某个Zone上的。如果你不指定Zone,命令默认就作用于当前网卡所属的Zone(通常是public)。查看当前所有Zone及接口绑定情况:
firewall-cmd --get-active-zones
2.2 运行时与永久配置:避免重启失效的关键
这是导致规则“丢失”的罪魁祸首。 firewalld 将配置分为两层:
- 运行时配置(Runtime) : 立即生效,但重启
firewalld服务或服务器后就会丢失。对应的命令通常不带--permanent参数。 - 永久配置(Permanent) : 写入配置文件(
/etc/firewalld/),但不会立即生效。需要重载服务或重启后,才会应用到运行时环境。对应的命令需要加上--permanent参数。
关键操作习惯 : 为了保证规则持久化且立即生效,一个可靠的操作顺序是:1) 添加永久规则;2) 重载防火墙配置。这可以通过一条组合命令完成:
firewall-cmd --permanent [其他参数] && firewall-cmd --reload。--reload操作会重新加载所有永久配置到运行时环境,而不会中断现有的已建立连接,比--complete-reload更安全。
2.3 富规则(Rich Rule):实现复杂控制的利器
简单的端口开放( --add-port )无法指定源地址。要实现“允许特定IP访问特定端口”,就必须使用“富规则”。富规则语法非常强大且灵活,允许你基于源/目标IP、端口、协议、动作(accept/reject/drop)、日志等元素进行精细组合。其基本结构可以理解为: rule [family="ipv4|ipv6"] [source/destination address] [port] [protocol] [action]
例如,一条规则的
5935




被折叠的 条评论
为什么被折叠?



