Linux防火墙firewalld——基础命令与实战

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 环境配置,可以实现灵活精细的安全策略控制。理解其工作原理与实际影响是高效使用防火墙的重要前提。

相关推荐
运维成长记29 分钟前
ansible-playbook 进阶 接上一章内容
linux·服务器·ansible
愚润求学1 小时前
【Linux】mmap文件内存映射
linux·运维·服务器·开发语言·c++
就是我2 小时前
轻松管理Linux定时任务:Cron实用教程
linux·后端
hope_wisdom2 小时前
Linux系统编程之共享内存
linux·共享内存·linux系统·linux编程
阿巴~阿巴~3 小时前
Git 全平台安装指南:从 Linux 到 Windows 的详细教程
linux·windows·git
摸鱼仙人~4 小时前
Maven 安装与配置指南(适用于 Windows、Linux 和 macOS)
linux·windows·maven
linux行者4 小时前
Linux 资源限制(进程级,用户级,系统级)
linux·运维·服务器
爷一隐居青楼4 小时前
PGSQL结合linux cron定期执行vacuum_full_analyze命令
java·linux·服务器
唐骁虎4 小时前
Ubuntu 桌面版忘记账户密码的重置方法
linux·运维·服务器·ubuntu
wusam5 小时前
Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源
linux·运维·阿里云·shell