Linux 下的防火墙管理是系统安全的重要组成部分。虽然底层机制(netfilteriptablesnftables)是相似的,但不同的发行版通常会提供不同的前端工具来简化配置。Red Hat 系列(如 RHEL、CentOS、Fedora、AlmaLinux、Rocky Linux)倾向于使用 **firewalld**,而 Debian 系列(如 Debian、Ubuntu、Linux Mint)则偏爱 **UFW (Uncomplicated Firewall)**。


1. Red Hat 系列:Firewalld 详解

firewalld 是一个动态的防火墙管理工具,它通过 区域 (zones) 的概念来管理网络连接和接口的信任级别。它作为 iptablesnftables 的前端,提供了一个更高级别的接口,使得防火墙配置更直观、更灵活。

核心概念

  • **区域 (Zones)**:这是 firewalld 最重要的概念。每个区域都代表一个信任级别,并可以分配给一个或多个网络接口或源 IP 地址。例如:
    • public:默认区域,适用于公共网络,信任度最低。
    • home:家庭网络,信任度较高。
    • work:工作网络,信任度较高。
    • internal:内部网络,信任度更高。
    • trusted:所有网络连接都被信任。
    • drop:所有传入的数据包都被丢弃,没有回复。
    • block:所有传入的数据包都被拒绝,并发送 ICMP 错误消息。
  • **服务 (Services)**:firewalld 预定义了许多常见服务的端口和协议,例如 ssh (22/tcp)、http (80/tcp)、https (443/tcp) 等。这使得开放端口变得非常简单。
  • **端口 (Ports)**:除了服务,你也可以直接指定端口号和协议。
  • **运行时配置 (Runtime Configuration)**:使用 firewall-cmd 命令添加或修改的规则会立即生效,但系统重启后会丢失。
  • **永久配置 (Permanent Configuration)**:使用 --permanent 标志添加的规则会在 /etc/firewalld/ 目录下保存,系统重启后依然有效。每次修改永久配置后,需要运行 sudo firewall-cmd --reload 来使其生效。
  • **富规则 (Rich Rules)**:提供更细粒度的控制,可以定义源/目标 IP、源/目标端口、协议、动作(接受/拒绝/丢弃)、日志记录等。

常用 firewall-cmd 命令

  • 查看服务状态:
    1
    sudo systemctl status firewalld
  • 启动/停止/禁用/启用 firewalld
    1
    2
    3
    4
    sudo systemctl start firewalld
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld # 禁用开机启动
    sudo systemctl enable firewalld # 启用开机启动
  • 查看默认区域:
    1
    firewall-cmd --get-default-zone
  • 查看所有区域及其配置:
    1
    2
    firewall-cmd --get-zones
    firewall-cmd --list-all-zones
  • 查看当前活动区域的配置:
    1
    firewall-cmd --list-all
  • 将接口添加到区域:
    1
    2
    sudo firewall-cmd --zone=home --change-interface=enp0s3 --permanent
    sudo firewall-cmd --reload
  • 开放服务 (SSH):
    1
    2
    3
    sudo firewall-cmd --zone=public --add-service=ssh # 仅运行时生效
    sudo firewall-cmd --zone=public --add-service=ssh --permanent # 永久生效
    sudo firewall-cmd --reload # 重新加载永久配置
  • 开放端口 (HTTP, TCP 协议):
    1
    2
    sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
    sudo firewall-cmd --reload
  • 开放端口范围:
    1
    2
    sudo firewall-cmd --zone=public --add-port=5000-6000/tcp --permanent
    sudo firewall-cmd --reload
  • 移除服务/端口:
    add 替换为 remove 即可。
    1
    2
    3
    sudo firewall-cmd --zone=public --remove-service=ssh --permanent
    sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent
    sudo firewall-cmd --reload
  • 使用富规则 (Rich Rules): 允许来自特定 IP 的 SSH 连接
    1
    2
    sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="22" protocol="tcp" accept' --permanent
    sudo firewall-cmd --reload
  • 直接拒绝来自特定 IP 的连接:
    1
    2
    sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject' --permanent
    sudo firewall-cmd --reload
  • 更改默认区域:
    1
    sudo firewall-cmd --set-default-zone=home

2. Debian 系列:UFW (Uncomplicated Firewall) 详解

UFW (Uncomplicated Firewall) 顾名思义,是一个简单易用的防火墙配置工具,作为 iptablesnftables 的用户友好型前端。它旨在简化复杂的防火墙规则设置,非常适合个人用户和中小型服务器。

核心概念

  • 默认策略 (Default Policies):UFW 允许你设置传入、传出和路由流量的默认行为。通常,默认配置是拒绝所有传入连接,允许所有传出连接
  • **规则 (Rules)**:UFW 的规则语法非常直观,可以直接指定端口、服务名称、IP 地址、协议和方向。
  • **应用配置文件 (Application Profiles)**:对于一些常见的应用程序(如 OpenSSH、Nginx),UFW 提供了预定义的应用配置文件,可以更方便地管理这些服务的端口。
  • 状态管理:UFW 启用后,规则会立即生效并在系统重启后持久化。

常用 ufw 命令

  • 安装 UFW:
    1
    2
    sudo apt update
    sudo apt install ufw
  • 查看 UFW 状态:
    1
    2
    3
    sudo ufw status # 简单状态
    sudo ufw status verbose # 详细状态,显示默认策略和所有规则
    sudo ufw status numbered # 显示带编号的规则,方便删除
  • 启用/禁用 UFW:
    警告: 如果通过 SSH 连接,请务必先允许 SSH 端口,否则启用 UFW 后你可能会被锁定!
    1
    2
    3
    sudo ufw enable # 启用防火墙
    sudo ufw disable # 禁用防火墙
    sudo ufw reload # 重新加载规则(通常在修改配置文件后)
  • 设置默认策略:
    1
    2
    3
    4
    sudo ufw default deny incoming # 默认拒绝所有传入连接 (推荐)
    sudo ufw default allow outgoing # 默认允许所有传出连接 (常见)
    # 或者如果你想更严格:
    # sudo ufw default deny outgoing # 默认拒绝所有传出连接
  • 允许 SSH (端口 22):
    1
    2
    sudo ufw allow ssh # 使用服务名
    sudo ufw allow 22/tcp # 使用端口号和协议
  • 允许 HTTP/HTTPS:
    1
    2
    3
    4
    5
    sudo ufw allow http
    sudo ufw allow https
    # 或者
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
  • 允许特定端口(例如自定义服务 8080):
    1
    2
    sudo ufw allow 8080/tcp
    sudo ufw allow 8080/udp
  • 允许端口范围:
    1
    sudo ufw allow 5000:6000/tcp
  • 允许/拒绝来自特定 IP 地址的连接:
    1
    2
    sudo ufw allow from 192.168.1.10 # 允许来自此IP的所有连接
    sudo ufw deny from 1.2.3.4 # 拒绝来自此IP的所有连接
  • 允许特定 IP 连接到特定端口:
    1
    sudo ufw allow from 192.168.1.10 to any port 22 proto tcp # 允许来自 192.168.1.10 的 SSH 连接
  • 限制连接 (Limit): 阻止在短时间内多次尝试连接的 IP 地址 (例如防暴力破解)。
    1
    sudo ufw limit ssh # 限制SSH连接,超过一定尝试次数的IP将被暂时阻止
  • 删除规则:
    • 按规则内容删除:
      1
      sudo ufw delete allow 80/tcp
    • 按规则编号删除 (先用 ufw status numbered 查看编号):
      1
      2
      sudo ufw status numbered
      sudo ufw delete 3 # 删除编号为3的规则
  • 重置 UFW (清除所有规则并禁用):
    1
    sudo ufw reset
    警告: 这会清除所有 UFW 规则并禁用 UFW。除非你知道自己在做什么,否则请谨慎使用,以免服务器失去保护。

两者底层都依赖 netfilter (通过 iptablesnftables 实现),因此在功能上最终都能达到相同的目标,只是操作方式和哲学不同。选择哪一个取决于你使用的 Linux 发行版以及你对防火墙管理的需求和熟悉程度。在实际应用中,通常建议使用发行版默认提供的防火墙管理工具。