管理 Linux 实例的系统防火墙

在云服务器上,不正确的防火墙配置是导致服务无法访问或实例远程连接失败的常见原因。本文旨在提供一套安全、标准化的操作流程,指导如何管理 Linux 实例的操作系统防火墙,例如检查状态、安全地启用防火墙、开放特定服务端口,以及在排查问题时临时禁用防火墙。

工作原理

所有进出ECS实例的网络流量均先经安全组过滤,再由操作系统防火墙处理。在同时满足安全组和系统防火墙的放行策略后,才能到达目标应用。

  • 安全组(云网络层)

    • 作用: 安全组ECS的使用中扮演了云上虚拟防火墙的角色,用于控制实例的出入方向流量。它在操作系统之外,是访问实例的第一道关卡。

    • 逻辑: 无论实例内部防火墙如何配置,如果安全组未放行某个端口(如 SSH 的 22 端口),所有来自外部的访问请求都会在该层被直接拒绝。

  • 操作系统防火墙(实例层)

    • 作用: 运行在 Linux 操作系统内部的防火墙软件,默认关闭,如 firewalldufw。它负责对通过了安全组的流量进行进一步的精细化控制。

    • 逻辑: 流量必须先通过安全组,才能到达操作系统防火墙。两者是“与”关系,必须同时允许,流量才能最终到达部署的应用程序。

操作指南

查看防火墙状态

在进行任何修改前,首先确认防火墙的当前运行状态。

Alibaba Cloud Linux / CentOS / Red Hat

执行以下命令查看 firewalld 服务的状态。

sudo firewall-cmd --state
  • not running:表示防火墙已关闭。

  • running:表示防火墙处于启用状态。

  • 若提示 command not found,说明 firewalld 未安装。可执行 sudo yum install firewalld -ysudo dnf install firewalld -y 进行安装。

Ubuntu / Debian

执行以下命令查看 ufw 服务的状态。

sudo ufw status
  • Status: active:表示防火墙处于启用状态。

  • Status: inactive:表示防火墙已关闭。

  • 在 Debian 系统上,若提示 command not found,说明 ufw 未安装。推荐执行 sudo apt update && sudo apt install ufw -y 进行安装,以获得更安全、便捷的管理体验。

启用防火墙

重要

切勿在未配置允许规则前直接启用防火墙,会导致连接被切断,造成实例“失联”。请遵循“先放行,后启用”的原则。

Alibaba Cloud Linux / CentOS / Red Hat

  1. 将 SSH 服务永久性地添加到允许列表中,确保远程管理通道不会中断。

    sudo firewall-cmd --permanent --add-service=ssh
  2. 重新加载防火墙规则,使上一步的配置生效。

    sudo firewall-cmd --reload
  3. 启动防火墙服务。

    sudo systemctl start firewalld
  4. (可选): 将防火墙设置为开机自启动,确保重启后防护依然有效。

    sudo systemctl enable firewalld

Ubuntu / Debian

  1. 添加规则以允许所有 SSH 连接。

    sudo ufw allow ssh
  2. 启用防火墙。ufw 在启用时会自动加载已有的 allow 规则,并默认设置为开机自启动。

    sudo ufw enable

    执行此命令时,系统会提示操作可能中断现有连接,输入 y 确认即可。由于已提前放行 SSH,连接不会中断。

开放指定端口或服务

Alibaba Cloud Linux / CentOS / Red Hat

  1. 开放指定端口或者服务:

    • 按服务名开放(推荐):

      # 永久开放 HTTP 和 HTTPS 服务
      sudo firewall-cmd --permanent --add-service=http
      sudo firewall-cmd --permanent --add-service=https
    • 按端口号开放:

      # 永久开放 8080/TCP 端口
      sudo firewall-cmd --permanent --add-port=8080/tcp
  2. 使新规则生效: 添加或删除规则后,必须重新加载防火墙。

    sudo firewall-cmd --reload
  3. 验证规则是否生效:

    该命令可查看当前活动区域下的所有规则,包括服务、端口、协议等。

    sudo firewall-cmd --list-all

Ubuntu / Debian

使用ufw添加防火墙规则后即时生效,并自动持久化。

  1. 开放指定端口或者服务:

    • 按服务名开放(推荐):

      # 开放 HTTP 和 HTTPS 服务
      sudo ufw allow http
      sudo ufw allow https
    • 按端口号开放:

      # 开放 3306/TCP 端口
      sudo ufw allow 3306/tcp
  2. 验证规则是否已生效:

    执行以下命令查看已启用的规则,包括允许和拒绝的服务、端口及其状态(active/inactive)。

    sudo ufw status

关闭防火墙

在诊断网络连接问题时,可以临时关闭防火墙以判断是否为其实例内部的阻断策略所致。

重要

不建议在生产环境关闭防火墙,在测试完成或问题定位后应重新启用防火墙。

CentOS / Red Hat / Alibaba Cloud Linux

sudo systemctl stop firewalld

Ubuntu / Debian

sudo ufw disable

应用于生产环境

  • 最佳实践

    • 最小权限原则: 仅开放业务所必需的端口。对于数据库等核心服务,应仅对授信的内网 IP 开放,避免暴露于公网。

    • 备用通道: 在进行重大的防火墙规则变更前,建议先远程连接到实例,已建立连接的会话即使在防火墙规则变更之后依旧保持,可以通过此备用通道修复问题。

  • 风险防范

    • 日志与监控: 定期审计防火墙日志,以发现异常访问。

      • firewalld: 日志通常由 journald 管理,使用 sudo journalctl -u firewalld 查看。

      • ufw: 日志通常位于 /var/log/ufw.log

常见问题

  • 关闭了实例内的防火墙,为什么服务还是无法访问?

    原因通常在于忽略了云环境下的第一层防护。请按以下顺序排查:

    1. 检查安全组: 这是首要排查点。登录ECS控制台-安全组,检查实例所属的安全组,确认入方向规则已放行公网 IP 地址和端口。

    2. 检查服务监听状态: 在实例内部执行 ss -tunlp | grep <端口号>netstat -tunlp | grep <端口号>,确认应用程序是否已成功启动并在预期的 IP 地址(如 0.0.0.0)和端口上监听。

    3. 检查网络 ACL: 如果实例已关联网络ACL,请检查其规则是否允许相关流量通过。

  • 执行 firewall-cmdufw 命令时提示 command not found 怎么办?

    这表示对应的防火墙管理工具未安装。

    • 在 CentOS/Red Hat/Alibaba Cloud Linux 上,执行 sudo yum install firewalld -ysudo dnf install firewalld -y

    • 在 Ubuntu/Debian 上,执行 sudo apt update && sudo apt install ufw -y