Linux防火墙管理:firewalld配置与安全实践
firewalld 基础使用指南
firewalld 是现代 Linux 发行版中广泛采用的动态防火墙管理工具,支持 Ubuntu、CentOS 等系统。它通过区域(zone)和服务(service)的概念实现灵活的网络策略控制,相比直接操作 iptables 更加直观和易于维护。
安装 firewalld
尽管部分系统默认预装,若未包含则可通过包管理器安装:
# Ubuntu 系统
sudo apt update && sudo apt install firewalld -y
# CentOS/RHEL 系列
sudo yum install firewalld -y
启动并启用服务
安装后需手动启动,并设置为开机自启以确保持久运行:
sudo systemctl start firewalld
sudo systemctl enable firewalld
查看运行状态
确认服务是否正常运行:
sudo systemctl status firewalld
输出将显示当前活动状态及基本元信息。
查看区域与规则
firewalld 使用"区域"来划分不同网络环境的信任等级。常用操作包括:
- 列出当前激活的区域:
sudo firewall-cmd --get-active-zones
- 查看指定区域的完整配置(如 public):
sudo firewall-cmd --zone=public --list-all
基于服务开放端口
firewalld 内置常见服务定义(如 http、https),可直接调用:
- 永久允许 HTTP 服务:
sudo firewall-cmd --zone=public --add-service=http --permanent
- 移除已添加的服务:
sudo firewall-cmd --zone=public --remove-service=http --permanent
手动管理端口
对于自定义应用或非标准服务,可通过端口号显式控制:
- 开放 TCP 8080 端口:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
- 关闭该端口:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
临时与永久规则的区别
不带 --permanent 的命令仅在当前运行时生效;重启后失效。所有持久化更改必须使用该参数,并通过 reload 激活:
sudo firewall-cmd --reload
获取帮助文档
查看完整命令手册:
firewall-cmd --help
ufw 与 firewall-config 是否可以共存?
两者均基于底层 iptables 实现,但管理机制互斥,**不应同时启用**。
UFW 简介
Uncomplicated Firewall (ufw) 是 Ubuntu 默认推荐的简化防火墙工具,语法简洁,适合初学者。其规则直接影响 iptables 链。
firewall-config 说明
这是 firewalld 的图形化前端工具(GUI),依赖于后台的 firewalld 守护进程。它通过 D-Bus 接口与服务通信,提供可视化配置界面。
冲突风险
当 ufw 和 firewalld 同时运行时,各自生成的规则可能相互覆盖,导致策略混乱甚至安全漏洞。例如,一个工具放行的端口可能被另一个自动屏蔽。
解决方案:选择其一并禁用另一个
- 若使用 ufw,则停用 firewalld:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
- 若使用 firewalld,则关闭 ufw:
sudo ufw disable
添加 HTTP 服务是否会暴露主机?
执行以下命令:
sudo firewall-cmd --zone=public --add-service=http --permanent
确实会允许外部主机访问本机的 80 端口。但这并不意味着立即面临攻击,关键在于是否有实际监听此端口的服务。
行为解析
- 无 Web 服务运行:即便防火墙放行,由于没有进程监听 80 端口,连接请求将超时或被拒绝,实际影响较小。
- 运行了 Apache/Nginx:此时外部用户可正常访问网页内容,但也引入潜在攻击面(如注入、路径遍历等)。
安全建议
- 仅在必要时开启服务暴露。
- 优先使用 HTTPS 替代 HTTP,保障传输加密。
- 结合源 IP 限制(rich rules)缩小访问范围:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
客户端场景下是否应默认开放某些端口?
对于普通 Ubuntu 客户机(非服务器角色),建议遵循最小暴露原则。然而,某些系统功能依赖特定出站通信,需保留必要入口响应通道。
推荐保留的默认允许项
其中 dhcpv6-client 是典型例子:
- 作用:允许接收 IPv6 动态地址分配响应,确保设备能正确获取网络配置。
- 安全性:该规则仅接受来自 DHCPv6 服务器的入站数据包,方向受限且协议专用,风险极低。
此类预设服务已在 firewalld 的默认配置中启用,无需额外操作。