29、Linux 防火墙

1. firewalld

firewalld 是 CentOS 7/RHEL 7 及以上版本默认的动态防火墙管理工具,替代了传统的 iptables service。它的核心优势是动态更新防火墙规则 ,无需重启服务即可生效,同时引入了区域(zone)服务(service) 等抽象概念,简化了防火墙配置。

a. 核心概念

firewalld 基于 iptables/nftables 内核机制实现,通过高层抽象封装了复杂的链规则配置,核心概念如下:

i. 区域(Zone)

区域是 firewalld 的核心,是预设的安全策略集合,不同区域对应不同的信任级别。firewalld 会根据网卡的网络环境,为其分配对应的区域,区域内的规则决定了该网卡的流量管控策略。

区域名称 安全级别 默认策略(入站流量) 典型场景
trusted 最低(全信任) 允许所有流量 本地内网、信任的服务器集群
home 低(拒绝) 允许常见服务(ssh、mdns、samba、ipp-client、dhcpv6-client等) 家庭网络
internal home 企业内部网络
work 允许ssh、ipp-client、dhcpv6-client 办公网络
public 中(默认区域) 仅允许 ssh、dhcpv6-client 公共网络(如咖啡馆、机房)
external 同 public + 开启伪装(NAT) 路由器外网接口
dmz 仅允许指定服务 非军事区(外网可访问服务器 WEB/DB)
block 拒绝所有流量(返回 icmp-host-prohibited) 不信任网络需要严格隔离的主机
drop 最高 丢弃所有流量(无任何响应) 高安全需求场景,高风险静默拦截

ii. 服务(Service)

服务是 预定义的端口+协议的集合 ,firewalld 内置了常见服务的配置(如 ssh 对应 22/tcp、http 对应 80/tcp),避免用户手动配置端口和协议的映射关系。

服务配置文件位置:

  • 系统默认服务:/usr/lib/firewalld/services/(不建议修改)
  • 自定义服务:/etc/firewalld/services/(优先级更高)

iii. 富规则(Rich Rule)

富规则是 firewalld 提供的精细化规则配置语法 ,支持对源地址、目标地址、端口、协议、动作(允许/拒绝/丢弃)进行精准控制,适用于复杂的防火墙策略。

iiii. 运行时配置 vs 永久配置

  • 运行时配置:临时生效,防火墙重启或重载后失效,用于测试规则。
  • 永久配置 :写入配置文件,需执行 reload 或重启服务后生效,用于生产环境。

b. firewalld 基本操作(firewall-cmd 命令)

firewall-cmd 是 firewalld 的命令行管理工具,所有操作都通过该命令完成,核心参数如下:

i. 服务状态管理

bash 复制代码
# 查看 firewalld 状态(running/not running)
firewall-cmd --state

# 启动/停止/重启 firewalld
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld

# 设置开机自启/关闭开机自启
systemctl enable firewalld
systemctl disable firewalld

ii. 区域管理

bash 复制代码
# 查看所有可用区域
firewall-cmd --get-zones

# 查看默认区域
firewall-cmd --get-default-zone

# 设置默认区域(永久生效)
firewall-cmd --set-default-zone=public --permanent

# 查看当前系统所有网卡对应的区域
firewall-cmd --get-active-zones

# 将网卡 eth0 加入 public 区域(永久生效)
firewall-cmd --zone=public --add-interface=eth0 --permanent

# 查看指定区域的所有规则
firewall-cmd --zone=public --list-all

# 查看所有区域的规则
firewall-cmd --list-all-zones

iii. 端口与服务管理

(1)服务管理
bash 复制代码
# 查看所有支持的服务
firewall-cmd --get-services

# 允许 http 服务通过 public 区域(临时生效)
firewall-cmd --zone=public --add-service=http

# 允许 http 服务通过 public 区域(永久生效)
firewall-cmd --zone=public --add-service=http --permanent

# 移除 public 区域的 http 服务(永久生效)
firewall-cmd --zone=public --remove-service=http --permanent
(2)端口管理

当需要开放非预设服务的端口时,直接配置端口:

bash 复制代码
# 允许 8080/tcp 端口通过 public 区域(临时生效)
firewall-cmd --zone=public --add-port=8080/tcp

# 允许 8080-8090/tcp 端口段通过 public 区域(永久生效)
firewall-cmd --zone=public --add-port=8080-8090/tcp --permanent

# 移除 public 区域的 8080/tcp 端口(永久生效)
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

iiii. 规则重载与生效

firewalld 规则修改后,需执行重载命令让永久配置生效,且不会中断现有连接:

bash 复制代码
# 重载规则(永久配置生效,运行时配置保留)
firewall-cmd --reload

# 将运行时配置保存为永久配置
firewall-cmd --runtime-to-permanent

iiiii. 富规则配置

富规则支持源地址限制、端口转发、日志记录等高级功能,语法格式:

复制代码
rule [family="ipv4|ipv6"] [source address="x.x.x.x/xx" [invert="True"]]
[port port="port|port-range" protocol="tcp|udp"]
[log [prefix="prefix text"] [level="log-level"] [limit value="rate/duration"]]
[accept|reject|drop]
示例1:允许 192.168.1.100 访问 22/tcp 端口
bash 复制代码
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept' --permanent
示例2:拒绝 10.0.0.0/24 网段的所有流量
bash 复制代码
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" reject' --permanent
示例3:允许 80/tcp 端口并记录日志
bash 复制代码
firewall-cmd --zone=public --add-rich-rule='rule port port="80" protocol="tcp" log prefix="HTTP-LOG" level="info" accept' --permanent

iiiiii. 端口转发与 NAT(伪装)

(1)开启伪装(NAT)

伪装功能用于 LAN 内主机通过防火墙访问外网 ,需在 external 等区域开启:

bash 复制代码
# 开启 public 区域的伪装功能(永久生效)
firewall-cmd --zone=public --add-masquerade --permanent

# 关闭伪装功能
firewall-cmd --zone=public --remove-masquerade --permanent
(2)端口转发

将防火墙的 80 端口转发到内网 192.168.1.200 的 8080 端口:

bash 复制代码
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.200:toport=8080 --permanent

c. 配置文件详解

firewalld 的配置文件分为 系统配置用户自定义配置,用户自定义配置优先级高于系统配置。

  1. 系统配置目录/usr/lib/firewalld/
    • 包含默认的区域、服务配置,不建议修改,升级系统时可能被覆盖。
  2. 用户自定义配置目录/etc/firewalld/
    • 区域配置:/etc/firewalld/zones/(每个区域对应一个 .xml 文件)
    • 服务配置:/etc/firewalld/services/(每个服务对应一个 .xml 文件)
    • 富规则会直接写入对应区域的 .xml 文件中。

d. firewalld 与 iptables 的区别

特性 firewalld iptables
规则生效方式 动态更新,无需重启服务 静态更新,需重启 iptables 服务
核心抽象 区域、服务、富规则 链(PREROUTING/INPUT/FORWARD等)、规则
配置复杂度 低,适合新手和快速配置 高,需理解链的流转逻辑
适用场景 服务器日常防火墙管理 复杂网络环境的精细化规则定制
底层依赖 基于 iptables/nftables 内核模块 直接操作内核 netfilter 子系统

e. 常见问题与注意事项

  1. 规则不生效?

    • 检查是否区分运行时/永久配置 ,修改永久配置后需执行 firewall-cmd --reload
    • 检查网卡是否分配到正确的区域。
    • 检查是否有其他防火墙工具(如 ufw)冲突,需关闭其他工具。
  2. 如何批量导入/导出规则?

    • 导出规则:firewall-cmd --list-all-zones > firewalld-rules.txt
    • 导入规则:将规则写入 /etc/firewalld/zones/ 对应的 .xml 文件,然后 reload
  3. firewalld 启动失败?

    • 检查是否与 iptables service 冲突,执行 systemctl stop iptables 后重试。
    • 检查配置文件是否有语法错误,可通过 firewall-cmd --check-config 验证
相关推荐
c++逐梦人2 小时前
Linux进程间通信
linux·运维·服务器
wanhengidc2 小时前
服务器硬盘都有哪些功能
大数据·运维·服务器·数据库·科技
认真的柯南2 小时前
深入解析服务器内存架构:从DRAM颗粒到NUMA模式
服务器·架构·numa
wanhengidc2 小时前
服务器分布式存储的功能
运维·服务器·分布式
w1225h2 小时前
Nginx环境安装
运维·nginx
徐子元竟然被占了!!2 小时前
Linux的less
linux·运维·less
Vect__2 小时前
muduo网络服务器项目篇:服务器模块设计
运维·服务器·网络
坚持就完事了2 小时前
Linux文件路径
linux·运维·服务器
啊哈哈121382 小时前
计算机三级备考(七)——高级数据库查询
服务器·数据库