firewall-cmd添加端口必须加--permanent参数才能永久生效,否则重启后规则丢失;添加后需执行firewall-cmd --reload使配置立即生效,并可通过--list-ports或--query-port验证。

firewall-cmd --permanent 必须加,否则重启就丢
CentOS 7/8 默认用 firewalld,它不直接操作 iptables 规则表,而是通过抽象层管理——所以你不能像 iptables 那样直接改 /etc/sysconfig/iptables。所有修改必须走 firewall-cmd,且带 --permanent 才会写入配置文件(如 /etc/firewalld/zones/public.xml),否则只是 runtime 生效,重启 firewalld 或系统后规则消失。
- 临时开放 TCP 80 端口(不加
--permanent):firewall-cmd --zone=public --add-port=80/tcp→ 重启即失效 - 永久开放 TCP 80 端口:
firewall-cmd --permanent --zone=public --add-port=80/tcp→ 写入 XML 文件,重启仍存在 - 改完不 reload,新规则不会生效;reload 不中断已有连接,安全
删错规则时,别只靠 --list-all 判断
firewall-cmd --list-all 显示的是当前 runtime + permanent 合并后的视图,但实际生效的规则可能来自多个 zone 或富规则嵌套。比如你删了一个端口却发现服务还能访问,很可能是因为:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 该端口被某个 service(如
http)间接包含,删端口没用,得删 service:firewall-cmd --permanent --remove-service=http - 富规则(rich rule)里显式放行了该端口,优先级更高,
--list-all会显示它,但容易被忽略 - 规则加在了非默认 zone(比如
trusted),而你的请求走的是publiczone,查--list-all --zone=public才准
想改底层规则表?先确认你真需要绕过 firewalld
firewalld 本身不暴露 raw iptables 表,但你可以用两种方式“接触”底层:
- 临时混用 iptables:执行
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT,但 firewalld reload 后会被清掉(除非禁用 firewalld) - 彻底切换回 iptables:卸载 firewalld,装
iptables-services,启用iptables服务,此时规则才真正写进/etc/sysconfig/iptables - 注意:CentOS 7+ 默认策略是 firewalld 为主,硬切 iptables 容易导致 systemd 依赖冲突或网络服务异常启动失败
修改 public.xml 文件前,先备份再改
虽然官方推荐用 firewall-cmd,但有时你需要手动编辑 XML(比如批量导入、修复损坏配置)。关键点:
- 改的是
/etc/firewalld/zones/public.xml(用户配置目录),不是/usr/lib/firewalld/zones/(系统默认模板) - 改完必须执行
firewall-cmd --reload,否则 firewalld 不读新内容 - XML 格式要严格:标签闭合、引号匹配、无非法字符,否则
firewall-cmd --reload报错:ERROR: Failed to load file '/etc/firewalld/zones/public.xml' - 建议每次改前
cp /etc/firewalld/zones/public.xml{,.bak}










