在云服务器上,不正确的防火墙配置是导致服务无法访问或实例远程连接失败的常见原因。本文旨在提供一套安全、标准化的操作流程,指导如何管理 Linux 实例的操作系统防火墙,例如检查状态、安全地启用防火墙、开放特定服务端口,以及在排查问题时临时禁用防火墙。
工作原理
所有进出ECS实例的网络流量均先经安全组过滤,再由操作系统防火墙处理。在同时满足安全组和系统防火墙的放行策略后,才能到达目标应用。
安全组(云网络层)
作用: 安全组在ECS的使用中扮演了云上虚拟防火墙的角色,用于控制实例的出入方向流量。它在操作系统之外,是访问实例的第一道关卡。
逻辑: 无论实例内部防火墙如何配置,如果安全组未放行某个端口(如 SSH 的 22 端口),所有来自外部的访问请求都会在该层被直接拒绝。
操作系统防火墙(实例层)
作用: 运行在 Linux 操作系统内部的防火墙软件,默认关闭,如
firewalld
或ufw
。它负责对通过了安全组的流量进行进一步的精细化控制。逻辑: 流量必须先通过安全组,才能到达操作系统防火墙。两者是“与”关系,必须同时允许,流量才能最终到达部署的应用程序。
操作指南
查看防火墙状态
在进行任何修改前,首先确认防火墙的当前运行状态。
Alibaba Cloud Linux / CentOS / Red Hat
执行以下命令查看 firewalld
服务的状态。
sudo firewall-cmd --state
not running
:表示防火墙已关闭。running
:表示防火墙处于启用状态。若提示
command not found
,说明firewalld
未安装。可执行sudo yum install firewalld -y
或sudo 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
将 SSH 服务永久性地添加到允许列表中,确保远程管理通道不会中断。
sudo firewall-cmd --permanent --add-service=ssh
重新加载防火墙规则,使上一步的配置生效。
sudo firewall-cmd --reload
启动防火墙服务。
sudo systemctl start firewalld
(可选): 将防火墙设置为开机自启动,确保重启后防护依然有效。
sudo systemctl enable firewalld
Ubuntu / Debian
添加规则以允许所有 SSH 连接。
sudo ufw allow ssh
启用防火墙。
ufw
在启用时会自动加载已有的allow
规则,并默认设置为开机自启动。sudo ufw enable
执行此命令时,系统会提示操作可能中断现有连接,输入
y
确认即可。由于已提前放行 SSH,连接不会中断。
开放指定端口或服务
Alibaba Cloud Linux / CentOS / Red Hat
开放指定端口或者服务:
按服务名开放(推荐):
# 永久开放 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
使新规则生效: 添加或删除规则后,必须重新加载防火墙。
sudo firewall-cmd --reload
验证规则是否生效:
该命令可查看当前活动区域下的所有规则,包括服务、端口、协议等。
sudo firewall-cmd --list-all
Ubuntu / Debian
使用ufw
添加防火墙规则后即时生效,并自动持久化。
开放指定端口或者服务:
按服务名开放(推荐):
# 开放 HTTP 和 HTTPS 服务 sudo ufw allow http sudo ufw allow https
按端口号开放:
# 开放 3306/TCP 端口 sudo ufw allow 3306/tcp
验证规则是否已生效:
执行以下命令查看已启用的规则,包括允许和拒绝的服务、端口及其状态(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
。
常见问题
关闭了实例内的防火墙,为什么服务还是无法访问?
原因通常在于忽略了云环境下的第一层防护。请按以下顺序排查:
检查安全组: 这是首要排查点。登录ECS控制台-安全组,检查实例所属的安全组,确认入方向规则已放行公网 IP 地址和端口。
检查服务监听状态: 在实例内部执行
ss -tunlp | grep <端口号>
或netstat -tunlp | grep <端口号>
,确认应用程序是否已成功启动并在预期的 IP 地址(如0.0.0.0
)和端口上监听。检查网络 ACL: 如果实例已关联网络ACL,请检查其规则是否允许相关流量通过。
执行
firewall-cmd
或ufw
命令时提示command not found
怎么办?这表示对应的防火墙管理工具未安装。
在 CentOS/Red Hat/Alibaba Cloud Linux 上,执行
sudo yum install firewalld -y
或sudo dnf install firewalld -y
。在 Ubuntu/Debian 上,执行
sudo apt update && sudo apt install ufw -y
。