CentOS 7 必须用 firewall-cmd rich-rule 实现 IP 白名单,命令为 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port protocol="tcp" port="3306" accept',需 --permanent 持久化并 --reload 生效。

CentOS 7 默认用 firewalld,不是 iptables;直接改配置文件或混用两种工具极易导致规则冲突、重启后丢失,甚至 SSH 断连。白名单必须用 firewall-cmd 的 rich rule 机制实现,不能靠“开放端口 + 信任网段”这种粗放方式。
firewall-cmd 添加单 IP 白名单(指定端口)
这是最常用也最安全的写法:只允许某个 IP 访问特定端口,其他所有流量(包括该 IP 的其他端口)默认拒绝。
-
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port protocol="tcp" port="3306" accept'—— 注意引号嵌套和空格,单引号外不能有双引号混用 - 必须加
--permanent,否则重启 firewalld 后规则消失 - 端口协议写错(比如写成
udp却想开 TCP 服务)会导致规则不生效,firewall-cmd --list-rich-rules能看到但实际不通 - 执行后务必
firewall-cmd --reload,仅systemctl restart firewalld不会加载新规则
批量添加 CIDR 网段白名单(含常见坑)
用 /24 或 /16 网段比逐条加 IP 效率高,但 CIDR 表达必须合法,且不能覆盖本地回环或内网管理网段。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 正确示例:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.20.0/24" port protocol="tcp" port="8080" accept' - 错误示例:
100.63.248.661/32——661是非法 IPv4 地址,命令会静默失败,--list-rich-rules里也看不到 - 若网段含广播地址(如
192.168.1.255),firewalld 不会报错,但部分交换机或云平台可能丢弃该包,建议避开 - 不要对同一端口重复添加重叠网段(如
10.0.1.0/24和10.0.1.100/32),firewalld 不去重,规则冗余但不影响功能
删除白名单规则时的硬性限制
firewalld 不支持模糊匹配删除,必须完整复现当初添加时的字符串,一个空格、引号类型、大小写不对就删不掉。
- 先查清原始规则:
firewall-cmd --list-rich-rules,复制整行(含引号和空格) - 删的时候把
add-rich-rule换成remove-rich-rule,其余一字不改:firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.10.5" port protocol="tcp" port="3306" accept' - 误删了默认 zone 规则(如 ssh、http)?别慌,
firewall-cmd --permanent --add-service=ssh可快速补回,但记得 reload - 删完不 reload,规则仍生效;reload 后若发现连不上,立刻用 console 登录,检查
firewall-cmd --list-all输出是否意外清空了 INPUT 链基础规则
绕过 firewalld 直接改 public.xml 的风险点
有人图省事直接编辑 /etc/firewalld/zones/public.xml,这在 firewalld 运行中修改极危险。
- firewalld 加载配置是原子性的,手动改 XML 后不 reload,新规则永不生效;reload 时若 XML 格式错误(如标签未闭合、属性值缺引号),整个 firewalld 会 crash,
systemctl status firewalld显示 failed - XML 中的
<rule>必须严格按 schema 写,例如source address必须是<source address="x.x.x.x"/>,写成<source address="x.x.x.x"></source>就解析失败 - 如果 zone 文件被改坏又没备份,
firewall-cmd --reload失败后只能删掉 public.xml,再firewall-cmd --set-default-zone=public让它重建默认文件 - 云服务器(如阿里云、腾讯云)的底层安全组已做过一层过滤,firewalld 白名单只是第二道防线,别把它当唯一防护手段
真正容易被忽略的是:firewalld 的 rich rule 仅作用于 INPUT 链,对 OUTPUT 和 FORWARD 链无影响;如果你开了 Docker 或 K8s,容器间通信可能绕过这些规则——白名单只管“谁可以连进来”,不管“连进来之后能访问什么”。

















