Linux 防火墙(firewalld)详解与配置
Linux 防火墙(firewalld)详解与配置
一、防火墙的基本概念
防火墙是一种网络安全机制,通过隔离风险区域与安全区域的连接,实现以下核心目标:
- 阻止未授权访问进入内部网络,过滤不安全的服务和非法用户
- 构建防御屏障,防止入侵者接近核心防御设施
- 限制用户对特殊网络资源的访问权限
- 为监控互联网安全状态提供日志记录和审计依据
二、Linux 防火墙的底层与工具
1. netfilter 模块
netfilter 是 Linux 内核中的网络过滤模块,位于/lib/modules/(内核版本 uname -r查看)/kernel/net/netfilter
目录,负责处理网络数据包的过滤、转发等核心功能。
2. 防火墙管理工具
- iptables:CentOS 6 及更早版本的默认防火墙工具,基于命令行规则配置。
- firewalld:CentOS 7 及以上版本的动态防火墙工具,支持实时规则更新,无需重启服务即可生效,是本文的核心内容。
三、firewalld 的核心概念与基础操作
1. 区域(Zone)
firewalld 通过 “区域” 管理不同信任级别的网络连接,内置 3 个特殊区域:
- drop:强制拒绝所有传入流量,不返回任何响应(类似 “无声拒绝”)。
- block:拒绝所有传入流量,但会返回拒绝响应(类似 “礼貌拒绝”)。
- trusted:允许所有传入流量,无任何限制。
注意:drop 和 block 区域无论是否勾选服务,均默认禁止所有流量;trusted 区域则默认允许所有流量。
2. 基本命令行操作(firewall-cmd)
(1)查看防火墙状态与区域信息
# 查看当前区域的所有配置信息
firewall-cmd --list-all# 查看默认区域
firewall-cmd --get-default-zone#查看所有区域的配置信息
firewall-cmd --list-all-zones # 切换默认区域(例如设置为home)
firewall-cmd --set-default-zone=home
(2)管理服务与端口
# 临时添加http服务(当前生效,重启后失效)
firewall-cmd --add-service=http# 永久添加82/tcp端口(需重载生效)
firewall-cmd --add-port=82/tcp --permanent# 移除ftp服务(永久生效)
firewall-cmd --remove-service=ftp --permanent# 重载配置使永久规则生效
firewall-cmd --reload
说明:
--permanent
参数表示规则永久生效,需执行firewall-cmd --reload
后应用;不带此参数则仅当前运行时生效。
四、富规则(Rich Rule)配置
富规则用于定义复杂的防火墙策略,支持基于源地址、服务、端口等多条件的精细控制,语法结构包括family
(协议族)、source
(源地址)、service
(服务)、log
(日志)、action
(动作)等。
1. 基本动作说明
- accept:允许流量通过。
- reject:拒绝流量,并返回拒绝响应(如 “端口不可达”)。
- drop:直接丢弃流量,不返回任何响应。
规则优先级:当拒绝规则与允许规则冲突时,拒绝规则优先生效。
2. 富规则实战示例
(1)允许特定网段访问 http 服务
# 允许172.16.30.0/24网段访问http服务(永久生效)
firewall-cmd --add-rich-rule='rule family=ipv4source address=172.16.30.0/24service name=httpaccept
' --permanent
firewall-cmd --reload
(2)带日志记录的规则配置
# 允许172.16.30.0/24访问http,以notice级别记录日志(每分钟最多10条)
firewall-cmd --add-rich-rule='rule family=ipv4source address=172.16.30.0/24service name=httplog prefix="http_access" level=notice limit value=10/maccept
' --zone=public --permanent
firewall-cmd --reload
- 日志级别:从高到低为
emerg
、alert
、crit
、error
、warning
、notice
、info
、debug
。 - limit 参数:
value=rate/duration
,如10/m
表示每分钟最多 10 条日志(s = 秒、m = 分、h = 时、d = 天)。
(3)临时拒绝特定网段的 ssh 连接
# 10分钟内(600秒)拒绝172.16.30.0/24的ssh连接,每分钟记录2条审计日志
firewall-cmd --add-rich-rule='rule family=ipv4source address=172.16.30.0/24service name=sshaudit limit value=2/mreject
' --timeout=600
五、高级功能:伪装与端口转发
1. IP 伪装(NAT 转发)
伪装功能允许内部网络通过防火墙的公网 IP 访问外部网络,需先开启内核 IP 转发:
# 开启IP转发(永久生效)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p # 立即生效# 对public区域启用伪装(允许172.16.30.0/24网段通过)
firewall-cmd --add-rich-rule='rule family=ipv4source address=172.16.30.0/24masquerade
' --zone=public --permanent# 或直接对区域启用伪装(所有源地址)
firewall-cmd --add-masquerade --zone=public --permanent
firewall-cmd --reload
2. 端口转发
将访问本地特定端口的流量转发到其他端口或主机。
(1)本地端口转发
# 临时将8000/tcp端口转发到80/tcp(目标地址为172.16.30.130)
firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80:toaddr=172.16.30.130
(2)基于富规则的跨网段转发
# 永久将12.12.12.0/24访问本地80端口的流量转发到172.16.30.30的80端口
firewall-cmd --add-rich-rule='rule family=ipv4source address=12.12.12.0/24forward-port port=80 protocol=tcp to-port=80 to-addr=172.16.30.30
' --permanent
firewall-cmd --reload
(3)特定网段访问转发
# 永久将172.16.30.0/24访问本地9527端口的流量转发到80端口
firewall-cmd --add-rich-rule='rule family=ipv4source address=172.16.30.0/24forward-port port=9527 protocol=tcp to-port=80
' --permanent
firewall-cmd --reload
六、补充:禁 Ping 配置
通过内核参数禁止 ICMP echo 请求(即禁 Ping):
# 永久禁Ping
echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.conf
sysctl -p # 立即生效
总结
firewalld 通过区域、服务、富规则等机制实现了灵活的防火墙管理,核心操作包括:
- 基础服务 / 端口的添加与移除;
- 富规则的精细控制(含日志、源地址限制);
- 伪装与端口转发的高级配置。
合理配置防火墙规则可有效提升系统安全性,实际使用中需根据业务场景选择 “最小权限” 原则,仅开放必要的服务和端口。