Linux 防火墙基础:iptables 与 firewalld 全面解析
更新: 8/31/2026字数: 0 字 时长: 0 分钟

在 Linux 系统安全中,防火墙是网络安全的第一道防线,用于控制数据包的进出与转发。
在现代 Linux 系统中,主要存在两套最常见的防火墙管理工具:
iptables:经典的静态防火墙管理工具,直接对 Linux 内核的 Netfilter 框架进行规则配置。firewalld:RHEL/CentOS 7+、Fedora、Rocky Linux 等系统默认的动态防火墙管理工具,底层同样调用 Netfilter,但支持“按区域(Zone)划分”且修改规则无需重启服务或中断连接。
1. 内核底层机制:Netfilter 与四表五链
无论使用 iptables 还是 firewalld,它们本质上都是运行在用户态的配置工具,真正的过滤机制是由 Linux 内核中的 Netfilter 框架执行的。
Netfilter 的核心逻辑可以归纳为 四表五链:
1.1 五个规则链(Chains)
数据包流经 Linux 内核时,会依次经过不同的处理关卡(链):
INPUT:处理流入当前主机的数据包(如访问本机的 80 端口)。OUTPUT:处理从当前主机发出的数据包。FORWARD:处理经过当前主机转发的数据包(如将本机作为路由器/网关)。PREROUTING:数据包刚到达网卡、进行路由选择之前(常用于 DNAT 端口转发)。POSTROUTING:数据包完成路由选择、即将离开网卡之前(常用于 SNAT 源地址转换)。
1.2 四个规则表(Tables)
决定了对数据包具体做什么操作(优先级:raw > mangle > nat > filter):
filter表(默认):负责数据包过滤(允许ACCEPT、拒绝REJECT、丢弃DROP)。nat表:负责网络地址转换(端口映射、IP 伪装/SNAT/DNAT)。mangle表:负责修改数据包头部的服务类型(TOS)、标记(Mark)等。raw表:负责去除连接追踪机制(Conntrack)。
2. 传统静态防火墙:iptables
iptables 命令直接操作 Netfilter 的表和链。
2.1 规则匹配顺序与动作
- 顺序:链中的规则从上到下按顺序匹配。一旦匹配到符合条件的规则(如
ACCEPT或DROP),就会立即停止向下匹配。 - 默认策略:若所有规则都没有匹配上,则执行该链的默认策略(Default Policy)。
- 动作选择:
ACCEPT:允许数据包通过。DROP:直接丢弃数据包,不给发送方任何回应(发送端通常超时)。REJECT:拒绝数据包,并向发送方返回一个 ICMP 错误响应。
2.2 常用配置命令与语法
语法结构:iptables [-t 表名] 命令选项 [链名] [匹配条件] [-j 控制动作]
bash
# 1. 查看 filter 表中的所有规则与行号
sudo iptables -L -n -v --line-numbers
# 2. 开放 22 (SSH) 和 80 (HTTP) 入站端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 3. 封禁指定 IP(拒绝来自 192.168.1.100 的所有流量)
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
# 4. 删除指定链上的某条规则(按行号删除,如删除 INPUT 链第 3 条)
sudo iptables -D INPUT 3
# 5. 清空 filter 表中的所有规则(⚠️ 慎用,容易把 SSH 连通性清掉)
sudo iptables -F3. 现代动态防火墙:firewalld
firewalld 引入了 区域(Zone) 的概念,将不同的网络接口(网卡)绑定到不同的安全区域中,并根据区域定义安全策略。
3.1 核心概念:安全区域(Zone)
预设的几个常用区域(按信任度从低到高):
| 区域名称 | 默认策略与场景 |
|---|---|
drop | 信任度最低。丢弃所有进入的数据包,无任何回应。 |
block | 拒绝所有进入的数据包,并返回 ICMP 拒绝消息。 |
public | 默认区域。仅接受显式指定的入站连接(如 SSH、HTTP),用于公共网络环境。 |
trusted | 信任度最高。接受所有传入的网络流量。 |
3.2 firewall-cmd 核心命令实战
在 firewalld 中,修改规则分为运行时配置(Runtime)与永久配置(Permanent):
- 默认命令只对当前运行状态生效,重启后丢失。
- 加上
--permanent参数会永久写入配置文件,但需要执行--reload才能加载生效。
bash
# 1. 查看防火墙运行状态与当前活跃区域
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
# 2. 列出默认区域的所有开放规则
sudo firewall-cmd --list-all
# 3. 开放特定服务或端口(如开放 80/tcp 端口)
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# 4. 移除已开放的端口
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent
# 5. ⚠️ 极其关键:重载配置使 --permanent 规则立即生效
sudo firewall-cmd --reload3.3 进阶实战:富规则(Rich Rules)与端口转发
在 firewalld 中,可以通过“富规则”实现针对特定 IP 的精确控制,或者配置端口转发:
案例 1:仅允许特定 IP 访问 3306 (MySQL) 端口
bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload案例 2:本地端口转发(将访问本机的 8080 端口转发到 80 端口)
bash
sudo firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80
sudo firewall-cmd --reload4. iptables vs. firewalld 选型对比
| 对比维度 | iptables | firewalld |
|---|---|---|
| 管理模型 | 静态的“表与链”模型 | 动态的“区域与服务”模型 |
| 修改配置影响 | 修改规则需要重载整个服务,可能打断现有连接 | 支持动态更新,不打断现有已建立的网络连接 |
| 配置粒度 | 粒度极细,直接配置规则和网络包细节 | 封装了常用服务与端口,语法更直观 |
| 适用发行版 | Ubuntu/Debian 常用,或配合 ufw 简单工具 | CentOS 7+ / RHEL / Fedora 默认搭载 |
5. 总结
- 底层机制一致:无论是使用
iptables还是firewalld,真正干活的都是内核的 Netfilter 框架。 - 生产实操规范:
- 在使用
firewall-cmd时,千万不要漏掉--permanent和--reload的双组合,否则重启服务器后开放的端口会重新封闭。 - 在通过远程 SSH 配置防火墙规则时,务必先确保放行 22 端口,避免将自己锁在服务器门外。