【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 🌌


相关推荐
IT瑞先生2 小时前
Docker容器使用手册——入门篇(上)
运维·docker·容器
Code Warrior3 小时前
【Linux】Socket编程UDP
linux·udp
CS_浮鱼3 小时前
【Linux】进程概念
linux·运维·服务器
ITVV4 小时前
hadoop-3.4.1 单机伪部署
大数据·linux·hadoop
Elias不吃糖4 小时前
epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现
linux·c++·event
人工智能训练5 小时前
Ubuntu中如何进入root用户
linux·运维·服务器·人工智能·ubuntu·ai编程·root
tianshiyeben5 小时前
WGCLOUD监控系统使用指南 - 告警消息整理完整版
linux·运维·服务器·系统安全·zabbix
Unlyrical5 小时前
splice, io_uring_prep_splice 调用(无效参数)
linux·服务器·c++·unix
喜欢你,还有大家5 小时前
Docker-存储
运维·docker·容器