firewalld服务未启动是根本原因,需先systemctl start firewalld并enable开机自启;永久添加端口后必须firewall-cmd --reload才生效;IP限制须用rich rule而非add-port;误关FORWARD链会影响转发功能。

firewalld 服务没起来,所有命令都白搭
很多操作看似执行成功,但firewall-cmd --list-ports始终为空,或firewall-cmd --state返回not running——根本原因就是服务压根没启动。
- 先确认状态:
systemctl status firewalld,看是不是active (running) - 没运行就启动:
systemctl start firewalld - 别忘了设开机自启,否则重启后又得手动开:
systemctl enable firewalld - CentOS 7 默认装了 firewalld,但某些最小化安装或云镜像可能禁用或未安装,可补装:
yum install firewalld
注意:systemctl start只是临时启用;如果跳过这步直接加规则,--permanent参数会写入配置,但规则不会生效——因为没服务在读这些配置。
开放端口必须 reload 才生效
加了端口却连不上?90% 是漏了重载。firewalld 的“永久规则”不会自动热加载,必须显式触发。
- 永久添加 8080/tcp:
firewall-cmd --zone=public --add-port=8080/tcp --permanent - 立即生效(关键!):
firewall-cmd --reload - 验证是否真开了:
firewall-cmd --zone=public --query-port=8080/tcp(返回yes才算成功) - 临时添加(不带
--permanent)只在当前 session 生效,重启或 reload 后消失,适合调试但不可靠
reload 不等于 restart:它只重载规则,不中断已有连接;而 systemctl restart firewalld 会短暂断连,没必要。
只允许特定 IP 访问某端口,不能只靠 --add-port
--add-port 是全量放行,没法做源 IP 控制。想实现“仅 192.168.2.100 能连 8088”,得用富规则(rich rule)或 ipset。
- 最简方式(富规则):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.100" port port="8088" protocol="tcp" accept' - 然后必须 reload:
firewall-cmd --reload - 如果要封其他所有 IP 对该端口的访问,还得加一条默认拒绝规则(注意顺序):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="8088" protocol="tcp" reject' - 富规则按添加顺序匹配,所以“允许”必须在“拒绝”之前;否则全被拦住
别试图用多个 --add-port 拼凑权限控制——它不支持源地址过滤,这是常见误解。
误关 FORWARD 链会导致网关/转发失效
如果你的机器是网关、Docker 宿主机或启用了 IP 转发,firewalld 默认对 FORWARD 链是放行的。但一旦执行 firewall-cmd --panic-on 或手动删掉 forward 规则,内网穿透、容器通信、NAT 就全挂了。
- 检查是否开启转发:
sysctl net.ipv4.ip_forward(应为 1) - 确认 FORWARD 区域策略:
firewall-cmd --get-active-zones看是否绑定了接口,再查对应 zone 的 forward 策略:firewall-cmd --zone=public --list-all | grep forward - 若需允许转发,确保 zone 设置为
target: ACCEPT或显式加富规则:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080" to-addr="192.168.10.5"
panic 模式(--panic-on)是一键锁死所有入向流量,包括 SSH,慎用;恢复前只能物理或带外访问。

















