Linux防火墙firewalld------基础命令与实战
一、firewalld 基础知识
1. 什么是 firewalld?
随着网络攻击日渐严重,服务器安全等级的提升就显得非常必要了,良好的防火墙配置能有效的防止或者阻止外部攻击,减少服务器损失,提升整体服务的安全,而这里的主角就是firewall。
firewalld 是基于 zones 和 services 的动态防火墙管理工具,替代传统的 iptables 管理方式。它提供了更为灵活和人性化的防火墙管理方式。
2. firewalld 与 iptables 的关系
firewalld 并不是替代 iptables,而是封装了 iptables 的规则管理。其内部仍使用 iptables 或 nftables 作为底层防火墙框架。
3. firewalld 工作原理
- Zone:区域表示网络接口的信任等级(如 public、internal、trusted)
- Service:定义特定端口和协议的集合
- Rich Rules:更灵活细致的规则,支持源地址、端口、协议等组合
4. firewalld 与 systemd 管理方式
通过 systemctl 管理 firewalld 服务:
bash
# 启动防火墙
systemctl start firewalld
# 开机启动防火墙
systemctl enable firewalld
# 查看服务状态
systemctl status firewalld
二、firewalld 常用命令
1. 启停与状态检查
ini
# 查看当前状态
firewall-cmd --state
# 查看所有规则
firewall-cmd --list-all
# 查看指定区域的规则
firewall-cmd --list-all --zone=docker
# 重新加载配置,任何配置修改以后必须得reload,否则不生效
firewall-cmd --reload
2. 查看与修改区域设置
csharp
# 列出所有的区域的名字
firewall-cmd --get-zones
# 查看所有区域的配置
firewall-cmd --list-all-zones
# 查看激活的区域
firewall-cmd --get-active-zones
# 添加区域
firewall-cmd --zone=public --add-interface=eth0
# 删除区域
firewall-cmd --zone=public --remove-interface=eth0
3. 添加/删除端口规则
csharp
# 向public公共区域放行端口8080 协议是tcp
firewall-cmd --zone=public --add-port=8080/tcp
# 删除8080端口的开放
firewall-cmd --zone=public --remove-port=8080/tcp
# 开放20000-30000范围之间的所有端口
firewall-cmd --zone=public --add-port=20000-30000/tcp --permanent
# 刷新配置并生效
firewall-cmd --reload
4. 使用 Rich Rule 管理访问
ini
#添加rule规则,允许网段192.168.1.0/24内的任何IP访问端口8080,提升访问安全。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" accept'
# 查看rulue规则
firewall-cmd --list-rich-rules
# 删除rule规则
firewall-cmd --permanent --remove-rich-rule='...'
# 对内网192.168.1.0/24网段开放3306端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
三、Rich Rule讲解
Rich Rule 是 firewalld 提供的灵活的防火墙规则定义语法。其格式接近自然语言,并允许你基于多种维度(如源地址、目的端口、协议、接口等)控制访问行为。
css
rule [family="ipv4|ipv6"] [source address="IP/CIDR"] \
[destination address="IP/CIDR"] \
[service name="服务名"] \
[port port="端口号" protocol="tcp|udp"] \
[protocol value="ICMP|..."] \
[log prefix="字符串" level="info|notice|warn|..."] \
[accept|reject|drop]
字段说明:
字段名 | 说明 |
---|---|
family | IP协议族,ipv4 或 ipv6 |
source address | 来源地址(IP 或网段) |
destination address | 目标地址(很少用,内网多服务时有用) |
service name | firewalld 已知的服务名(如 http、ssh) |
port port=xx | 端口号 |
protocol | 协议,如 tcp、udp、icmp |
log prefix | 添加日志前缀 |
log level | 日志级别,如 info、notice |
accept/reject/drop | 动作类型 |
场景 1:允许某个 IP 访问指定端口:
makefile
# 允许源IP是192.168.1.10访问本机8080端口 协议是tcp
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="8080" protocol="tcp" accept'
场景 2: 拒绝某 IP 段的所有访问:
csharp
# 拒绝10.0.0.0/8网段的所有访问
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" reject'
场景3:丢弃某 IP 的数据包(静默处理,不通知):
csharp
# 丢弃源IP是192.168.0.5的所有流量
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.5" drop'
四、firewalld 与 Docker 的关系
1. Docker 与防火墙的交互机制
- Docker 默认通过 iptables 设置 nat 转发规则
- firewalld 在 reload 时可能清除这些规则,导致容器无法访问外部或无法被访问
2. 容器无法访问内网服务的常见原因
可能由于 firewalld 清理了 docker0 桥接接口的转发规则。
3. 正确放通 Docker 桥接网络
css
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload
4. 示例:Docker 容器服务只允许特定网段访问
rust
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" destination address="172.17.0.2" port port="8080" protocol="tcp" accept'
五、进阶与故障排查
1. 开启日志查看被拒绝的连接
ini
firewall-cmd --set-log-denied=all
journalctl -xe | grep firewalld
# 查看日志
systemctl status firewalld -l
2. tcpdump 流量排查
yaml
# 查看网卡ens33的端口8080的流量
tcpdump -i ens33 port 8080 -vv
3. 防火墙配置文件路径
/etc/firewalld/zones/
/usr/lib/firewalld/services/
4. iptables 与 firewalld 的冲突建议
- 使用 firewalld 后避免直接编辑 iptables,否则可能被覆盖
- 建议关闭 firewalld 后再使用 iptables或者直接关闭iptables而使用firewalld
六、总结
firewalld 提供了比 iptables 更易管理的防火墙机制,适合大多数现代 Linux 发行版。通过 zone、service、rich rules 的组合,配合 Docker 环境配置,可以实现灵活精细的安全策略控制。理解其工作原理与实际影响是高效使用防火墙的重要前提。