1. 基本概念
- Firewalld 是 Linux 系统中用于管理防火墙规则的工具,基于 D-Bus 接口,支持动态更新规则而无需重启服务,适用于 CentOS 7+、RHEL 7+、Fedora 等系统。
- 核心功能:通过 区域(Zone) 和 服务(Service) 简化防火墙配置,支持 IPv4/IPv6、网络地址转换(NAT)、端口转发等。
2. 关键术语
- 区域(Zone):预定义的规则集合,根据网络环境的安全等级应用不同规则(如
public
、private
、trusted
等)。 - 服务(Service):预定义的端口 / 协议组合(如
ssh
、http
、https
等),可直接调用。 - 永久规则(Permanent):重启服务或系统后仍生效的规则。
- 临时规则(Non-permanent):仅在当前运行时生效,重启后失效。
二、Firewalld 常用命令
1. 服务控制
命令 |
说明 |
|
启动防火墙服务 |
|
停止防火墙服务 |
|
重启防火墙服务 |
|
设置开机自启 |
|
取消开机自启 |
|
查看服务状态(是否运行、规则加载情况等) |
2. 查看状态
- 查看默认区域:bash
firewall-cmd --get-default-zone
- 查看所有区域及规则:bash
firewall-cmd --list-all-zones
- 查看当前区域规则:bash
firewall-cmd --list-all # 临时规则
firewall-cmd --list-all --permanent # 永久规则
3. 区域管理
- 设置默认区域:bash
firewall-cmd --set-default-zone=<zone-name> # 如 public
- 查询接口所属区域:bash
firewall-cmd --get-zone-of-interface=<interface-name> # 如 eth0
- 将接口添加到指定区域:bash
firewall-cmd --zone=<zone-name> --add-interface=<interface-name> --permanent
4. 服务与端口操作
- 允许服务通过防火墙:bash
firewall-cmd --zone=<zone-name> --add-service=<service-name> --permanent # 如 ssh
- 禁止服务通过防火墙:bash
firewall-cmd --zone=<zone-name> --remove-service=<service-name> --permanent
- 允许端口 / 协议通过防火墙:bash
firewall-cmd --zone=<zone-name> --add-port=<port>/<protocol> --permanent # 如 80/tcp
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --zone=<zone-name> --remove-port=<port>/<protocol> --permanent
5. 重载与生效
- 加载永久规则(使修改生效):bash
firewall-cmd --reload
- 临时规则立即生效(无需重启):bash
firewall-cmd --add-service=http # 临时规则,重启后失效
三、预定义区域(Zone)详解
区域名称 |
安全级别 |
默认规则(允许的流量) |
适用场景 |
|
最低 |
仅允许 SSH、DHCPv6 客户端 |
公共网络(如开放 Wi-Fi) |
|
中等 |
允许 SSH、MDNS、Samba 客户端等 |
家庭或办公网络 |
|
最高 |
允许所有流量 |
可信网络(如本地局域网) |
|
低 |
允许 SSH,拒绝其他入站流量 |
隔离区(DMZ)服务器 |
|
拒绝所有入站 |
仅响应出站请求 |
阻断所有外部连接 |
|
拒绝所有入站 |
丢弃数据包(不响应) |
严格阻断外部连接 |
四、高级功能配置
1. 端口转发(NAT)
- 启用 IP 转发(需先配置内核参数):bash
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p # 立即生效
- 配置端口转发规则:bash
# 将外部 8080 端口转发到内部服务器 80 端口
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent
firewall-cmd --reload
2. 富规则(Rich Rules)
用于定义更复杂的规则(优先级高于普通规则):bash
# 允许来自 192.168.1.0/24 的 SSH 连接
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
# 拒绝特定 IP 访问 80 端口
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="80" protocol="tcp" reject' --permanent
3. 查看规则优先级
bash
firewall-cmd --list-rich-rules # 查看富规则
firewall-cmd --list-ports # 查看端口规则
firewall-cmd --list-services # 查看服务规则
五、故障排除与注意事项
- 规则不生效?
- 检查是否添加了
--permanent
参数(永久规则需重载生效)。 - 使用
firewall-cmd --reload
重新加载规则。 - 确认区域是否正确应用到接口(
firewall-cmd --get-zone-of-interface=<interface>
)。
- 端口仍被阻止?
- 检查是否同时存在临时规则和永久规则,临时规则优先级更高。
- 使用
tcping
或nmap
测试端口连通性:bash
nmap -p <port> <target-ip>
- 服务与端口映射
- 部分服务(如 Docker)可能动态占用端口,需单独配置或关闭防火墙。
- 若服务未在预定义
service
中,需手动添加端口规则。
六、参考资料
- 官方文档:Firewalld Documentation
- CentOS 手册:
man firewall-cmd
- 最佳实践:生产环境中建议先在测试环境验证规则,避免误封导致服务中断。
通过以上笔记,可快速掌握 Firewalld 的基础配置和高级功能,根据实际网络环境灵活调整规则,确保系统安全。
Firwalld防火墙笔记多
以下是进一步补充和扩展的 Firewalld 防火墙笔记,涵盖更多细节、实战技巧和常见场景,帮助你更全面地掌握这一工具:
七、Firewalld 配置文件解析
Firewalld 的配置存储在 /etc/firewalld/
目录下,主要文件包括:
firewalld.conf
- 全局配置文件,定义默认区域、日志级别、IPv6 支持等。
- 示例配置:ini
[firewalld]
default-zone=public
ipv6_routing=no
logging=off
zones/
目录
- 每个区域对应一个
.xml
文件(如public.xml
),存储该区域的规则。 - 手动编辑示例(添加 8080 端口规则):xml
<zone name="public">
<port port="8080" protocol="tcp"/>
</zone>
- 注意:手动修改配置文件后需执行
firewall-cmd --reload
加载规则。
services/
目录
- 预定义服务的
.xml
文件(如ssh.xml
),可自定义服务。 - 自定义服务示例(创建
myapp.xml
):xml
<service name="myapp" short="My App Service" description="Allow My App Traffic">
<port port="5000" protocol="tcp"/>
<port port="5001" protocol="udp"/>
</service>
- 加载自定义服务:bash
firewall-cmd --add-service=myapp --permanent
八、实战场景配置示例
1. 多网卡不同区域配置
需求:服务器有两张网卡,eth0
连接公网(public
区域),eth1
连接内网(private
区域)。
配置步骤:
bash
# 将 eth0 加入 public 区域(默认可能已生效)
firewall-cmd --zone=public --add-interface=eth0 --permanent
# 将 eth1 加入 private 区域
firewall-cmd --zone=private --add-interface=eth1 --permanent
# 分别配置区域规则:
# public 区域仅允许 SSH 和 HTTP
firewall-cmd --zone=public --add-service={ssh,http} --permanent
# private 区域允许 SSH、Samba(文件共享)和自定义端口 3306
firewall-cmd --zone=private --add-service={ssh,samba} --add-port=3306/tcp --permanent
firewall-cmd --reload
2. 基于时间的访问控制
需求:仅允许办公时段(9:00-18:00)访问 Web 服务(80 端口)。
实现方法:结合富规则和 time
模块:
bash
firewall-cmd --zone=public --add-rich-rule='rule service name="http" accept time "weekdays 09:00-18:00"' --permanent
firewall-cmd --reload
3. 容器环境下的防火墙配置(Docker)
问题:Docker 容器默认使用 NAT 模式,可能导致防火墙规则失效。
解决方案:
- 允许 Docker 桥接接口(
docker0
)流量:bash
firewall-cmd --zone=public --add-interface=docker0 --permanent
firewall-cmd --reload
- 为容器指定固定 IP 并配置端口映射规则:bash
# 假设容器 IP 为 172.17.0.2,映射主机 8080 到容器 80
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=172.17.0.2 --permanent
firewall-cmd --reload
九、性能优化与安全策略
1. 批量操作提升效率
- 使用
--permanent
和--zone
参数批量添加规则,减少--reload
次数:bash
firewall-cmd --permanent --zone=public --add-service={ssh,https,dns} --add-port={8080,9090}/tcp
firewall-cmd --reload # 仅需一次重载
2. 限制并发连接数与速率
通过富规则配置连接限制(防止 DDoS 入侵):bash
# 限制 SSH 并发连接数为 5 个
firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" limit value="5/minute" accept' --permanent
# 限制 HTTP 流量速率为 100 包/秒
firewall-cmd --zone=public --add-rich-rule='rule service name="http" limit value="100/s" accept' --permanent
3. 启用日志记录
- 配置防火墙日志(记录被拒绝的流量):bash
# 修改全局配置文件
sed -i 's/logging=off/logging=on/' /etc/firewalld/firewalld.conf
sed -i 's/log-level=error/log-level=info/' /etc/firewalld/firewalld.conf
# 在区域中开启日志(以 public 为例)
firewall-cmd --zone=public --set-log-level=info --permanent
firewall-cmd --zone=public --add-rich-rule='rule action="log" log-prefix="DENY: " level="info"' --permanent
firewall-cmd --reload
- 查看日志:bash
tail -f /var/log/firewalld
十、与其他工具对比
工具 |
优势 |
劣势 |
适用场景 |
Firewalld |
动态更新、区域管理、图形界面支持 |
配置复杂度高于 |
企业级服务器、需要灵活规则的场景 |
Iptables |
性能高、灵活性强 |
静态配置、需手动管理链 |
传统 Linux 服务器、性能敏感场景 |
Nftables |
下一代防火墙,支持更复杂规则 |
学习曲线陡峭 |
高级网络策略、容器化环境(如 Kubernetes) |
十一、常见错误与解决方法
- 错误:No rule to chain
- 原因:手动修改
iptables
规则导致 Firewalld 管理混乱。 - 解决:清空
iptables
规则并由 Firewalld 接管:bash
iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X
firewall-cmd --reload
- 错误:ZONE_CONFLICT
- 原因:同一接口被分配到多个区域。
- 解决:检查接口所属区域并调整:bash
firewall-cmd --get-zone-of-interface=eth0 # 确认当前区域
firewall-cmd --zone=public --remove-interface=eth0 --permanent # 移除冲突区域
- 端口映射失效
- 原因:未启用 IP 转发或目标地址不可达。
- 解决:bash
sysctl -w net.ipv4.ip_forward=1 # 临时启用
# 检查目标服务器是否可达
ping 192.168.1.100
十二、扩展学习资源
- 官方教程:Firewalld 入门指南
- 实战案例:使用 Firewalld 构建 DMZ 网络
- 社区工具:
- FirewallD Configuration Assistant:图形化配置工具(
firewall-config
命令)。 - Ansible 模块:通过
firewalld
模块自动化配置防火墙。