Linux防火墙管理指南

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 区域匹配优先级

数据包按以下顺序匹配区域:

  1. 匹配接口绑定的区域
  2. 匹配源地址绑定的区域
  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

主要功能区域:

  1. 区域选择:选择要配置的区域
  2. 服务管理:勾选允许的服务
  3. 端口配置:添加自定义端口规则
  4. 富规则编辑:可视化配置复杂规则
  5. ICMP过滤:控制ICMP报文类型
  6. NAT配置:设置端口转发和伪装

6.2 配置状态管理

  • 运行时:当前生效的配置(红色标记)
  • 永久:保存的配置文件(绿色标记)
  • 连接跟踪:查看活动连接状态

7. 最佳实践与排错

7.1 配置最佳实践

  1. 最小权限原则:仅开放必要服务
  2. 分层防护:结合网络层和主机层防火墙
  3. 日志记录:关键规则添加日志记录
  4. 测试验证:变更前在测试环境验证
  5. 版本控制:备份防火墙配置文件

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. 防火墙规则优先级总结

  1. 直接规则(最高优先级)
  2. 富规则
  3. 区域规则(端口/服务/协议)
  4. 默认区域规则(最低优先级)

规则处理流程:

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防火墙的管理技能,从基础配置到高级防护,构建坚固的网络安全防线。

相关推荐
AOwhisky40 分钟前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
Peace41 分钟前
【Prometheus】
linux·运维·prometheus
LZZ and MYY2 小时前
RTS 在windows和Linux之间ShareMem
linux·运维·服务器
aningx2 小时前
openSUSE Leap 16.0 运行 sunshine 报错的解决方法
linux
爱学习的徐徐2 小时前
Linux 基础IO
linux·服务器
蛋蛋的学习记录2 小时前
C#窗体应用中使用EasyModbusCore通讯
服务器·c#·tcp
zt1985q2 小时前
本地部署源代码管理解决方案 Bitbucket Data Center 并实现外部访问
运维·服务器·数据库·网络协议·postgresql·源代码管理
xiaobobo33303 小时前
面向对象:linux内核中函数转数据的用法
linux·面向对象·隔离·函数指针绑定
极客先躯3 小时前
高级java每日一道面试题-2026年01月18日-实战篇[Docker]-如何清理仓库中的旧镜像?
java·运维·docker·容器
姓刘的哦3 小时前
C++软件架构设计思路
linux