linux防火墙详解笔记
内核层防火墙 vs 服务防火墙
1. 内核层防火墙
定义:直接运行在 Linux 内核中的网络包过滤机制。
特点:
- 位置:内核空间(Kernel Space)
- 实现:Netfilter 框架(iptables / nftables)
- 工作原理:在内核网络协议栈中拦截、检查、修改网络数据包
- 生效方式:规则直接写入内核,立即生效
- 持久性:重启后丢失(除非手动保存或通过服务恢复)
示例:
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT查看方式:
iptables -L -n -v
nft list ruleset2. 服务防火墙
定义:用户空间的管理工具/服务,用于管理和持久化内核防火墙规则。
特点:
- 位置:用户空间(User Space)
- 作用:规则管理、持久化、简化配置
- 工作原理:通过调用内核接口(iptables / nftables 命令)设置规则
- 生效方式:服务启动时加载规则,运行时通过命令修改
常见服务防火墙:
| 服务 | 说明 | 管理命令 |
|---|---|---|
| ufw | Uncomplicated Firewall,Debian/Ubuntu 默认 | ufw allow 80 |
| firewalld | RHEL/CentOS 默认,支持动态规则 | firewall-cmd --add-port=80/tcp |
| iptables-persistent | 保存和恢复 iptables 规则 | netfilter-persistent save |
| nftables | 新一代防火墙框架的服务 | systemctl start nftables |
3. 核心区别对比
| 维度 | 内核层防火墙 | 服务防火墙 |
|---|---|---|
| 运行位置 | 内核空间 | 用户空间 |
| 本质 | 内核中的包过滤机制 | 管理工具 / 守护进程 |
| 规则存储 | 内核内存 | 配置文件 + 内核内存 |
| 重启后 | 规则丢失 | 服务自动加载规则 |
| 性能 | 高(直接处理包) | 低(仅管理,不处理包) |
| 管理方式 | 命令行直接操作 | 通过服务命令或配置文件 |
| 依赖关系 | 独立存在 | 依赖内核防火墙 |
4. 实际例子说明
场景一:只有内核防火墙,无服务
# 直接添加内核规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 查看规则(内核中)
iptables -L -n
# 重启后规则丢失
# 因为没有服务来恢复规则场景二:通过服务管理内核规则
# 使用 ufw 服务管理
ufw allow 22/tcp
# ufw 服务会调用 iptables 命令将规则写入内核
ufw status verbose
# 重启后,ufw 服务自动恢复规则5. 系统状态分析示例
根据检查结果:
iptables -L -n -v # 有输出(内核规则)
systemctl status ufw # not found
systemctl status netfilter-persistent # not found结论:
- ✅ 内核防火墙存在:Netfilter 框架工作正常
- ⚠️ 存在内核规则:包含 NetAVARK 容器网络规则
- ❌ 无防火墙服务:未安装 ufw / firewalld 等服务
- 🔄 规则持久化:容器规则由 Podman / Docker 服务管理
系统架构示意图:
┌─────────────────────────────────────┐
│ 用户空间 (User Space) │
│ ┌─────────────────────────────┐ │
│ │ 无防火墙管理服务 │ │
│ │ (ufw/firewalld未安装) │ │
│ └─────────────────────────────┘ │
│ ↓ │
│ 通过命令直接操作 │
│ ↓ │
├─────────────────────────────────────┤
│ 内核空间 (Kernel Space) │
│ ┌─────────────────────────────┐ │
│ │ Netfilter 框架 │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ iptables 规则: │ │ │
│ │ │ - INPUT: ACCEPT │ │ │
│ │ │ - OUTPUT: ACCEPT │ │ │
│ │ │ - NetAVARK 转发规则 │ │ │
│ │ └─────────────────────┘ │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘6. 关闭防火墙的正确理解
关闭内核防火墙(清空规则)
# 清空所有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 设置默认策略为 ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT关闭服务防火墙
# 停止并禁用服务
systemctl stop ufw
systemctl disable ufw
systemctl stop firewalld
systemctl disable firewalld7. 重启后规则丢失的原因
规则存储位置:
- 内核规则表位于 RAM(易失性存储)
- 重启 → 断电 → RAM 清空 → 规则全部丢失
图示:
重启前 重启后
┌─────────────────┐ ┌─────────────────┐
│ RAM │ │ RAM │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ 内核规则表 │ │ 重启 │ │ 内核规则表 │ │
│ │ 有规则 │ │ ───────> │ │ 空 │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘8. 服务如何实现持久化
添加规则时
用户执行 ufw deny 80
↓
ufw 服务:
1. 写入配置文件 /etc/ufw/user.rules
2. 调用 iptables 命令加载到内核
↓
内核规则生效系统重启时
系统启动 → systemd → ufw 服务启动
↓
读取配置文件 /etc/ufw/user.rules
↓
调用 iptables 命令加载规则
↓
内核规则恢复各服务配置文件位置
| 服务 | 配置文件 |
|---|---|
| ufw | /etc/ufw/*.rules |
| firewalld | /etc/firewalld/zones/*.xml |
| iptables-persistent | /etc/iptables/rules.v4 / rules.v6 |
| nftables | /etc/nftables.conf |
9. 手动实现持久化(无服务时)
# 保存当前规则
iptables-save > /root/iptables-backup.rules
# 恢复规则
iptables-restore < /root/iptables-backup.rules
# 开机自动恢复(示例:添加 /etc/rc.local)
iptables-restore < /root/iptables-backup.rules10. 规则添加方式对比总结
| 操作方式 | 立即生效 | 重启后 | 持久化方式 |
|---|---|---|---|
| 直接 iptables 命令 | ✅ | ❌ 丢失 | 需手动保存 |
| 通过 ufw / firewalld | ✅ | ✅ 恢复 | 服务自动保存/恢复 |
| 容器服务添加 | ✅ | ✅ 恢复 | 容器服务自动管理 |
| iptables-persistent | ✅ | ✅ 恢复 | netfilter-persistent 服务 |
关键要点
- 内核防火墙始终存在:Linux 内核的 Netfilter 框架无法“关闭”,只能清空规则
- 服务只是管理工具:停止服务不代表清空已有规则
- 重启规则丢失:直接通过
iptables添加的规则仅存在于内存,无服务管理则重启后消失 - 容器会添加规则:Docker / Podman 等容器工具会自动添加 iptables 规则
- 查看真实状态:始终用
iptables -L查看实际生效的规则,而非仅看服务状态
若系统中无防火墙服务且仅存在容器管理规则,则等同于防火墙处于开放状态(无额外限制规则)。
如果需要,我可以进一步补充:
- 容器网络(CNI)如何与 iptables 交互
- 如何彻底清空并锁定 iptables 规则
- 各类防火墙服务的配置示例
需要我继续扩展哪一部分吗?