Skip to content
Kurisu
Go back

Firewalld 防火墙

Firewalld 是 RHEL9 默认的动态防火墙,底层 nftables。


一、Firewalld 概述

Firewalld 是动态可定制的防火墙守护进程,改规则无需重启服务。两个核心概念:

# 查看当前后端
grep FirewallBackend /etc/firewalld/firewalld.conf
# FirewallBackend=nftables (默认)

二、Zone 区域管理

预定义区域

区域说明
block拒绝所有入站连接,返回 ICMP 拒绝消息
dmz非军事区,有限访问内部网络
drop丢弃所有入站数据包,无任何通知
external外部网络,用于路由器,启用伪装
home家庭网络,信任其他计算机
internal内部网络,主要信任其他计算机
public公共区域(默认),不信任其他计算机
trusted信任区,接受所有网络连接
work工作区域,基本信任其他计算机

区域操作

# 查看所有区域
firewall-cmd --get-zones

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

# 查看当前区域所有设置
firewall-cmd --list-all

# 查看指定区域
firewall-cmd --list-all --zone=home

# 修改默认区域
firewall-cmd --set-default-zone=dmz

# 创建自定义区域
firewall-cmd --new-zone=testzone --permanent
firewall-cmd --reload

三、Service 服务管理

服务是端口、协议、目标地址的集合,添加即自动开端口。

# 查看所有预定义服务
firewall-cmd --get-services

# 查看当前区域允许的服务
firewall-cmd --list-services

# 添加服务
firewall-cmd --add-service=http
firewall-cmd --add-service=https --permanent

# 移除服务
firewall-cmd --remove-service=ftp

# 使运行时设置永久生效
firewall-cmd --runtime-to-permanent

# 重新加载
firewall-cmd --reload

自定义服务

# 创建新服务
firewall-cmd --new-service=myapp --permanent

# 编辑服务配置文件
vim /etc/firewalld/services/myapp.xml

服务 XML 示例:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MyApp</short>
  <description>Custom Application Service</description>
  <port protocol="tcp" port="8080"/>
  <port protocol="udp" port="8081"/>
</service>

四、Port 端口管理

# 查看已开放端口
firewall-cmd --list-ports

# 开放端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=3306/tcp --permanent

# 开放端口范围
firewall-cmd --add-port=8000-8100/tcp

# 关闭端口
firewall-cmd --remove-port=8080/tcp

五、紧急 Panic 模式

遭攻击时立即切断所有流量:

# 启用紧急模式(所有网络流量停止)
firewall-cmd --panic-on

# 关闭紧急模式(恢复永久设置)
firewall-cmd --panic-off

# 查看紧急模式状态
firewall-cmd --query-panic

警告:Panic 开启后只能靠物理访问或串行控制台恢复!


六、Rich Rules 富规则

富规则提供更精细的控制:

# 允许特定 IP 访问特定端口
firewall-cmd --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.100"
  port protocol="tcp" port="22" accept'

# 限制连接速率
firewall-cmd --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  limit value="5/m"
  accept'

# 记录并丢弃
firewall-cmd --add-rich-rule='
  rule family="ipv4"
  source address="10.0.0.0/8"
  log prefix="DROP_NET: " level="info"
  drop'

七、端口转发与伪装

# 启用伪装(NAT)
firewall-cmd --add-masquerade --permanent

# 端口转发:外部 8080 → 内部 80
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80

# 转发到其他主机
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10

八、服务控制命令

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

# 开机自启
systemctl enable firewalld
systemctl disable firewalld

# 屏蔽服务(禁止启动)
systemctl mask firewalld
systemctl unmask firewalld

# 查看状态
systemctl status firewalld
firewall-cmd --state

九、最佳实践

  1. 最小权限:只开必需的服务和端口
  2. 定期审计:firewall-cmd --list-all
  3. 持久化:--runtime-to-permanent 或 --permanent
  4. 配合 SELinux:双重防护,setenforce 1
  5. 默认 Zone:生产建议 public / dmz


Share this post:

Previous Post
Kali Linux 入门
Next Post
Linux 计划任务