要在firewalld中添加永久端口规则,必须先使用--permanent参数将其写入配置文件,然后再执行--reload命令加载到运行时环境中。否则,规则仅会被保存到配置文件中,但不会生效,一旦系统重启,这些规则仍会丢失。

firewalld 里怎么加一条永久生效的端口规则
加完规则后,如果不执行reload操作,规则是不会生效的;而加规则时若不加上 --permanent 参数,那么一旦重启,规则就会丢失。这可是大家在使用firewalld时最容易踩到的坑啦!要知道,firewalld的临时规则和永久规则是分别独立存储的,所以必须要明确地声明进行持久化操作才行哦。
- 先确认服务在运行:
firewall-cmd --state返回running才能操作 - 开放 TCP 80 端口(永久):
firewall-cmd --permanent --add-port=80/tcp - 开放 UDP 53 端口(永久):
firewall-cmd --permanent --add-port=53/udp - 必须 reload 才真正加载:
firewall-cmd --reload,否则规则只存配置文件里,没进内存 - 验证是否生效:
firewall-cmd --list-ports或firewall-cmd --list-all
iptables 怎么让规则重启后不消失
iptables 命令默认只改内存里的规则,系统一重启全清空。要持久化,得把当前规则导出到文件,并确保开机时自动恢复。
- 保存当前规则到默认路径(CentOS/RHEL):
iptables-sa ve > /etc/sysconfig/iptables - Ubuntu/Debian 系统常用:
iptables-sa ve > /etc/iptables/rules.v4 - 验证保存内容:
cat /etc/sysconfig/iptables | head -n 5,确认有*filter和COMMIT - 开机自动加载依赖 systemd 服务或网络启动脚本;RHEL 系统通常靠
iptables服务(systemctl enable iptables),但注意:该服务在 firewalld 启用时会被禁用,二者不能共存 - 别直接编辑
/etc/sysconfig/iptables文件手动改——容易格式错、缺 COMMIT、导致 restore 失败
为什么 firewall-cmd --add-service=http 没反应
没报错但端口不通,大概率是没指定 zone,或者 zone 绑定错了网卡。firewalld 规则永远绑定到具体 zone,而不是全局生效。
- 查当前活跃 zone:
firewall-cmd --get-active-zones,看你的网卡(比如ens33)绑在哪个 zone 下 - 如果网卡在
public区域,就得加:firewall-cmd --zone=public --add-service=http --permanent - 如果想让所有 zone 都开 http,得逐个加,firewalld 不支持“全局 service”
http是预定义 service,对应 TCP 80;自定义端口不能用--add-service,只能用--add-port- 加完别忘
--reload,且--list-all输出里要能看到services: http才算成功
误删规则后怎么快速回滚
firewalld 没内置 undo,iptables 更没有。所谓“回滚”,其实是靠你提前留下的快照或备份配置。
- 操作前先备份当前配置:
firewall-cmd --list-all > /root/firewall-before-20260708.bak - firewalld 永久配置存在
/etc/firewalld/下,重点备份:/etc/firewalld/zones/public.xml(或你用的 zone 文件) - iptables 备份就是
iptables-sa ve导出的文件,替换后执行iptables-restore < /path/to/backup - 别指望
systemctl restart firewalld能恢复——它只重载--permanent配置,不是撤销上一步操作 - 线上环境建议用脚本封装规则变更,并带 timestamp 和 commit msg,不然真出问题时连哪条命令动了什么都难定位
--list-all 输出里的 “permanent: yes/no” 和 “active: yes/no”,能省掉大半排查时间。