【Linux日新月异(五)】CentOS 7防火墙深度解析:firewalld全面指南

🌌提供:

  1. Kimi K2 Thinking(网站: 大语言模型(Large Language Model, LLM),是当前人工智能领域的重要技术分支,专注于自然语言处理和生成任务。)【开源】「AL」〖✿✿✿✿✿〗
    🔔说明: 本文内容由Kimi K2生成。AI创作虽经校对,仍难免疏漏或偏颇之处。若您发现错漏、或有任何建议,恳请不吝赐教。您的每一次指正,都是我改进与成长的重要指引。
    📓摘要:
    略...(有好建议的可以留言哦~~~(✿◕‿◕✿))


🔥 CentOS 7防火墙深度解析:firewalld全面指南

CentOS 7摒弃了传统iptables,采用firewalld作为默认防火墙管理工具!底层仍调用iptables,但提供了动态管理、区域化配置等高级特性。


一、🔍 核心概念速览

1. 区域(Zone)- 安全领域的划分

bash 复制代码
firewall-cmd --get-zones
# 输出:block dmz drop external home internal public trusted work
  • public :默认区域,不信任的网络
  • trusted :信任所有连接
  • drop :丢弃所有进入包
  • home/internal :家庭/内部网络

2. 服务(Service)- 预定义应用规则

bash 复制代码
firewall-cmd --get-services
# 包含:ssh http https mysql redis 等预配置服务

二、📊 状态查看命令大全

1. 查看防火墙运行状态

bash 复制代码
systemctl status firewalld
firewall-cmd --state          # 简洁输出:running/not running

2. 查看当前活动区域

bash 复制代码
firewall-cmd --get-active-zones
# 输出示例:
# public
#   interfaces: eth0

3. 查看默认区域

bash 复制代码
firewall-cmd --get-default-zone

4. 查看指定区域规则

bash 复制代码
firewall-cmd --zone=public --list-all
# 输出解析:
# public (active)
#   target: default
#   icmp-block-inversion: no
#   interfaces: eth0
#   sources: 
#   services: ssh dhcpv6-client
#   ports: 8080/tcp
#   protocols: 
#   masquerade: no
#   forward-ports: 
#   source-ports: 
#   icmp-blocks: 
#   rich rules:

5. 查看所有区域详情

bash 复制代码
firewall-cmd --list-all-zones

6. 查询端口是否开放

bash 复制代码
firewall-cmd --zone=public --query-port=8080/tcp
# 输出:yes 或 no

# 查询服务是否开放
firewall-cmd --zone=public --query-service=ssh

三、🛠️ 核心操作命令与语法

1. 启动/停止/重启防火墙

bash 复制代码
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
systemctl reload firewalld      # 重载配置(不中断连接)

2. 设置开机自启

bash 复制代码
systemctl enable firewalld
systemctl disable firewalld

3. 添加/移除服务

bash 复制代码
# 临时添加(立即生效,重启后失效)
firewall-cmd --zone=public --add-service=http

# 永久添加(需reload)
firewall-cmd --zone=public --add-service=http --permanent

# 移除服务
firewall-cmd --zone=public --remove-service=http --permanent

4. 添加/移除端口

bash 复制代码
# 临时开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp

# 永久开放8080-8090端口范围
firewall-cmd --zone=public --add-port=8080-8090/tcp --permanent

# 开放UDP端口
firewall-cmd --zone=public --add-port=53/udp --permanent

# 移除端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

5. 重新加载配置

bash 复制代码
firewall-cmd --reload
# 注意:--reload不会中断已有连接,--complete-reload会中断!

四、🎯 实战案例深度解析

案例1:开放Web服务器

bash 复制代码
# 需求:开放80端口,且永久生效
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload

# 验证:
firewall-cmd --zone=public --query-service=http  # 输出: yes
netstat -tuln | grep 80                          # 确认服务监听

解析:使用预定义服务比直接开放端口更规范,因为服务配置文件包含端口和协议信息。


案例2:开放自定义应用端口

bash 复制代码
# 需求:部署在8080的Java应用
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

# 查看效果:
firewall-cmd --zone=public --list-ports
# 输出:8080/tcp

案例3:限制特定IP访问SSH

bash 复制代码
# 需求:仅允许192.168.1.100访问SSH
firewall-cmd --zone=public --remove-service=ssh --permanent
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent
firewall-cmd --reload

# 查看富规则:
firewall-cmd --zone=public --list-rich-rules

富规则语法结构

复制代码
rule [family="ipv4|ipv6"]
  [source address="address/mask"]
  [destination address="address/mask"]
  [port port="port" protocol="tcp|udp"]
  [service name="service"]
  [log [prefix="prefix"] [level="loglevel"]]
  [accept|reject|drop]

案例4:端口转发

bash 复制代码
# 需求:将公网8080转发到内网80
firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
firewall-cmd --reload

# 需开启IP伪装(NAT)
firewall-cmd --zone=public --add-masquerade --permanent

案例5:临时测试端口

bash 复制代码
# 测试期间开放,不写入永久配置
firewall-cmd --zone=public --add-port=3000/tcp

# 测试完成后移除
firewall-cmd --zone=public --remove-port=3000/tcp
# 无需reload,立即生效

案例6:创建自定义服务

bash 复制代码
# 1. 复制模板
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/myapp.xml

# 2. 编辑服务文件
vi /etc/firewalld/services/myapp.xml
# 内容:
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MyApp</short>
  <description>My custom application</description>
  <port protocol="tcp" port="8888"/>
</service>

# 3. 重新加载配置
firewall-cmd --reload

# 4. 使用自定义服务
firewall-cmd --zone=public --add-service=myapp --permanent
firewall-cmd --reload

五、⚠️ 关键注意事项

1. 🔥 致命误区:--permanent与立即生效

bash 复制代码
# 错误示范:只加--permanent,忘记reload
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 此时端口并未开放!必须执行:
firewall-cmd --reload

最佳实践 :先临时测试,确认无误后再加--permanent

bash 复制代码
firewall-cmd --zone=public --add-port=3306/tcp          # 测试
# 验证正常后
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

2. 🔥 高危操作:生产环境防火墙关闭

bash 复制代码
# 极度危险!等同于服务器裸奔
systemctl stop firewalld
systemctl disable firewalld

替代方案:如果必须调试,临时添加信任IP

bash 复制代码
firewall-cmd --zone=trusted --add-source=你的IP/32 --permanent
firewall-cmd --reload

3. 🎯 区域选择策略

bash 复制代码
# 错误:所有服务都开在public区域
# 正确:根据网络环境选择区域

# 内网服务器:
firewall-cmd --set-default-zone=internal

# DMZ服务器:
firewall-cmd --set-default-zone=dmz

4. 🔍 验证端口真实开放

firewalld放行 ≠ 服务已监听!必须双重检查:

bash 复制代码
# 1. 检查防火墙
firewall-cmd --zone=public --query-port=8080/tcp

# 2. 检查服务监听
ss -tuln | grep 8080
# 或
netstat -tuln | grep 8080

# 3. 外部测试(在另一台机器)
telnet 服务器IP 8080
# 或
nc -vz 服务器IP 8080

5. 💾 配置文件位置

bash 复制代码
# 系统服务定义(不要修改)
/usr/lib/firewalld/services/

# 自定义服务/配置(推荐)
/etc/firewalld/services/

# 当前配置
/etc/firewalld/zones/public.xml

6. 🔧 防火墙与Docker冲突

bash 复制代码
# Docker会绕过firewalld直接操作iptables
# 解决方案:使用Docker的firewallD驱动
# 在/etc/docker/daemon.json中添加:
{
  "iptables": true,
  "ip6tables": true
}

7. 📈 性能影响

  • 规则越多,性能损耗越大
  • 建议使用--reload而非--complete-reload
  • 富规则(rich rules)比普通规则性能稍低

8. 🚫 拒绝规则优先

firewalld规则匹配顺序:

  1. 源地址匹配
  2. 富规则(按顺序)
  3. 服务/端口规则
  4. 默认区域策略

陷阱:富规则的拒绝可能覆盖后面的允许规则!


六、🎓 高级技巧

1. 运行时配置快照

bash 复制代码
# 保存当前配置
firewall-cmd --runtime-to-permanent

# 锁定配置(防止修改)
firewall-cmd --lockdown-on

2. 查看iptables底层规则

bash 复制代码
# 查看firewalld生成的iptables规则
iptables -L -n -v | grep 8080

3. 应急处理:恢复默认

bash 复制代码
# 清空所有自定义规则
firewall-cmd --set-default-zone=public
firewall-cmd --runtime-to-permanent
firewall-cmd --reload

七、📋 快速备忘清单

操作 命令 是否持久化
查看状态 firewall-cmd --state -
开放端口 firewall-cmd --add-port=8080/tcp 临时
永久开放端口 firewall-cmd --add-port=8080/tcp --permanent
移除端口 firewall-cmd --remove-port=8080/tcp --permanent
开放服务 firewall-cmd --add-service=http --permanent
重载配置 firewall-cmd --reload -
查看区域 firewall-cmd --get-active-zones -

总结:firewalld是强大的动态防火墙工具,但权限管理要遵循**"最小开放、明确目的、测试验证"**三大原则!生产环境慎用777,防火墙慎用全开!



📖原文: 忘不了就忘不了吧,过往的羁绊弥足珍贵,但时间也会让我们结下新的缘分。-- 辰南《神墓年番》

⌛怡然 : ...



🪁 LuminKu looks forward to seeing you again 🌌


相关推荐
猫豆~21 小时前
软件包管理——2day
linux·运维
大白菜13241 天前
进程的信号
linux
XH-hui1 天前
【打靶日记】群内靶机Secure
linux·网络安全
Shingmc31 天前
【Linux】进程控制
linux·服务器·算法
视觉装置在笑7131 天前
Shell 变量基础与进阶知识
linux·运维
Web极客码1 天前
如何通过命令行工具检查 Linux 版本信息
linux·运维·服务器
Lynnxiaowen1 天前
今天我们继续学习Kubernetes内容pod资源对象
运维·学习·容器·kubernetes·云计算
欢鸽儿1 天前
Vitis】Linux 下彻底清除启动界面 Recent Workspaces 历史路径
linux·嵌入式硬件·fpga
繁华似锦respect1 天前
C++ 智能指针底层实现深度解析
linux·开发语言·c++·设计模式·代理模式
远程软件小帮手1 天前
云电脑挂机功能上线!边上班摸鱼边游戏多开教程
运维·服务器