华为云 ECS 安全组配置的 5 个常见误区,你踩过几个?

举报
yd_243668775 发表于 2026/10/23 10:00:32 2026/10/23
【摘要】 华为云 ECS 安全组配置的 5 个常见误区,你踩过几个?安全组是华为云 ECS 的第一道"虚拟防火墙",配置得当能挡住绝大多数网络攻击。但实际工作中,很多人对安全组的理解停留在"放通端口就能访问"的层面,导致生产环境裸奔在公网下而不自知。本文盘点 5 个最常见的配置误区,每个都附上错误配置、正确配置和排查方法,看看你踩过几个。 先搞清楚:安全组到底是什么?安全组是华为云 VPC 提供的实...

华为云 ECS 安全组配置的 5 个常见误区,你踩过几个?

安全组是华为云 ECS 的第一道"虚拟防火墙",配置得当能挡住绝大多数网络攻击。但实际工作中,很多人对安全组的理解停留在"放通端口就能访问"的层面,导致生产环境裸奔在公网下而不自知。本文盘点 5 个最常见的配置误区,每个都附上错误配置、正确配置和排查方法,看看你踩过几个。

先搞清楚:安全组到底是什么?

安全组是华为云 VPC 提供的实例级别的虚拟防火墙,作用在 ECS 网卡上。它通过白名单机制工作——默认拒绝所有流量,只有明确放通的规则才允许通过。

一个安全组包含:

  • 入方向规则(ingress):控制外部访问 ECS 的流量
  • 出方向规则(egress):控制 ECS 主动外出的流量

一个 ECS 可以关联多个安全组,多个安全组的规则取并集(全部允许的叠加,只要有一个安全组允许,就放行)。

理解了这些基础,下面来看 5 个误区。


误区一:图省事放通 0.0.0.0/0 所有端口

❌ 错误配置

方向 协议 端口 源地址
入方向 TCP 1-65535 0.0.0.0/0
入方向 UDP 1-65535 0.0.0.0/0

这是最常见也最危险的配置。为了"省得以后再开端口",直接把所有 TCP/UDP 端口对全网开放。等于把 ECS 变成了一台没有防火墙的公网服务器,任何人都能尝试连接你的 SSH、数据库、Redis、管理后台……

✅ 正确配置

按需放通,只开实际需要的端口,且限制源地址:

方向 协议 端口 源地址 说明
入方向 TCP 22 你的办公 IP/32 SSH 只允许你的 IP
入方向 TCP 80 0.0.0.0/0 HTTP 对外开放
入方向 TCP 443 0.0.0.0/0 HTTPS 对外开放
入方向 TCP 3306 192.168.1.0/24 MySQL 只允许内网访问

🔍 排查方法

在 ECS 控制台查看安全组规则,如果看到源地址列出现 0.0.0.0/0 且端口范围很大,就要警惕。也可以用 hcloud CLI 快速检查:

# 列出指定安全组的所有规则
hcloud VPC ShowSecurityGroupRules --security-group-id <安全组ID> --cli-output json

重点看 direction=ingress 且 remote_ip_prefix=0.0.0.0/0 的规则,端口范围是否过大。

💡 实用建议

  • SSH(22 端口)永远不要对 0.0.0.0/0 开放,用跳板机或 VPN 代替
  • 数据库端口(3306、5432、6379 等)只开内网网段,不开公网
  • 如果办公 IP 是动态的,考虑用 NAT 网关 + VPN 组合,而不是开放公网

误区二:只配入方向,忘了出方向

❌ 错误配置

很多人只关注"外面怎么访问进来",完全不管"ECS 主动出去访问什么"。默认安全组的出方向规则通常是放通所有的:

方向 协议 端口 目的地址
出方向 全部 全部 0.0.0.0/0

这意味着你的 ECS 可以主动连接任何外部 IP 的任何端口。如果 ECS 被植入恶意程序,它可以自由地向外发送数据、连接 C2 服务器、下载恶意载荷。

✅ 正确配置

生产环境应该限制出方向,只允许必要的对外访问:

方向 协议 端口 目的地址 说明
出方向 TCP 443 0.0.0.0/0 允许 HTTPS 外联(API 调用等)
出方向 TCP 80 0.0.0.0/0 允许 HTTP 外联(软件源等)
出方向 TCP 3306 192.168.1.0/24 访问内网 MySQL
出方向 TCP 53 192.168.0.0/16 内网 DNS 解析
出方向 UDP 53 192.168.0.0/16 内网 DNS 解析

🔍 排查方法

# 查看出方向规则
hcloud VPC ShowSecurityGroupRules --security-group-id <安全组ID> --cli-output json | jq '.security_group_rules[] | select(.direction=="egress")'

如果出方向有 port_range_min=1, port_range_max=65535, remote_ip_prefix=0.0.0.0/0,说明出方向完全不限。

💡 实用建议

  • 出方向至少限制端口范围,不要让 ECS 随意连接外部高位端口
  • 如果 ECS 只需要访问华为云内部服务(OBS、RDS 等),出方向可以限制为内网网段
  • 日志/监控数据上报端口单独放通,其他端口收紧

误区三:以为安全组规则有优先级,越靠前越优先

❌ 错误认知

很多人从传统防火墙(iptables、安全设备)迁移过来,以为安全组规则像防火墙一样按顺序匹配,命中即停止。于是花很多时间调整规则顺序,或者担心"放通规则在拒绝规则前面会导致拒绝规则失效"。

✅ 实际机制

华为云安全组规则没有优先级概念,所有规则是平等的叠加关系:

  • 只要任意一条规则允许该流量,就放行
  • 不存在 deny 规则(安全组是纯白名单机制,默认拒绝,显式允许)
  • 规则的先后顺序不影响最终结果

举个例子,以下两条规则效果完全一样,不管谁在前:

规则 协议 端口 源地址
规则 A TCP 80 0.0.0.0/0
规则 B TCP 80 10.0.0.0/8

最终效果:任何 IP 都能访问 80 端口(规则 A 已经放通了全网,规则 B 是子集,叠加后还是全网)。

🔍 排查方法

如果你发现自己花了很多时间调整规则顺序,停下来——那不是问题所在。检查是否有范围重叠的规则,合并它们就好。

💡 实用建议

  • 不要纠结规则顺序,关注规则是否有多余或冲突
  • 如果想实现"允许 A 网段但拒绝 A 中的 B IP"这种需求,安全组做不到(它没有 deny 规则),需要用网络 ACL(VPC 级别的防火墙,支持 deny)或在 ECS 内部用 iptables 补充

误区四:多安全组叠加时以为"取交集"

❌ 错误认知

一个 ECS 关联了多个安全组,有人以为流量需要同时满足所有安全组的规则才能通过(取交集)。于是创建了两个安全组,一个放通 80,一个放通 443,以为这样就能"只允许 80 和 443"。

✅ 实际机制

多安全组是取并集——只要任意一个安全组允许该流量,就放行。

举个例子:

  • 安全组 A:放通 TCP 80
  • 安全组 B:放通 TCP 22(0.0.0.0/0)

ECS 同时关联 A 和 B,最终效果:80 和 22 都对公网开放。如果你以为"两个安全组取交集,只有 80 能通",那就危险了——SSH 22 端口实际上对全网开放了。

🔍 排查方法

# 查看 ECS 关联了哪些安全组
hcloud ECS ShowServer --server-id <ECS实例ID> --cli-output json | jq '.server.security_groups'

然后逐个检查每个安全组的规则,把所有入方向允许的规则叠加在一起,看最终效果是否如你预期。

💡 实用建议

  • 尽量用一个安全组管理一台 ECS 的所有规则,减少叠加带来的混乱
  • 如果必须用多个安全组(比如公共安全组 + 专用安全组),确保公共安全组的规则是你能接受的最大放通范围
  • 定期审计:列出 ECS 关联的所有安全组,叠加规则,看是否有意外放通的端口

误区五:测试环境的配置直接复制到生产环境

❌ 错误做法

开发测试时为了方便,安全组放得很宽(0.0.0.0/0 开 22、3306、6379……),上线时直接把这个安全组配置复制到生产环境。测试环境无所谓,生产环境也这么裸奔,直到被扫描才后知后觉。

✅ 正确做法

生产环境的安全组应该从头设计,遵循最小权限原则:

第一步:列出 ECS 需要对外提供的所有服务

服务 端口 谁需要访问 源地址
Web 服务 80/443 所有用户 0.0.0.0/0
SSH 管理 22 运维人员 跳板机 IP/32 或 VPN 网段
健康检查 8080 ELB ELB 内网 IP 段

第二步:逐条配置,每条规则都要问"谁需要访问?从哪里来?"

第三步:用 Terraform 管理,避免手动改动导致漂移

# 生产环境安全组 - 最小权限配置
resource "huaweicloud_networking_secgroup" "prod_web" {
  name        = "prod-web-sg"
  description = "生产环境 Web 服务器安全组"

  # 删除默认的出方向全放通规则
  delete_default_rules = true
}

# 入方向:只放通必要端口
resource "huaweicloud_networking_secgroup_rule" "allow_http" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 80
  port_range_max    = 80
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = huaweicloud_networking_secgroup.prod_web.id
}

resource "huaweicloud_networking_secgroup_rule" "allow_https" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 443
  port_range_max    = 443
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = huaweicloud_networking_secgroup.prod_web.id
}

# SSH 只允许跳板机访问
resource "huaweicloud_networking_secgroup_rule" "allow_ssh_from_bastion" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 22
  port_range_max    = 22
  remote_ip_prefix  = "192.168.0.10/32"  # 跳板机 IP
  security_group_id = huaweicloud_networking_secgroup.prod_web.id
}

# 出方向:只允许 HTTPS 和内网 MySQL
resource "huaweicloud_networking_secgroup_rule" "allow_egress_https" {
  direction         = "egress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 443
  port_range_max    = 443
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = huaweicloud_networking_secgroup.prod_web.id
}

resource "huaweicloud_networking_secgroup_rule" "allow_egress_mysql" {
  direction         = "egress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 3306
  port_range_max    = 3306
  remote_ip_prefix  = "192.168.1.0/24"  # 内网 MySQL 网段
  security_group_id = huaweicloud_networking_secgroup.prod_web.id
}

注意上面 delete_default_rules = true 这一行——它会删除安全组创建时默认的"出方向全放通"规则,然后我们再按需添加出方向规则。这是很多人忽略的一步。

🔍 排查方法

# 对比测试和生产安全组规则数量
hcloud VPC ShowSecurityGroupRules --security-group-id <测试安全组ID> --cli-output json | jq '.security_group_rules | length'
hcloud VPC ShowSecurityGroupRules --security-group-id <生产安全组ID> --cli-output json | jq '.security_group_rules | length'

# 如果两者规则数量和内容几乎一样,说明生产环境可能直接复制了测试配置

💡 实用建议

  • 生产环境安全组应该有独立的命名规范(如 prod-web-sg、prod-db-sg),和测试环境区分
  • 用 Terraform 或代码管理安全组,不要在控制台手动改——手动改的容易忘,也不好审计
  • 上线前做一次安全组审计:列出所有入方向规则,逐条确认源地址是否合理

总结:一张表记住所有要点

误区 核心问题 一句话记住
0.0.0./0 全开 公网裸奔 按需放通,SSH 永不对公网开
忽略出方向 ECS 可随意外联 出方向也要限制端口和目的地址
以为有优先级 白费功夫调顺序 安全组是白名单叠加,没有 deny
多安全组取交集 意外放通端口 多安全组取并集,不是交集
测试配置直接上生产 生产裸奔 生产安全组从头设计,最小权限

安全组配置看似简单,但它是云上安全的第一道防线。很多云上安全事件,追根溯源都是安全组配错了。花 10 分钟审计一下你的安全组规则,比出事后再补救划算得多。

每日一问:你的生产环境 ECS 安全组,入方向有几条规则是 0.0.0.0/0?如果超过 2 条(通常只有 HTTP/HTTPS),建议立刻检查。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。