什么是安全组?
安全组,是一个逻辑上的分组,这个分组是由同一个地域(Region)内具有相同安全保护需求并相互信任的实例组成。从实例安全角度考虑,每个实例至少要属于一个安全组,而且在创建实例的时候就需要指定。同一安全组内的实例之间默认私网网络互通,不同安全组的实例之间默认私网不通。当然,我们可以授权两个安全组之间互访。
稍微有点安全常识的用户都应该知道「防火墙」的概念,我们可以把安全组看做是一种虚拟防火墙,它具备状态检测包过滤功能。安全组用于设置单台或多台云服务器的网络访问控制,它是重要的网络安全隔离手段,用于在云端划分安全域(安全组的网络类型分为经典网络和专有网络)。
在安全组内部,是通过「安全组规则」来限制(或允许)和外部通信的。安全组规则,有 入方向规则 和 出方向规则 之分。入方向规则,是指约束外部应用程序访问实例的一组规则;而出方向规则,是指由 ECS 实例发起的、和外部进行通信时的一组规则。
广告:选择阿里云,助您轻松上云。购买前领取阿里云优惠券,一步开通云服务。
一些限制
在使用实例安全组之前,我们看看有些什么限制。
- 每个用户在每个地域最少可创建 100 个安全组,并可以根据用户会员等级的提高而增加
- 一个实例中的每个弹性网卡都默认最多可以加入5个安全组
- 经典网络类型的实例可以加入同一地域(Region)下经典网络类型的安全组,且单个经典网络类型的安全组内的实例个数不能超过 1000
- 专有网络类型的实例可以加入同一专有网络(VPC)下的安全组,且单个 VPC 类型的安全组内的私网IP个数不能超过 2000
- 可以通过对实例或私网 IP 分组,并通过互相授权的方式进行通信
- 安全组是有状态的。如果数据包在 Outbound 方向(出方向)是被允许的,那么对应的此连接在 Inbound 方向(入方向)也是允许的
- 可以随时对安全组(及安全组规则)进行调整,不会对实例的运行产生影响
阿里云提供的默认安全组
在创建 ECS 实例时,如果还没有创建安全组,那么,可以使用阿里云提供的默认安全组。
默认安全组预设的协议和端口如下:
- ICMP 协议
- SSH:22 端口
- RDP:3389 端口
- HTTP:80 端口
- HTTPS:443 端口
因为安全组的网络类型有经典网络和专有网络 2 种类型,因此,默认安全组的规则也分为经典网络安全组的默认规则和专有网络安全组的默认规则。
下面是这 2 种类型的网络安全组的默认规则。
经典网络安全组的默认规则:
网卡类型 | 协议类型 | 端口范围 | 授权策略 | 授权类型 | 授权对象 |
---|---|---|---|---|---|
公网 | 自定义TCP(SSH) | 22/22 | 允许 | 地址段访问 | 0.0.0.0/0 |
公网 | 自定义TCP(RDP) | 3389/3389 | 允许 | 地址段访问 | 0.0.0.0/0 |
公网 | 全部ICMP | -1/-1 | 允许 | 地址段访问 | 0.0.0.0/0 |
公网 | 自定义TCP(HTTP) | 80/80 | 允许 | 地址段访问 | 0.0.0.0/0 |
公网 | 自定义TCP(HTTPS) | 433 | 允许 | 地址段访问 | 0.0.0.0/0 |
专有网络默安全组的默认规则:
网卡类型 | 协议类型 | 端口范围 | 授权策略 | 授权类型 | 授权对象 |
---|---|---|---|---|---|
无 | 自定义TCP(SSH) | 22/22 | 允许 | 地址段访问 | 0.0.0.0/0 |
无 | 自定义TCP(RDP) | 3389/3389 | 允许 | 地址段访问 | 0.0.0.0/0 |
无 | 全部ICMP | -1/-1 | 允许 | 地址段访问 | 0.0.0.0/0 |
无 | 自定义TCP(HTTP) | 80/80 | 允许 | 地址段访问 | 0.0.0.0/0 |
无 | 自定义TCP(HTTPS) | 433 | 允许 | 地址段访问 | 0.0.0.0/0 |
注:1、专有网络 VPC 类型安全组规则不区分内网和公网,因此,专有网络默安全组的默认规则 表格中网卡类型均为「无」;2、以上规则,均是针对入方向规则;3、授权对象均是
0.0.0.0/0
,具体含义请参考 添加安全组规则 一节内容。
另外,安全组规则是有 优先级 的。通常,手工创建的安全组,优先级范围是 1 - 100,而默认安全组规则,优先级是 110,这表明默认规则的优先级永远比我们手动添加的安全组规则低。也就是说,我们可以通过手工创建安全组规则来覆盖默认安全组规则的设置。
另外,您也可以在默认安全组中添加自己的安全组规则。
如何使用安全组?
在了解了阿里云 ECS 实例安全组的相关概念和限制之后,下面,我们讲一讲如何使用安全组,来帮助我们搭建更安全的 ECS 实例。
1、创建安全组
任何实例,至少需要加入一个安全组,如果您不打算使用默认安全组,那就需要创建一个安全组。下面是创建安全组的步骤。
- 登录 ECS 管理控制台,切换到实例所在地域,然后,在左侧导航菜单中,选择 网络和安全 -> 安全组 菜单,进入安全组列表
-
在安全组列表页,点击右上角的「创建安全组」按钮,将弹出创建安全组的对话框,如下图所示:
创建安全组对话框 - 在创建安全组对话框,我们需要指定以下信息:
- 模板:阿里云提供的安全组模板有 Web Server Linux、Web Server Windows 和自定义模板 3 种。其中,Web Server Linux 模板提供的规则应用于需要在 Linux 实例上部署 Web 服务的场景,默认放行 TCP 80、TCP 443、TCP 22 和 ICMP 协议入方向访问;Web Server Windows 模板提供的规则应用于需要在 Windows 实例上部署 Web 服务的场景,默认放行 TCP 80、TCP 443、TCP 3389 和 ICMP 协议入方向访问;自定义的模板没有预设安全组规则,需要根据业务需求自行创建。
- 安全组名称:用于唯一标识当前安全组的名称,长度要求在 2 - 128 个字符之间,不能以特殊字符及数字开头,只可包含特殊字符中的
.
、_
、-
和:
- 描述:对当前安全组的简单说明,长度在 2 - 256 个字符之间
- 网络类型:有经典网络和专有网络 2 种类型。如果实例是专有网络类型,则选择「专有网络」;否则选择「经典网络」。如果选择了专有网络,那么,需要指定使用哪一个专有网络。
按照要求填写完所有信息后,点击「确定」按钮,即可完成安全组的创建。
说明:对于自己创建的安全组,在没有添加任何安全组规则之前,私网和公网默认规则为:出方向允许所有访问,入方向拒绝所有访问。
2、添加安全组规则
上面提到,创建好安全组之后,如果没有添加任何规则,在出方向,允许所有访问,在入方向,拒绝所有访问。因此,为了更合理的使用安全组,我们需要为安全组添加规则,即安全组规则。
在添加安全组规则之前,您应该知道:
- ECS 实例需要禁止(或允许)哪些公网(或内网)的访问?
- 协议类型是什么?
- 开放的端口是什么?
下面是具体添加安全组规则的步骤:
- 进入安全组列表页面,在需要添加规则的那条安全组,点击「配置规则」链接
-
进入安全组规则列表,在该列表列出了当前已有的安全组规则(如果在创建规则时选择的是 自定义 模板,则列表为空),在列表右上角,点击「添加安全组规则」按钮,将弹出「添加安全组规则」对话框,如下图所示:
添加安全组规则对话框 - 在「添加安全组规则」对话框,我们需要完成以下设置:
- 规则方向:是入方向还是出方向规则?这两者的含义请参考上面 什么是安全组? 一节。
- 授权策略:是指本次要配置的规则,是允许还是拒绝和外部通信。
- 协议类型:可以是全部(即任何应用程序),也可以是指定协议。阿里云预置了常见应用的协议,如:TCP、UDP、HTTP(S)、SSH、MySQL、MS SQL、Oracle、Redis 等。
- 端口范围:是指本次规则开放(或限制)的端口范围,该值受「协议类型」的影响。如果上面协议类型选择的是「全部」,则端口范围是
-1/-1
,表示不限制端口;如果是自定义协议(如:自定义TCP),则有效的端口值是1 ~ 65535。 - 优先级:规则的优先级,数值越小,优先级越高。详见 阿里云提供的默认安全组 一节关于安全组规则优先级的说明。
- 授权类型:授权类型包括「地址段访问」和「安全组访问」两种类型。这里的选择,将影响 授权对象 的填写(见下一条说明)。
- 授权对象:如果授权类型选择的是「地址段访问」,那么,这里应该填写单一 IP 地址(如:
16.1.1.2
)或者 CIDR(指 Classless Inter-Domain Routing,中文意思是无类别域间路由)网段格式(如:10.1.1.1/25
);这里如果填写的值是0.0.0.0/0
,则表示允许(或拒绝)所有 IP 地址的访问。如果授权类型选择的是「安全组访问」,那么,本规则只对内网有效,可实现内网互通。如果需要对公网开放(或限制)访问,只能选择「地址段访问」授权类型。 - 描述:关于本规则的简单说明,方便后期管理,可选填。
上述内容填完之后,点击「确定」按钮,完成设置。
关于端口范围的格式说明
端口范围的合法格式是
开始端口/结束端口
,即由/
分隔的 2 个端口值组成了端口范围。如果是一个端口,也需要按照这种格式来设置,这种情况下,开始端口
和结束端口
设置为一样即可。比如,HTTP 协议的默认端口是80
,那么,端口范围应该设置为80/80
。
3、如何检查设置的规则是否生效?
这里,我们通过配置一条自定义 TCP 协议规则,来检验规则是否生效。
规则配置如下:
- 网卡类型:公网
- 规则方向:入方向
- 授权策略:允许
- 协议类型:自定义 TCP
- 端口访问:80/80
- 授权类型:地址段访问
- 授权对象:0.0.0.0/0
上述规则,表示允许所有入方向的 IP 地址访问实例的 80 端口。
规则配置好之后,打开终端,运行 netstat -an | grep 80
命令,查看 80
端口是否被监听。如果返回下面的结果,说明 TCP 80 端口已开通:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
然后,我们再打开浏览器,在地址栏中输入:http://您的实例公网IP地址
,如果能正常访问,说明刚才设置的规则已生效;否则,请重新检查并调整规则设置。
4、加入/移出安全组
当创建了安全组,并设置了安全组规则,我们可以把现有的 ECS 实例加入我们创建的安全组。方法如下:
- 进入 ECS 管理控制台
- 选择一台 ECS 实例,点击「管理」链接,进入实例详情
- 点击「本实例安全组」菜单,页面上将列出当前实例已经加入的安全组
- 点击右上角「加入安全组」按钮,将弹出「ECS实例加入安全组」对话框
- 在该对话框中,选择一个要加入的安全组,然后点击「确定」按钮,如下图所示:

上面几步就是加入安全组的步骤。
当然,如果要移出安全组,在已经加入的安全组列表中,找到要移出的那个安全组,然后点击 操作 列的「移出」链接,即可把当前实例从所选安全组中移出。
注:如果当前实例只加入了一个安全组,则不可移出。此时,实例安全组的「移出」链接将显示为灰色不可点击状态。
至此,创建并使用安全组的全部过程已介绍完毕。下面,我们简单说一下如何通过阿里云提供的 API 来创建安全组。
使用 CreateSecurityGroup
API 创建安全组
上面我们详细介绍了如何在 ECS 管理控制台来创建安全组及相关操作,同时,阿里云还提供了 CreateSecurityGroup
API 方法来创建安全组。本节内容将简单介绍如何通过 API 来新建安全组。
1、基本介绍
通过 API 创建新的安全组用到的方法是 CreateSecurityGroup
。通过该方法新建的安全组,默认情况下,只允许安全组内实例互相访问,安全组外的通信请求会被拒绝(refused)。如果要接收来自其他安全组实例的通信请求,或者来自互联网其他应用程序的访问请求,则需要授权安全组权限(对应的 API 是 AuthorizeSecurityGroup
,该方法的作用是添加安全组入方向规则)。
通过 CreateSecurityGroup
方法创建的安全组,需要注意的是:
- 最多支持创建 100 个安全组
- 创建 VPC 类型(即专有网络)的安全组时,必须指定
VpcId
参数
下面,我们一起来看看 CreateSecurityGroup
方法的请求参数。
2、请求参数
CreateSecurityGroup
方法的请求参数如下:
Action
API 请求对应的方法名称,这里是 CreateSecurityGroup
。
- 参数类型:
String
- 是否必填:必填
RegionId
安全组所属地域 ID,可以调用 DescribeRegions
方法查看最新的阿里云地域列表。
- 参数类型:
String
- 是否必填:必填
SecurityGroupName
安全组名称。长度为 2 - 128 个字符,且必须以大小字母或中文开头,可以包含数字、点号(.
)、下划线(_
)或者连字符(-
)。默认为空。
- 参数类型:
String
- 是否必填:非必填
Description
安全组描述信息。长度为 2 - 256 个英文或中文字符。默认为空。
- 参数类型:
String
- 是否必填:非必填
VpcId
安全组所属 VPC ID(专有网络ID)。
- 参数类型:
String
- 是否必填:非必填
ClientToken
该参数用于保证请求的幂等性。由客户端生成该参数值,要求唯一。只支持 ASCII 字符,而且不能超过 64 个字符。
- 参数类型:
String
- 是否必填:非必填
3、方法返回值
调用 CreateSecurityGroup
方法将返回 SecurityGroupId
,表示新创建的安全组ID,返回值可以是 JSON 格式,也可以是 XML 格式。
JSON 格式返回值:

XML 格式返回值

4、常见错误码
下表是调用 CreateSecurityGroup
方法时常见的错误代码,供参考:
调用 CreateSecurityGroup
方法常见的错误码:
错误代码 | 错误信息 | HTTP 状态码 | 说明 |
---|---|---|---|
IncorrectVpcStatus | Current VPC status does not support this operation. | 400 | 指定的 VPC 正在被创建、编辑或者删除,请稍后再试。 |
InvalidDescription.Malformed | The specified parameter “Description” is not valid. | 400 | 指定的 Description 不合法。 |
InvalidSecurityGroupDiscription.Malformed | Specified security group description is not valid. | 400 | 指定的 Description 不合法。 |
InvalidSecurityGroupName.Malformed | Specified security group name is not valid. | 400 | 指定的 SecurityGroupName 不合法。 |
InvalidVpcId.NotFound | vpc id must not empty when only support vpc vm. | 403 | 参数 VpcId 不能为空。 |
QuotaExceed.SecurityGroup | The maximum number of security groups is reached. | 403 | 您最多可以创建 100 个安全组。 |
InvalidRegionId.NotFound | The specified RegionId does not exist. | 404 | 指定的 RegionId 不存在。 |
InvalidVpcId.NotFound | Specified VPC does not exist. | 404 | 指定的 VPC 不存在。 |
总结
安全问题是我们在使用云服务时应该重视的问题。本文详细介绍了阿里云安全组相关知识和概念,以及如何创建和加入安全组,最后,我们简单介绍了阿里云提供的用于创建安全组的API,让您可以以编程的方式来创建和管理您的实例安全组。
感谢您的阅读,希望对您有帮助。