Linux防火墙管理指南
1. 防火墙概述
1.1 什么是防火墙
防火墙是部署在网络或主机边缘的安全组件,根据预定义的规则检查进出数据包,对匹配规则的流量执行相应的处理操作。现代防火墙通常采用"默认拒绝、明确允许"的策略,仅开放必要的网络访问。
1.2 防火墙分类
按保护范围划分:
- 主机防火墙:保护单台主机
- 网络防火墙:保护整个局域网
按实现方式划分:
- 硬件防火墙:专用硬件设备实现,如华为、华三等厂商产品
- 软件防火墙:运行在通用硬件上的防火墙软件,如iptables、firewalld
按工作层次划分:
- 网络层防火墙 :工作在OSI模型下四层,基于数据包特征过滤
- 优点:处理速度快、对用户透明
- 缺点:无法检查应用层数据
- 应用层防火墙 :工作在OSI模型七层,深度检查应用层协议
- 优点:能防御应用层攻击
- 缺点:处理速度相对较慢
2. Linux防火墙核心子系统
2.1 Netfilter子系统
Linux内核中的网络过滤框架,提供数据包处理的基础能力:
| 工具 | 功能描述 |
|---|---|
iptables |
IPv4数据包过滤 |
ip6tables |
IPv6数据包过滤 |
arptables |
ARP协议数据包过滤 |
ebtables |
数据链路层过滤 |
bash
# 查看系统防火墙工具
ls -l /sbin/*tables
2.2 Nftables子系统
Netfilter的现代化替代方案,提供更优性能和统一管理接口:
- 更快的规则处理速度
- 支持原子规则更新
- 统一管理所有网络协议
3. Firewalld动态防火墙
3.1 Firewalld简介
Red Hat开发的动态防火墙管理工具,默认使用nftables后端:
- 动态加载:规则变更无需重启服务
- 区域管理:简化复杂网络环境配置
- 向后兼容:底层仍使用iptables规则
3.2 防火墙区域(Zone)
Firewalld通过区域化管理简化配置:
| 区域 | 默认策略 | 典型应用场景 |
|---|---|---|
trusted |
允许所有流量 | 完全信任的内部网络 |
public |
仅允许ssh/dhcp | 公共网络接口(默认区域) |
home |
允许家庭服务 | 家庭网络环境 |
internal |
允许内部服务 | 企业内部网络 |
work |
允许工作服务 | 办公网络环境 |
dmz |
仅允许ssh | 隔离区服务器 |
block |
拒绝所有连接 | 访问限制区域 |
drop |
丢弃所有数据包 | 静默丢弃恶意流量 |
3.3 区域匹配优先级
数据包按以下顺序匹配区域:
- 匹配接口绑定的区域
- 匹配源地址绑定的区域
- 匹配默认区域
4. Firewalld配置实战
4.1 基础环境准备
bash
# 安装必要软件
yum install -y firewalld firewall-config
systemctl enable --now firewalld
4.2 区域管理操作
bash
# 查看可用区域
firewall-cmd --get-zones
# 查看当前活动区域
firewall-cmd --get-active-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 设置默认区域
firewall-cmd --set-default-zone=internal
# 查看区域详细配置
firewall-cmd --zone=public --list-all
4.3 接口与源地址管理
bash
# 查看接口区域分配
firewall-cmd --get-zone-of-interface=ens192
# 更改接口区域
firewall-cmd --zone=internal --change-interface=ens192
# 添加源地址到区域
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
# 移除源地址
firewall-cmd --zone=trusted --remove-source=192.168.1.0/24
4.4 服务与端口管理
bash
# 查看预定义服务
firewall-cmd --get-services
# 放行HTTP服务
firewall-cmd --add-service=http
firewall-cmd --add-service=https
# 放行自定义端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=10000-20000/udp
# 查询放行状态
firewall-cmd --query-service=http
firewall-cmd --query-port=8080/tcp
# 移除规则
firewall-cmd --remove-service=http
firewall-cmd --remove-port=8080/tcp
4.5 网络地址转换(NAT)
bash
# 启用IP伪装(SNAT)
firewall-cmd --add-masquerade
# 端口转发(DNAT)
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
firewall-cmd --add-forward-port=port=2222:proto=tcp:toaddr=192.168.1.100:toport=22
# 查询转发规则
firewall-cmd --list-forward-ports
4.6 ICMP控制
bash
# 查看ICMP类型
firewall-cmd --get-icmptypes
# 禁止ping请求
firewall-cmd --add-icmp-block=echo-request
# 允许特定主机ping
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.10 icmp-type name=echo-request accept'
# 反转ICMP策略(默认拒绝,明确允许)
firewall-cmd --add-icmp-block-inversion
4.7 富规则(Rich Rules)
bash
# 禁止特定IP访问
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.5 drop'
# 允许特定IP访问服务
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=http accept'
# 限速规则(每分钟3个连接)
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 service name=ssh accept limit value=3/m'
# 日志记录规则
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 log prefix="FIREWALL: " level=info limit value=3/m'
# 查看富规则
firewall-cmd --list-rich-rules
4.8 直接规则(Direct Rules)
bash
# 添加直接规则(类似iptables语法)
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
# 查看直接规则
firewall-cmd --direct --get-all-rules
# 删除直接规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
4.9 持久化与运行时配置
bash
# 运行时配置(立即生效,重启失效)
firewall-cmd --add-service=ssh
# 永久配置(写入配置文件)
firewall-cmd --permanent --add-service=ssh
# 重载配置(应用永久配置)
firewall-cmd --reload
# 完全重载(断开现有连接)
firewall-cmd --complete-reload
# 保存运行时配置为永久
firewall-cmd --runtime-to-permanent
5. 实用配置案例
5.1 Web服务器防护
bash
# 放行Web服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 限制管理访问
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=22 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 port port=22 protocol=tcp accept'
# 应用配置
firewall-cmd --reload
5.2 数据库服务器防护
bash
# 仅允许应用服务器访问
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.100 port port=3306 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.101 port port=3306 protocol=tcp accept'
# 拒绝其他所有数据库访问
firewall-cmd --permanent --remove-service=mysql
5.3 应急处理
bash
# 紧急模式(阻断所有流量)
firewall-cmd --panic-on
# 检查紧急模式状态
firewall-cmd --query-panic
# 关闭紧急模式
firewall-cmd --panic-off
# 临时允许特定IP(10秒后自动删除)
firewall-cmd --add-source=192.168.1.100 --timeout=10
6. 图形化管理工具
6.1 firewall-config使用
bash
# 启动图形界面(需要X11转发)
firewall-config
主要功能区域:
- 区域选择:选择要配置的区域
- 服务管理:勾选允许的服务
- 端口配置:添加自定义端口规则
- 富规则编辑:可视化配置复杂规则
- ICMP过滤:控制ICMP报文类型
- NAT配置:设置端口转发和伪装
6.2 配置状态管理
- 运行时:当前生效的配置(红色标记)
- 永久:保存的配置文件(绿色标记)
- 连接跟踪:查看活动连接状态
7. 最佳实践与排错
7.1 配置最佳实践
- 最小权限原则:仅开放必要服务
- 分层防护:结合网络层和主机层防火墙
- 日志记录:关键规则添加日志记录
- 测试验证:变更前在测试环境验证
- 版本控制:备份防火墙配置文件
7.2 常见问题排查
bash
# 检查防火墙状态
systemctl status firewalld
firewall-cmd --state
# 查看完整配置
firewall-cmd --list-all-zones
# 检查规则冲突
journalctl -u firewalld -f
# 临时禁用防火墙(仅用于排错)
systemctl stop firewalld
systemctl disable firewalld
# 重置防火墙配置
firewall-cmd --reset-defaults
7.3 配置文件位置
bash
# 系统默认配置
/usr/lib/firewalld/
# 用户自定义配置
/etc/firewalld/
# 服务定义文件
/usr/lib/firewalld/services/*.xml
# 区域定义文件
/usr/lib/firewalld/zones/*.xml
8. 防火墙规则优先级总结
- 直接规则(最高优先级)
- 富规则
- 区域规则(端口/服务/协议)
- 默认区域规则(最低优先级)
规则处理流程:
text
数据包到达 → 匹配直接规则 → 匹配富规则 → 匹配区域规则 → 应用默认策略
9. 与iptables共存
9.1 选择使用方案
- 方案A:仅使用firewalld(推荐)
- 方案B:仅使用iptables
- 方案C:混合使用(需要谨慎协调)
9.2 迁移工具
bash
# 将iptables规则转换为firewalld
iptables-restore-translate -f iptables-save.txt
# 检查当前使用的后端
firewall-cmd --get-backend
10. 安全加固建议
10.1 基础加固措施
bash
# 1. 设置合理默认区域
firewall-cmd --set-default-zone=drop
# 2. 限制管理访问
firewall-cmd --add-rich-rule='rule family=ipv4 source address=管理网段 service name=ssh accept'
# 3. 启用连接跟踪
firewall-cmd --add-rich-rule='rule service name=ftp protocol value=ftp accept' # 自动处理FTP被动模式
# 4. 定期审计规则
firewall-cmd --list-all --permanent > /backup/firewall-$(date +%Y%m%d).conf
10.2 高级防护功能
bash
# 连接限制(防DDoS)
firewall-cmd --add-rich-rule='rule service name=http accept limit value=20/s'
# 黑名单管理
firewall-cmd --add-rich-rule='rule family=ipv4 source address=恶意IP drop'
# 时间规则(仅工作时间开放)
# 需要结合cron定时任务实现
通过本指南,您可以全面掌握Linux防火墙的管理技能,从基础配置到高级防护,构建坚固的网络安全防线。