linux防火墙配置需明确工具链、默认策略、规则顺序和持久化四要点:用错工具或未保存则重启失效;顺序错误致drop先于accept而断网;firewalld须--permanent加--reload才永久生效;iptables规则顺序决定匹配结果,-i插入优先于-a追加;排查须兼顾云安全组、selinux及服务绑定地址。

Linux 防火墙规则配置不是“加一条命令就完事”,而是必须明确工具链、默认策略、规则顺序和持久化这四个关键点。用错工具或漏掉保存,规则重启即失效;顺序写反,可能让 DROP 比 ACCEPT 先命中,直接断网。
怎么判断当前系统用的是 iptables 还是 firewalld
先看服务状态,再看进程和命令是否存在:
-
systemctl is-active firewalld返回active,说明 firewalld 在运行;返回inactive或报错,则大概率是 iptables -
iptables -L -n能列出规则,且systemctl is-active iptables为active,说明是传统 iptables(常见于 CentOS 6 / RHEL 6) - RHEL/CentOS 7+、Fedora、AlmaLinux 默认启用
firewalld;Ubuntu 20.04+ 默认用ufw(本质是 iptables 前端),但可手动装 firewalld - 注意:
firewalld和iptables不能同时生效——firewalld 启动后会接管 netfilter,直接调iptables命令可能被忽略或冲突
firewalld 开放端口必须带 --permanent 并 reload
只执行 firewall-cmd --add-port=8080/tcp 是临时的,重启或 reload 后丢失。生产环境几乎总是需要永久生效:
- 正确写法:
firewall-cmd --permanent --add-port=8080/tcp,然后必须跟firewall-cmd --reload - 漏掉
--permanent:规则进内存但不落盘,firewall-cmd --list-ports能看到,但reboot后消失 - 漏掉
--reload:规则已写入配置文件,但内核未加载,端口实际不通 - 查是否生效:
firewall-cmd --zone=public --list-ports(只显示永久规则)或firewall-cmd --list-all(含服务、富规则等)
iptables 添加规则时顺序决定生死
-A INPUT 是追加到链末尾,而默认策略常设为 DROP。如果在 DROP 之后再加 ACCEPT,新规则永远不匹配:
- 典型错误:
iptables -P INPUT DROP后直接iptables -A INPUT -p tcp --dport 22 -j ACCEPT→ SSH 连不上 - 正确做法:先加
ACCEPT规则,最后再设iptables -P INPUT DROP;或用-I INPUT 1插入到最前面 - 调试技巧:用
iptables -L INPUT -n --line-numbers查看规则序号,再用-D INPUT 3删除第 3 条 - 别依赖“先允许后拒绝”的直觉——iptables 匹配是线性扫描,第一条匹配即执行动作,不再继续
规则没生效?先排除这三类干扰
很多“配置了但不通”的问题,根源不在防火墙本身:
- 云服务器(如腾讯云、阿里云):安全组(Security Group)是第一道墙,必须先放行端口,防火墙规则才可能起作用
- SELinux:若启用了 enforcing 模式,
http_port_t等端口上下文没赋权,即使 firewalld 放行了 80,nginx 也 bind 失败;可用setsebool -P httpd_can_network_connect 1临时绕过(不推荐长期关闭 SELinux) - 服务监听地址:检查
netstat -tlnp | grep :22,确认服务是否绑定了0.0.0.0而非127.0.0.1;bind 到 localhost 的服务,防火墙放行也没用
真正麻烦的不是加规则,而是理解规则何时、以什么顺序、在哪个环节被应用。比如 FORWARD 链对本机流量无效,OUTPUT 链极少需要显式配置,而 conntrack 状态匹配(--state ESTABLISHED,RELATED)一旦漏掉,主动发起的连接回包会被丢弃——这种问题不会报错,只会让你反复怀疑是不是端口没开对。











