Linux - firewall 防火墙
🔥 什么是 firewalld?
firewalld
是一个动态管理防火墙的守护进程(daemon),它提供了一个 D-Bus 接口来管理系统或用户的防火墙规则。与传统的静态 iptables
不同,firewalld
支持:
- 区域(Zones)
- 服务(Services)
- 端口/协议控制
- NAT、IP伪装、端口转发等高级功能
适用于 RHEL/CentOS/Fedora/SUSE/openSUSE 等主流 Linux 发行版。
🧱 firewalld 的核心概念
1. 区域(Zone)
firewalld
将网络连接划分为不同的“区域”,每个区域有不同的信任级别和默认策略。
Zone Name | Description |
| 最低信任度,丢弃所有未明确允许的包 |
| 拒绝所有入站连接(带 ICMP 拒绝响应) |
| 公共网络,默认配置,用于外部环境 |
| 外部网络,启用了 NAT |
| 隔离区,只允许特定服务访问 |
| 工作网络,信任部分内部设备 |
| 家庭网络,信任较多内部设备 |
| 内部网络,高度信任 |
| 最高信任,允许所有流量 |
可以通过命令查看当前默认区域:
sudo firewall-cmd --get-default-zone
2. 服务(Service)
预定义的服务是一组端口和协议的组合,例如:
ssh
http
https
ftp
samba
- 自定义服务(可添加)
查看所有支持的服务:
sudo firewall-cmd --get-services
3. 端口(Port)
可以按协议(TCP/UDP)开放指定端口,例如:
sudo firewall-cmd --add-port=8080/tcp
4. 运行时 vs 永久设置
- 运行时设置:重启后失效。
- 永久设置:加上
--permanent
参数保存,重启后依然生效。
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
🛠️ 常用命令详解
一,基本命令
firewalld
是一个动态管理 Linux 系统防火墙的工具,它使用 firewall-cmd
命令进行配置。以下是一些常用的 firewall-cmd
命令及其说明:
1. 启动 firewalld
服务
sudo systemctl start firewalld
2. 停止 firewalld
服务
sudo systemctl stop firewalld
3. 重启 firewalld
服务
sudo systemctl restart firewalld
4. 启用 firewalld
服务开机自启动
sudo systemctl enable firewalld
5. 禁用 firewalld
服务开机自启动
sudo systemctl disable firewalld
6. 查看 firewalld
服务状态
sudo systemctl status firewalld
二,基本防火墙操作
1. 查看防火墙状态
sudo firewall-cmd --state
2. 查看当前区域信息
sudo firewall-cmd --get-active-zones
3. 查看接口所属区域
sudo firewall-cmd --get-zone-of-interface=interface_name
示例:查看 eth0
接口所属区域
sudo firewall-cmd --get-zone-of-interface=eth0
4. 列出所有区域
sudo firewall-cmd --list-all-zones
三,配置防火墙规则
1. 添加服务到区域(立即生效,不持久化)
sudo firewall-cmd --zone=zone_name --add-service=service_name
示例:在 public
区域添加 HTTP 服务
sudo firewall-cmd --zone=public --add-service=http
2. 添加服务到区域(持久化)
sudo firewall-cmd --zone=zone_name --add-service=service_name --permanent
示例:在 public
区域持久化添加 HTTP 服务
sudo firewall-cmd --zone=public --add-service=http --permanent
3. 移除服务(立即生效,不持久化)
sudo firewall-cmd --zone=zone_name --remove-service=service_name
示例:在 public
区域移除 HTTP 服务
sudo firewall-cmd --zone=public --remove-service=http
4. 移除服务(持久化)
sudo firewall-cmd --zone=zone_name --remove-service=service_name --permanent
示例:在 public
区域持久化移除 HTTP 服务
sudo firewall-cmd --zone=public --remove-service=http --permanent
四,端口管理
1. 添加端口(立即生效,不持久化)
sudo firewall-cmd --zone=zone_name --add-port=port/protocol
示例:在 public
区域添加 TCP 端口 8080
sudo firewall-cmd --zone=public --add-port=8080/tcp
2. 添加端口(持久化)
sudo firewall-cmd --zone=zone_name --add-port=port/protocol --permanent
示例:在 public
区域持久化添加 TCP 端口 8080
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
3. 移除端口(立即生效,不持久化)
sudo firewall-cmd --zone=zone_name --remove-port=port/protocol
示例:在 public
区域移除 TCP 端口 8080
sudo firewall-cmd --zone=public --remove-port=8080/tcp
4. 移除端口(持久化)
sudo firewall-cmd --zone=zone_name --remove-port=port/protocol --permanent
示例:在 public
区域持久化移除 TCP 端口 8080
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
五,其他常用命令
1. 重新加载防火墙配置
sudo firewall-cmd --reload
2. 列出当前区域所有规则
sudo firewall-cmd --zone=zone_name --list-all
示例:列出 public
区域的所有规则
sudo firewall-cmd --zone=public --list-all
3. 查看所有可用服务
sudo firewall-cmd --get-services
4. 添加 IP 地址到信任区域
sudo firewall-cmd --zone=trusted --add-source=ip_address
示例:信任 192.168.1.100
IP 地址
sudo firewall-cmd --zone=trusted --add-source=192.168.1.100
5. 移除 IP 地址从信任区域
sudo firewall-cmd --zone=trusted --remove-source=ip_address
示例:移除 192.168.1.100
IP 地址
sudo firewall-cmd --zone=trusted --remove-source=192.168.1.100
这些命令可以帮助您管理和配置 firewalld
防火墙,确保系统的网络安全。
六 查看状态和基本信息
# 查看是否运行
sudo firewall-cmd --state# 查看当前默认区域
sudo firewall-cmd --get-default-zone# 查看当前活动的区域及其接口
sudo firewall-cmd --get-active-zones# 查看当前区域的所有规则
sudo firewall-cmd --list-all
✅ 添加规则(服务 / 端口 / 协议)
开放服务
# 添加 SSH 服务(临时)
sudo firewall-cmd --add-service=ssh# 永久添加 HTTP 服务
sudo firewall-cmd --permanent --add-service=http# 重新加载配置
sudo firewall-cmd --reload
开放端口
# 开放单个端口
sudo firewall-cmd --permanent --add-port=8080/tcp# 开放端口范围
sudo firewall-cmd --permanent --add-port=5000-6000/udp# 删除端口
sudo firewall-cmd --permanent --remove-port=8080/tcp
🔄 修改默认区域
# 设置默认区域为 public
sudo firewall-cmd --set-default-zone=public
🌐 IP 地址过滤(黑白名单)
白名单(允许某个 IP)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept'
黑名单(拒绝某个 IP)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject'
📦 NAT 和端口转发
启用 masquerade(IP伪装):
sudo firewall-cmd --permanent --add-masquerade
将 80 端口转发到 8080:
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
将 80 端口转发到另一台主机:
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100
📄 富规则(Rich Rules)
富规则提供了更细粒度的控制方式,例如:
# 允许来自 192.168.1.0/24 的 SSH 访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'# 拒绝特定 MAC 地址访问
sudo firewall-cmd --permanent --add-rich-rule='rule source mac="aa:bb:cc:dd:ee:ff" drop'
📋 日志记录
开启日志记录:
sudo firewall-cmd --permanent --add-log-denied=all
选项包括:
all
:所有被拒绝的数据包unicast
:单播数据包broadcast
:广播数据包multicast
:多播数据包
📂 配置文件路径
- 服务定义文件:
/usr/lib/firewalld/services/
- 区域定义文件:
/usr/lib/firewalld/zones/
- 用户自定义配置:
/etc/firewalld/
🧪 示例:配置 Web 服务器防火墙
# 启用 firewalld
sudo systemctl enable firewalld --now# 设置默认区域为 public
sudo firewall-cmd --set-default-zone=public# 永久开放 HTTP 和 HTTPS 服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https# 开放 8080 端口用于测试应用
sudo firewall-cmd --permanent --add-port=8080/tcp# 添加 IP 白名单
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept'# 限制 SSH 到特定 IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'# 拒绝其他所有 SSH 请求
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject'# 重载配置
sudo firewall-cmd --reload
📚 总结:firewalld 优势
优点 | 描述 |
动态更新 | 不需要重启服务即可修改规则 |
区域划分 | 更灵活地适应不同网络环境 |
易于维护 | 提供了服务抽象,简化配置 |
支持 Rich Rules | 细粒度控制访问权限 |
图形界面支持 | GNOME/KDE 下有图形化工具 |