华为云 ECS 上用 firewalld 配防火墙:开放常用端口、按来源限制 SSH,以及和安全组怎么配合
华为云 ECS 上用 firewalld 配防火墙:开放常用端口、按来源限制 SSH,以及和安全组怎么配合
在华为云 ECS 上部署业务时,很多人只改安全组、不管本机防火墙;也有人两边都开,结果端口明明监听了却访问不通。firewalld 是 CentOS、Huawei Cloud EulerOS(HCE)、部分 Rocky 镜像上的默认防火墙,和安全组是两道独立的过滤层。本文讲清楚两者的分工,给出开放 HTTP、HTTPS、自定义端口和按来源 IP 收紧 SSH 的完整命令,并整理「改完不生效」「zone 搞错」「把自己锁在外面」三类常见排错。下文用 your_domain 表示业务域名,源地址示例用 203.0.113.10,本机回环用 127.0.0.1。
一、先分清:安全组与 firewalld
安全组作用在云侧虚拟网卡入口,firewalld 作用在操作系统内核的包过滤。入站流量必须两道都放行,业务才通;任一层拒绝,对端都会表现为超时或连接失败。
建议分工:
- 安全组管「粗粒度」:只开业务必需端口(如 22、80、443、业务端口),源地址尽量收窄到办公网段或堡垒机,不要长期对
0.0.0.0/0开放 SSH。 - firewalld 管「细粒度」:按服务、按源 IP、按 zone 再收一层,尤其适合临时开放、按来源限 SSH、以及同一台机器多网卡/多业务隔离。
- 两层规则保持一致:安全组开了 443,本机也要放行;只开其中一层会导致「安全组看着通了,本机还是拒绝」。
查看本机是否在跑 firewalld:
sudo systemctl status firewalld
sudo firewall-cmd --state
若状态不是 running,先启用:
sudo systemctl enable --now firewalld
Ubuntu 默认是 ufw,不是 firewalld。若镜像是 Ubuntu,本文命令不适用,请改用 ufw 或自行安装 firewalld 后再对照操作。
二、确认默认 zone 再动手
firewalld 用 zone 组织规则,公网网卡通常落在 public。先看当前默认 zone 和网卡归属:
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
后面所有 --permanent 规则建议显式带上 --zone=public(或你实际使用的 zone),避免写到别的 zone 导致「命令成功了,流量仍被拒」。
三、开放常用端口与服务
firewalld 既支持按服务名,也支持按端口。常用 HTTP/HTTPS 推荐用服务名:
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --zone=public --permanent --add-service=https
sudo firewall-cmd --reload
自定义业务端口(以 TCP 8080 为例):
sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-ports
记得同步改安全组入方向:协议 TCP、端口 8080、源地址按需要填写。两层都放行后,再在 ECS 上确认进程在监听:
ss -lntup | grep 8080
curl -I 127.0.0.1:8080
本机 127.0.0.1 通、公网不通,优先查安全组;公网通、本机 firewall-cmd --list-all 里没有对应端口,则是 firewalld 漏放。
四、按来源 IP 限制 SSH
SSH 对全网开放风险很高。更稳妥的做法是:安全组先把 22 的源收窄;firewalld 再加一条「仅允许指定源」的富规则,并把原来对所有人开放的 ssh 服务去掉。
假设办公出口是 203.0.113.10:
# 允许指定源访问 SSH
sudo firewall-cmd --zone=public --permanent \
--add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="ssh" accept'
# 去掉对所有人开放的 ssh 服务(若之前加过)
sudo firewall-cmd --zone=public --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-rich-rules
多个办公出口就多写几条 rich rule。改之前务必保留一条当前会话能连上的路径,并确认安全组里 22 端口的源地址也包含你正在使用的公网 IP,否则 reload 后可能立刻断连。
若暂时只想「先收安全组、本机仍保留 ssh 服务」,也可以只改控制台安全组,本机不动。两边都收才是完整加固。
五、和业务发布流程怎么配合
上线一个对外 Web 服务时,推荐顺序是:
- 应用在本机
127.0.0.1或0.0.0.0监听并自测通过。 - firewalld 放行对应服务或端口并
reload。 - 安全组增加同端口入方向规则。
- 从办公网或测试机访问
your_domain对应端口做验收。
下线或缩端口时反过来:先改安全组收紧,再改 firewalld,最后停服务。这样不会出现「服务已停但端口仍对公网暴露」或「防火墙先关导致自己排查时连不上」的别扭状态。
六、常见排错
1. 改完不生效
最常见原因是只加了运行时规则、没加 --permanent,或加了 permanent 却忘了 --reload。永久规则写入磁盘后必须 reload 才进入生效集:
sudo firewall-cmd --zone=public --list-all
sudo firewall-cmd --permanent --zone=public --list-all
两边不一致时,以 permanent 为准补规则再 reload。另一个原因是规则写进了错误 zone:get-active-zones 看网卡实际 zone,把规则迁过去。
2. zone 搞错或网卡跑到了别的 zone
多网卡、改过 NetworkManager、或手工 --change-interface 后,网卡可能不在 public。用下面命令确认并纠正:
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reload
接口名以 ip link 实际输出为准,不一定是 eth0。
3. 被锁在外面:从控制台救回来
若 rich rule 写错源地址、或误删 ssh,SSH 会立刻断。此时不要慌,走华为云控制台救:
- 登录控制台,打开该 ECS,进入「远程登录」或 VNC/管理控制台登录(不依赖 22 端口)。
- 在控制台终端执行:
sudo firewall-cmd --zone=public --add-service=ssh
sudo firewall-cmd --zone=public --permanent --add-service=ssh
sudo firewall-cmd --reload
- 同时检查安全组入方向是否仍放行你当前公网 IP 的 22 端口。
- 恢复连通后,再重新设计「按源限制」规则,先加对 rich rule,确认能连,再
--remove-service=ssh。
临时急救也可以:sudo systemctl stop firewalld(会清空本机层过滤,仅作抢救,通了立刻重新 enable 并按白名单配置)。
七、小结
安全组与 firewalld 是串联的两道门,只开一道不够。配置时固定三个习惯:先确认 active zone,再写带 --zone 与 --permanent 的规则并 reload,最后用 list-all 与安全组规则交叉核对。SSH 务必按来源收紧,改规则前留好控制台登录退路。按本文做完,常用 Web 端口可稳定对外开放,管理面也能收敛到可信源,排错路径也更清晰。
- 点赞
- 收藏
- 关注作者
评论(0)