

# EC2 实例的 Amazon EC2 安全组
<a name="ec2-security-groups"></a>

*安全组* 充当 EC2 实例的虚拟防火墙，用于控制传入和传出流量。入站规则控制传入到实例的流量，出站规则控制从实例传出的流量。启动实例时，您可以指定一个或多个安全组。如果您未指定安全组，则 Amazon EC2 将对 VPC 使用默认安全组。启动实例后，您可以更改其安全组。

安全性是 AWS 和您的共同责任。有关更多信息，请参阅 [Amazon EC2 中的安全性](ec2-security.md)。AWS 提供安全组作为一项工具用于保护您的实例，您需要对其进行配置以满足您的安全需求。如果安全组无法满足您的要求，除了使用安全组外，您还可以在任何一个实例上保持自己的防火墙。

**定价**  
使用安全组不会收取任何额外费用。

**Topics**
+ [

## 概述
](#security-group-basics)
+ [

# 为 Amazon EC2 实例创建安全组
](creating-security-group.md)
+ [

# 更改 Amazon EC2 实例的安全组
](changing-security-group.md)
+ [

# 删除 Amazon EC2 安全组
](deleting-security-group.md)
+ [

# Amazon EC2 安全组连接跟踪
](security-group-connection-tracking.md)
+ [

# 针对不同使用案例的安全组规则
](security-group-rules-reference.md)

## 概述
<a name="security-group-basics"></a>

您可以将每个实例与多个安全组关联，也可以将每个安全组与多个实例关联。为每个安全组添加规则，规定流入或流出其关联实例的流量。您可以随时修改安全组的规则。新规则和修改后的规则将自动应用到与安全组相关联的所有实例。在决定是否允许流量到达某个实例时，Amazon EC2 会评估与该实例关联的所有安全组中的所有规则。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)。

下图显示了一个具有一个子网、一个互联网网关和一个安全组的 VPC。子网包含 EC2 实例。安全组与实例关联。到达实例的唯一流量是得到安全组规则允许的流量。例如，如果安全组包含一条允许来自您的网络的 SSH 流量的规则，则您可以使用 SSH 从您的计算机连接到实例。如果安全组包含一条规则，允许来自与其关联的资源的所有流量，则每个实例都可以接收从其他实例发送的任何流量。

![\[具有一个安全组的 VPC 将子网中的 EC2 实例与安全组关联起来。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2-security-groups.png)


安全组是有状态的 — 如果您从实例发送一个请求，则无论入站安全组规则如何，都将允许该请求的响应流量流入。此外，如果是为响应已允许的入站流量，则该响应可以出站，此时可忽略出站规则。有关更多信息，请参阅 [连接跟踪](security-group-connection-tracking.md)。

# 为 Amazon EC2 实例创建安全组
<a name="creating-security-group"></a>

安全组用作相关实例的防火墙，可在实例级别控制入站和出站的数据流。您可以向安全组添加规则，以便能够使用 SSH（Linux 实例）或 RDP（Windows 实例）连接到实例。您还可以添加允许客户端流量的规则，例如发往 Web 服务器的 HTTP 和 HTTPS 流量。

在启动某个实例时，您可以将安全组与该实例关联。在关联的安全组中添加或删除规则时，这些更改将自动应用于与安全组关联的所有实例。

启动实例后，即可关联其他安全组。有关更多信息，请参阅 [更改 Amazon EC2 实例的安全组](changing-security-group.md)。

您可以在创建安全组时添加入站和出站安全组规则，也可以稍后添加规则。有关更多信息，请参阅 [配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。有关可以添加到安全组的规则示例，请参阅[针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**注意事项**
+ 新安全组起初只有一条出站规则，即允许所有通信离开资源。您必须添加规则，以便允许任何入站数据流或限制出站数据流。
+ 在为允许 SSH 或 RDP 访问实例的规则配置来源时，切勿允许从任何地方进行访问，因为这将允许从互联网上的所有 IP 地址访问实例。这在测试环境中可以接受一小段时间，但是在生产环境中并不安全。
+ 如果特定端口具有多个规则，Amazon EC2 将应用最宽松的规则。例如，如果有一条规则允许从 IP 地址 203.0.113.1 访问 TCP 端口 22（SSH），而另一条规则允许从任何地方访问 TCP 端口 22，则所有人都可以访问 TCP 端口 22。
+ 您可以将多个安全组与一个实例关联。因此，一个实例可以有数百条适用的规则。访问该实例时，这可能会导致问题。因此，我们建议您尽可能使规则简洁。
+ 当您指定一个安全组作为规则的源或目标时，规则会影响与该安全组关联的所有实例。允许的传入流量基于与源安全组相关联的实例的私有 IP 地址 (而不是公有 IP 或弹性 IP 地址)。有关 IP 地址的更多信息，请参阅 [Amazon EC2 实例 IP 寻址](using-instance-addressing.md)。
+ 默认情况下，Amazon EC2 会阻止端口 25 上的流量。有关更多信息，请参阅 [对使用端口 25 发送的电子邮件的限制](ec2-resource-limits.md#port-25-throttle)。

------
#### [ Console ]

**创建安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组）。

1. 选择 **Create security group**（创建安全组）。

1. 输入安全组的描述性名称和简要说明。在创建安全组后，您无法更改其名称和描述。

1. 对于 **VPC**，请选择将在其中运行 Amazon EC2 实例的 VPC。

1. （可选）要添加入站规则，请选择**入站规则**。对于每条规则，请选择**添加规则**并指定协议、端口和来源。例如，要允许 SSH 流量，请在**类型**中选择 **SSH**，并为**来源**指定计算机或网络的公有 IPv4 地址。

1. （可选）要添加出站规则，请选择**出站规则**。对于每条规则，请选择**添加规则**并指定协议、端口和目标。若不这样做，您可以保留允许所有出站流量的默认规则。

1. （可选）若要添加标签，请选择 **Add new tag**（添加新标签），然后输入该标签的键和值。

1. 选择**创建安全组**。

------
#### [ AWS CLI ]

**创建安全组**  
使用以下 [create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html) 命令。

```
aws ec2 create-security-group \
    --group-name my-security-group \
    --description "my security group" \
    --vpc-id vpc-1234567890abcdef0
```

有关添加规则的示例，请参阅[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

------
#### [ PowerShell ]

**创建安全组**  
使用 [New-EC2SecurityGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2SecurityGroup.html) cmdlet。

```
New-EC2SecurityGroup `
    -GroupName my-security-group `
    -Description "my security group" `
    -VpcId vpc-1234567890abcdef0
```

有关添加规则的示例，请参阅[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

------

# 更改 Amazon EC2 实例的安全组
<a name="changing-security-group"></a>

您可以在启动 Amazon EC2 实例时指定安全组。启动实例后，即可添加或删除安全组。您也可以随时添加、删除或编辑关联安全组的安全组规则。

安全组与网络接口关联。添加或删除安全组会更改与主网络接口关联的安全组。您还可以更改与任何辅助网络接口关联的安全组。有关更多信息，请参阅 [修改网络接口属性](modify-network-interface-attributes.md)。

**Topics**
+ [

## 添加或删除安全组
](#add-remove-instance-security-groups)
+ [

## 配置安全组规则
](#add-remove-security-group-rules)

## 添加或删除安全组
<a name="add-remove-instance-security-groups"></a>

启动实例后，即可在关联的安全组列表中添加或删除安全组。当您将多个安全组与一个实例相关联时，将有效汇总每个安全组的规则，以创建一组规则。Amazon EC2 使用这组规则确定是否允许流量。

**要求**
+ 实例必须处于 `running` 或 `stopped` 状态。

------
#### [ Console ]

**更改实例的安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您的实例，依次选择 **Actions**（操作）、**Security**（安全）和 **Change security groups**（更改安全组）。

1. 对于 **Associated security groups (关联的安全组)**，从列表中选择一个安全组，然后选择 **Add security group (添加安全组)**。

   要删除已关联的安全组，请为该安全组选择 **Remove (删除)**。

1. 选择**保存**。

------
#### [ AWS CLI ]

**更改实例的安全组**  
使用以下 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) 命令。

```
aws ec2 modify-instance-attribute \
    --instance-id i-1234567890abcdef0 \
    --groups sg-1234567890abcdef0
```

------
#### [ PowerShell ]

**更改实例的安全组**  
使用 [Edit-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceAttribute.html) cmdlet。

```
Edit-EC2InstanceAttribute `
    -InstanceId i-1234567890abcdef0 `
    -Group sg-1234567890abcdef0
```

------

## 配置安全组规则
<a name="add-remove-security-group-rules"></a>

创建安全组后，即可添加、更新或删除安全组的规则。在添加、更新或删除规则时，更改将自动应用于与安全组关联的资源。

有关可以添加到安全组的规则示例，请参阅[针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**所需的权限**  
在开始之前，请确保您拥有所需权限。有关更多信息，请参阅 [示例：使用安全组](iam-policies-ec2-console.md#ex-security-groups)。

**协议和端口**
+ 使用控制台，当您选择预定义的类型时，将为您指定**协议**和**端口范围**。要输入端口范围，必须选择以下自定义类型之一：**自定义 TCP** 或**自定义 UDP**。
+ 使用 AWS CLI，您可以使用 `--protocol` 和 `--port` 选项添加带有单个端口的单个规则。要添加多个规则或具有端口范围的规则，请改用 `--ip-permissions` 选项。

**来源和目标**
+ 使用控制台，您可以将以下内容指定为入站规则的源或出站规则的目标：
  + **自定义**：IPv4 CIDR 数据块、IPv6 CIDR 数据块、安全组或前缀列表。
  + **Anywhere-IPv4** – 0.0.0.0/0 IPv4 CIDR 数据块。
  + **Anywhere-IPv6** – ::/0 IPv6 CIDR 数据块。
  + **我的 IP** – 本地计算机的公有 IPv4 地址。
+ 使用 AWS CLI，您可以使用 `--cidr` 选项指定 IPv4 CIDR 数据块，也可以使用 `--source-group` 选项指定安全组。要指定前缀列表或 IPv6 CIDR 数据块，请使用 `--ip-permissions` 选项。

**警告**  
如果要为端口 22（SSH）或 3389（RDP）添加入站规则，强烈建议仅授权特定 IP 地址或特定范围内的 IP 地址访问实例。如果选择 **Anywhere-IPv4**，则允许来自所有 IPv4 地址的流量使用指定协议访问实例。如果选择 **Anywhere-IPv6**，则允许来自所有 IPv6 地址的流量使用指定协议访问实例。

------
#### [ Console ]

**配置安全组规则**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组）。

1. 选择安全组。

1. 要编辑入站规则，请从**操作**或**入站规则**选项卡中选择**编辑入站规则**。

   1. 要添加规则，请选择**添加规则**，再输入规则的类型、协议、端口和来源。

      如果类型为 TCP 或 UDP，则必须输入允许的端口范围。对于自定义 ICMP，您必须从 **Protocol**（协议）中选择 ICMP 类型名称，并从 **Port range**（端口范围）中选择代码名称（如果适用）。对于任何其他类型，则会为您配置协议和端口范围。

   1. 要更新规则，请根据需要更改规则的协议、描述和来源。但是，您无法更改来源类型。例如，若来源是 IPv4 CIDR 数据块，则无法指定 IPv6 CIDR 数据块、前缀列表或安全组。

   1. 要删除规则，请选择规则的**删除**按钮。

1. 要编辑出站规则，请从**操作**或**出站规则**选项卡中选择**编辑出站规则**。

   1. 要添加规则，请选择**添加规则**，再输入规则的类型、协议、端口和目标。您也可以输入可选描述。

      如果类型为 TCP 或 UDP，则必须输入允许的端口范围。对于自定义 ICMP，您必须从 **Protocol**（协议）中选择 ICMP 类型名称，并从 **Port range**（端口范围）中选择代码名称（如果适用）。对于任何其他类型，则会为您配置协议和端口范围。

   1. 要更新规则，请根据需要更改规则的协议、描述和来源。但是，您无法更改来源类型。例如，若来源是 IPv4 CIDR 数据块，则无法指定 IPv6 CIDR 数据块、前缀列表或安全组。

   1. 要删除规则，请选择规则的**删除**按钮。

1. 选择**保存规则**。

------
#### [ AWS CLI ]

**添加安全组规则**  
使用 [authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html) 命令添加入站规则。以下示例会允许来自指定前缀列表中的 CIDR 数据块的入站 SSH 流量。

```
aws ec2 authorize-security-group-ingress \
    --group-id sg-1234567890abcdef0 \
    --ip-permissions 'IpProtocol=tcp,FromPort=22,ToPort=22,PrefixListIds=[{PrefixListId=pl-f8a6439156EXAMPLE}]'
```

使用 [authorize-security-group-egress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-egress.html) 命令添加出站规则。以下示例会允许端口 80 上指向具有指定安全组的实例的出站 TCP 流量。

```
aws ec2 authorize-security-group-egress \
    --group-id sg-1234567890abcdef0 \
    --ip-permissions 'IpProtocol=tcp,FromPort=80,ToPort=80,UserIdGroupPairs=[{GroupId=sg-0aad1c26bb6EXAMPLE}]'
```

**移除安全组规则**  
使用以下 [revoke-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html) 命令移除入站规则。

```
aws ec2 revoke-security-group-egress \
    --group id sg-1234567890abcdef0 \
    --security-group-rule-ids sgr-09ed298024EXAMPLE
```

使用以下 [revoke-security-group-egress](https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-egress.html) 命令移除出站规则。

```
aws ec2 revoke-security-group-ingress \
    --group id sg-1234567890abcdef0 \
    --security-group-rule-ids sgr-0352250c1aEXAMPLE
```

**修改安全组规则**  
使用 [modify-security-group-rules](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-security-group-rules.html) 命令。以下示例会更改指定安全组规则的 IPv4 CIDR 数据块。

```
aws ec2 modify-security-group-rules \
    --group id sg-1234567890abcdef0 \
    --security-group-rules 'SecurityGroupRuleId=sgr-09ed298024EXAMPLE,SecurityGroupRule={IpProtocol=tcp,FromPort=80,ToPort=80,CidrIpv4=0.0.0.0/0}'
```

------
#### [ PowerShell ]

**添加安全组规则**  
使用 [Grant-EC2SecurityGroupIngress](https://docs.aws.amazon.com/powershell/latest/reference/items/Grant-EC2SecurityGroupIngress.html) cmdlet 添加入站规则。以下示例会允许来自指定前缀列表中的 CIDR 数据块的入站 SSH 流量。

```
$plid = New-Object -TypeName Amazon.EC2.Model.PrefixListId
$plid.Id = "pl-f8a6439156EXAMPLE"
Grant-EC2SecurityGroupIngress `
    -GroupId sg-1234567890abcdef0 `
    -IpPermission @{IpProtocol="tcp"; FromPort=22; ToPort=22; PrefixListIds=$plid}
```

使用 [Grant-EC2SecurityGroupEgress](https://docs.aws.amazon.com/powershell/latest/reference/items/Grant-EC2SecurityGroupEgress.html) cmdlet 添加出站规则。以下示例会允许端口 80 上指向具有指定安全组的实例的出站 TCP 流量。

```
$uigp = New-Object -TypeName Amazon.EC2.Model.UserIdGroupPair
$uigp.GroupId = "sg-0aad1c26bb6EXAMPLE"
Grant-EC2SecurityGroupEgress `
    -GroupId sg-1234567890abcdef0 `
    -IpPermission @{IpProtocol="tcp"; FromPort=80; ToPort=80; UserIdGroupPairs=$uigp}
```

**移除安全组规则**  
使用 [Revoke-EC2SecurityGroupIngress](https://docs.aws.amazon.com/powershell/latest/reference/items/Revoke-EC2SecurityGroupIngress.html) cmdlet 移除入站规则。

```
Revoke-EC2SecurityGroupIngress `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRuleId sgr-09ed298024EXAMPLE
```

使用 [Revoke-EC2SecurityGroupEgress](https://docs.aws.amazon.com/powershell/latest/reference/items/Revoke-EC2SecurityGroupEgress.html) cmdlet 移除出站规则。

```
Revoke-EC2SecurityGroupEgress `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRuleId sgr-0352250c1aEXAMPLE
```

**修改安全组规则**  
使用 [Edit-EC2SecurityGroupRule](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2SecurityGroupRule.html) cmdlet。以下示例会更改指定安全组规则的 IPv4 CIDR 数据块。

```
$sgrr = New-Object -TypeName Amazon.EC2.Model.SecurityGroupRuleRequest
$sgrr.IpProtocol = "tcp"
$sgrr.FromPort = 80
$sgrr.ToPort = 80
$sgrr.CidrIpv4 = "0.0.0.0/0"
$sgr = New-Object -TypeName Amazon.EC2.Model.SecurityGroupRuleUpdate
$sgr.SecurityGroupRuleId = "sgr-09ed298024EXAMPLE"
$sgr.SecurityGroupRule = $sgrr
Edit-EC2SecurityGroupRule  `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRule $sgr
```

------

# 删除 Amazon EC2 安全组
<a name="deleting-security-group"></a>

使用完为使用 Amazon EC2 实例创建的安全组后，可以将其删除。

**要求**
+ 安全组不能与实例或网络接口关联。
+ 其他安全组中的规则无法引用安全组。

------
#### [ Console ]

**删除安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. （可选）要验证安全组是否未与实例关联，请执行以下操作：

   1. 在导航窗格中，选择**安全组**。

   1. 复制要删除的安全组的 ID。

   1. 在导航窗格中，选择 **Instances (实例)**。

   1. 在搜索栏中，添加**安全组 ID 等于**筛选条件，再粘贴安全组的 ID。若没有结果，则安全组未与实例关联。若有结果，则必须取消关联安全组，才能将其删除。

1. 在导航窗格中，选择**安全组**。

1. 选择安全组，然后依次选择**操作**、**删除安全组**。

1. 如果选择了多个安全组，系统会提示您进行确认。如果某些安全组无法删除，我们会显示每个安全组的状态，表明是否会被删除。要确认删除操作，请输入**删除**。

1. 选择**删除**。

------
#### [ AWS CLI ]

**删除安全组**  
使用以下 [delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html) 命令。

```
aws ec2 delete-security-group --group-id sg-1234567890abcdef0
```

------
#### [ PowerShell ]

**删除安全组**  
使用 [Remove-EC2SecurityGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2SecurityGroup.html) cmdlet。

```
Remove-EC2SecurityGroup -GroupId sg-1234567890abcdef0
```

------

# Amazon EC2 安全组连接跟踪
<a name="security-group-connection-tracking"></a>

您的安全组使用连接跟踪来跟踪有关进出实例的流量的信息。将基于流量的连接状态应用规则以确定允许还是拒绝流量。有了这种方法，安全组就具有状态。这意味着无论出站安全组规则如何都允许对入站流量的响应流出实例，反之亦然。

例如，假设您从家中的计算机对您的实例启动 netcat 或与您的实例类似的命令，并且您的入站安全组规则允许 ICMP 流量。跟踪有关连接的信息（包括端口信息）。来自 命令的实例的响应流量不会作为新请求来跟踪，而是作为已建立的连接来跟踪，并且可以流出实例，即使您的出站安全组规则限制出站 ICMP 流量也是如此。

对于除 TCP、UDP 或 ICMP 以外的协议，仅跟踪 IP 地址和协议编号。如果您的实例将流量发送到另一个主机，且该主机在 600 秒内将同一类型的流量发送到您的实例，则无论入站安全组规则如何，您的实例的安全组都将接受该请求。安全组接受它，因为它被视为原始流量的响应流量。

更改安全组规则时，其跟踪的连接不会立即中断。在现有连接超时之前，安全组将继续允许数据包。要确保该流量立即中断，或确保所有流量无论跟踪状态如何，均遵循防火墙规则，您可以使用子网的网络 ACL。网络 ACL 是无状态的，因此不会自动允许响应流量。添加阻止任一方向的流量的网络 ACL 会破坏现有连接。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[网络 ACL](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)。

**注意**  
安全组对传入或传出 Route 53 Resolver 的 DNS 流量没有影响，Route 53 Resolver 有时称为“VPC\$12 IP 地址”（请参阅《Amazon Route 53 开发者指南**》中的[什么是 Amazon Route 53 Resolver？](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver.html)）或“AmazonProvidedDNS”（请参阅《Amazon Virtual Private Cloud 用户指南**》中的[使用 DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/DHCPOptionSet.html)）。如果希望通过 Route 53 Resolver 筛选 DNS 请求，则可以启用 Route 53 Resolver DNS Firewall（请参阅《Amazon Route 53 开发人员指南**》中的 [Route 53 Resolver DNS Firewall](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-dns-firewall.html)）。

## 未跟踪的连接
<a name="untracked-connections"></a>

并非所有通信流都会被跟踪。如果有安全组规则允许所有流量（0.0.0.0/0 或 ::/0）的 TCP 或 UDP 流，而另一个方向上存在对应的规则，允许任何端口（0-65535）的所有响应流量（0.0.0.0/0 或 ::/0），则系统不会跟踪该流量流，除非它属于[自动跟踪连接](#automatic-tracking)的一部分。基于允许响应流量的入站或出站规则允许未跟踪流的响应流量，而不是基于跟踪信息。

如果删除或修改了支持该流的规则，则会立即中断未被跟踪的通信流。例如，如果您有一个开放 (0.0.0.0/0) 出站规则，并且删除了允许所有 (0.0.0.0/0) 入站 SSH（TCP 端口 22）流量传输到实例的规则（或修改它以使不再允许连接），则您与实例的现有 SSH 连接将立即删除。该连接以前未跟踪，因此更改将断开连接。另一方面，如果您有一个较细化的入站规则，最初允许 SSH 连接（意味着已跟踪该连接），但将该规则更改为不再允许来自当前 SSH 客户端地址的新连接，则由于现有的 SSH 连接被跟踪，它不会中断。

## 自动跟踪的连接
<a name="automatic-tracking"></a>

即使安全组配置无需跟踪，也会自动跟踪通过以下各项建立的连接：
+ 仅出口互联网网关
+ Global Accelerator 加速器
+ NAT 网关
+ Network Firewall 防火墙端点
+ 网络负载均衡器
+ AWS PrivateLink（接口 VPC 端点）
+ AWS Lambda（Hyperplane 弹性网络接口）
+ DynamoDB 网关端点 – 与 DynamoDB 的每个连接都会消耗 2 个 conntrack 条目。

## 连接跟踪限额
<a name="connection-tracking-throttling"></a>

Amazon EC2 定义每个实例可以跟踪的最大连接数量。达到最大值后，由于无法建立新连接，所有发送或接收的数据包都将丢失。发生这种情况时，发送和接收数据包的应用程序无法正常通信。使用 `conntrack_allowance_available` 网络性能指标来确定该实例类型仍然可用的跟踪连接数。

要确定数据包是否因为您实例的网络流量超过了可跟踪的最大连接数量而丢弃，请使用 `conntrack_allowance_exceeded` 网络性能指标。有关更多信息，请参阅 [监控 EC2 实例上 ENA 设置的网络性能](monitoring-network-performance-ena.md)。

如果您超过了每个实例可跟踪的最大连接数量，建议您借助 Elastic Load Balancing 扩展负载均衡器注册的实例数或实例大小。

## 连接跟踪最佳实践
<a name="connection-tracking-performance"></a>

非对称路由（即流量通过一个网络接口进入实例，然后通过另一个网络接口离开）可能会降低实例在跟踪流量时所能达到的峰值性能。

为在针对安全组启用连接跟踪时保持峰值性能并优化连接管理，建议您使用以下配置：
+ 如有可能，请避免使用非对称路由拓扑。
+ 并非使用安全组进行筛选，而是使用网络 ACL。
+ 如果必须将安全组与连接跟踪结合使用，请配置尽可能短的空闲连接跟踪超时。有关空闲连接跟踪超时的详细信息，请参阅下一节。
+ 由于 Nitrov6 实例的默认超时时间较短，具有长期连接的应用程序（例如数据库连接池、持久 HTTP 连接或流式工作负载）应在实例启动时配置适当的 `TcpEstablishedTimeout` 值。
+ 对于长期连接，请将 TCP keepalive 配置为每隔少于 5 分钟发送一次，进而确保连接保持打开状态并保持其跟踪状态。这有助于防止由于空闲超时而导致连接中断，并减少重新建立连接的开销。

有关 Nitro 系统性能优化的更多信息，请参阅 [Nitro 系统性能调整注意事项](ena-nitro-perf.md)。

## 空闲连接跟踪超时
<a name="connection-tracking-timeouts"></a>

安全组会跟踪建立的每个连接，以确保返回数据包按预期交付。每个实例都有可以跟踪的最大连接数量。保持空闲状态的连接可能导致连接跟踪耗尽，并导致无法跟踪连接和丢弃数据包。您可以在弹性网络接口上设置空闲连接跟踪的超时时间。

**注意**  
此功能仅适用于[基于 Nitro 的实例](instance-types.md#instance-hypervisor-type)。在部署到生产环境之前，您应该在 Nitrov6 代实例上测试应用程序，减少 `350` 秒默认连接跟踪超时。

有三种可配置的超时：
+ **TCP 建立超时**：处于已建立状态的空闲 TCP 连接的超时时间（以秒为单位）。
  + 最小值：`60` 秒
  + 最大值：`432000` 秒
  + 默认值：[Nitrov6](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html) 实例类型（不包括 P6e-GB200）为 `350` 秒。其他实例类型（包括 P6e-GB200）为 `432000` 秒。
  + 建议值：小于 `432000` 秒
+ **UDP 超时**：空闲 UDP 流的超时时间（以秒为单位），这些流仅在单个方向或单个请求-响应事务上看到流量。
  + 最小值：`30` 秒
  + 最大值：`60` 秒
  + 原定设置：`30` 秒
+ **UDP 流超时**：空闲 UDP 流的超时（以秒为单位），这些流被归类为已看到多个请求-响应事务的流。
  + 最小值：`60` 秒
  + 最大值：`180` 秒
  + 原定设置：`180` 秒

对于以下任何一种情况，您可能需要修改默认超时：
+  如果您[使用 Amazon EC2 网络性能指标监控跟踪的连接](monitoring-network-performance-ena.md)，那么 *conntrack\$1allowance\$1exceeded* 和 *conntrack\$1allowance\$1available* 指标使您能够监控丢弃的数据包并跟踪连接利用率，通过纵向或横向扩展操作主动管理 EC2 实例容量，从而在丢弃数据包之前帮助满足网络连接需求。如果您观察到正在 EC2 实例上丢弃 *conntrack\$1allowance\$1exceeded*，您可以设置较低的 TCP 建立超时，以解决因不正确的客户端或网络中继盒导致 TCP/UDP 会话失效的问题，您可能会受益于此操作。
+ 通常，负载均衡器或防火墙的 TCP 建立空闲超时在 60 到 90 分钟之间。如果您正在运行的工作负载需要处理来自网络防火墙等设备的大量连接（大于 100k），则建议在 EC2 网络接口上配置类似的超时时间。
+ 如果您运行的工作负载使用非对称路由拓扑，我们建议将 TCP 建立空闲超时配置为 60 秒。
+ 如果您正在运行具有大量连接的工作负载，例如 DNS、SIP、SNMP、Syslog、Radius 和主要使用 UDP 来处理请求的其他服务，则将“UDP-Stream”超时设置为 60 秒可以提高现有容量的规模/性能，并防止灰色故障。
+ 对于通过网络负载均衡器进行的 TCP/UDP 连接，将追踪所有连接。TCP 流的空闲超时值为 350 秒，而 UDP 流为 120 秒，因接口级别的超时值而异。您可能希望在网络接口级别配置超时，以便比负载均衡器的默认值具有更大的超时灵活性。

当您执行以下操作时，可以选择配置连接跟踪超时：
+ [创建网络接口](create-network-interface.md)
+ [修改网络接口属性](modify-network-interface-attributes.md)
+ [启动 EC2 实例](ec2-instance-launch-parameters.md#liw-network-settings)
+ [创建 EC2 实例启动模板](ec2-instance-launch-parameters.md#liw-network-settings)

## 示例
<a name="connection-tracking-example"></a>

在以下示例中，安全组具有允许 TCP 和 ICMP 流量的入站规则，并具有允许所有出站流量的出站规则。


**入站**  

| 协议类型 | 端口号 | 来源 | 
| --- | --- | --- | 
| TCP  | 22 (SSH) | 203.0.113.1/32 | 
| TCP  | 80 (HTTP) | 0.0.0.0/0 | 
| TCP  | 80 (HTTP) | ::/0 | 
| ICMP | 全部 | 0.0.0.0/0 | 


**出站**  

| 协议类型 | 端口号 | 目标 | 
| --- | --- | --- | 
| 全部 | 全部 | 0.0.0.0/0 | 
| All | All | ::/0 | 

通过与实例或网络接口的直接网络连接，跟踪行为如下：
+ 将会跟踪端口 22（SSH）上的入站和出站 TCP 流量，因为入站规则只允许来自 203.0.113.1/32 的流量，而不是所有 IP 地址（0.0.0.0/0）。
+ 不会跟踪端口 80（HTTP）上的入站和出站 TCP 流量，因为入站和出站规则允许来自所有 IP 地址的流量。
+ 始终跟踪 ICMP 流量。

如果您删除 IPv4 流量的出站规则，则将跟踪所有入站和出站 IPv4 流量，包括端口 80（HTTP）上的流量。如果您删除 IPv6 流量的出站规则，这同样适用于 IPv6 流量。

# 针对不同使用案例的安全组规则
<a name="security-group-rules-reference"></a>

您可以创建安全组，并添加可反映与安全组关联的实例角色的规则。例如，配置作为 Web 服务器的实例需要允许入站 HTTP 和 HTTPS 访问的安全组规则。同样，数据库实例需要允许数据库类型访问的规则，例如，对 MySQL 允许通过端口 3306 进行访问。

以下是您可以添加到允许特定类型访问的安全组的规则类型示例。

**Topics**
+ [

## Web 服务器规则
](#sg-rules-web-server)
+ [

## 数据库服务器规则
](#sg-rules-db-server)
+ [

## 用于从您的计算机连接到实例的规则
](#sg-rules-local-access)
+ [

## 用于在具有相同安全组的实例之间进行连接的规则
](#sg-rules-other-instances)
+ [

## 用于 ping/ICMP 的规则
](#sg-rules-ping)
+ [

## DNS 服务器规则
](#sg-rules-dns)
+ [

## Amazon EFS 规则
](#sg-rules-efs)
+ [

## Elastic Load Balancing 规则
](#sg-rules-elb)

有关说明，请参阅[创建安全组](creating-security-group.md)和[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

## Web 服务器规则
<a name="sg-rules-web-server"></a>

以下入站规则允许来自任何 IP 地址的 HTTP 和 HTTPS 访问。如果您为 VPC 启用了 IPv6，则可添加规则以控制来自 IPv6 地址的入站 HTTP 和 HTTPS 流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 80 (HTTP) | 0.0.0.0/0 | 允许来自任何 IPv4 地址的入站 HTTP 访问。 | 
| TCP | 6 | 443 (HTTPS) | 0.0.0.0/0 | 允许来自任何 IPv4 地址的入站 HTTPS 访问 | 
| TCP | 6 | 80 (HTTP) | ::/0 | 允许来自任何 IPv6 地址的入站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | ::/0 | 允许来自任何 IPv6 地址的入站 HTTPS 访问 | 

## 数据库服务器规则
<a name="sg-rules-db-server"></a>

以下入站规则是您可以为数据库访问添加的规则示例，具体取决于您在实例运行的数据库类型。有关 Amazon RDS 实例的更多信息，请参阅 [Amazon RDS 用户指南](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/)。

对于源 IP，请指定以下其中一项：
+ 本地网络中的特定 IP 地址或 IP 地址范围（采用 CIDR 数据块表示法）
+ 访问数据库的一组实例的安全组 ID


| 协议类型 | 协议编号 | 端口 | 备注 | 
| --- | --- | --- | --- | 
| TCP | 6 | 1433 (MS SQL) | 访问 Microsoft SQL Server 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 3306 (MYSQL/Aurora) | 访问 MySQL 或 Aurora 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 5439 (Redshift) | 访问 Amazon Redshift 集群数据库的默认端口。 | 
| TCP | 6 | 5432 (PostgreSQL) | 访问 PostgreSQL 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 1521 (Oracle) | 访问 Oracle 数据库的默认端口，例如，在 Amazon RDS 实例上 | 

您可以选择限制来自数据库服务器的出站流量。例如，您可能希望允许访问 Internet 进行软件更新，但限制所有其他类型的流量。您必须先删除允许所有出站流量的默认出站规则。


| 协议类型 | 协议编号 | 端口 | 目的地 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 80 (HTTP) | 0.0.0.0/0 | 允许对任何 IPv4 地址进行出站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | 0.0.0.0/0 | 允许对任何 IPv4 地址进行出站 HTTPS 访问 | 
| TCP | 6 | 80 (HTTP) | ::/0 | (仅限已启用 IPv6 的 VPC) 允许对任何 IPv6 地址进行出站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | ::/0 | (仅限已启用 IPv6 的 VPC) 允许对任何 IPv6 地址进行出站 HTTPS 访问 | 

## 用于从您的计算机连接到实例的规则
<a name="sg-rules-local-access"></a>

要连接到您的实例，您的安全组必须拥有允许 SSH 访问 (适用于 Linux 实例) 或 RDP 访问 (适用于 Windows 实例) 的入站规则。


| 协议类型 | 协议编号 | 端口 | 源 IP | 
| --- | --- | --- | --- | 
| TCP | 6 | 22 (SSH) | 您电脑的公有 IPv4 地址或您的本地网络中的 IP 地址范围。如果您为 VPC 启用了 IPv6，并且您的实例有一个 IPv6 地址，则可以输入一个 IPv6 地址或范围。 | 
| TCP | 6 | 3389 (RDP) | 您电脑的公有 IPv4 地址或您的本地网络中的 IP 地址范围。如果您为 VPC 启用了 IPv6，并且您的实例有一个 IPv6 地址，则可以输入一个 IPv6 地址或范围。 | 

## 用于在具有相同安全组的实例之间进行连接的规则
<a name="sg-rules-other-instances"></a>

要允许与同一安全组关联的实例之间相互通信，您必须明确添加实现此目的的规则。

**注意**  
如果您将路由配置为通过中间设备在不同子网中的两个实例之间转发流量，则必须确保这两个实例的安全组允许流量在实例之间流动。每个实例的安全组必须引用另一个实例的私有 IP 地址或包含另一个实例的子网的 CIDR 范围作为源。如果您引用另一个实例的安全组作为源，则安全组不允许流量在实例之间流动。

下表描述了允许关联的实例相互通信的安全组的入站规则。该规则允许所有类型的流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 
| --- | --- | --- | --- | 
| -1 (All) | -1 (All) | -1 (All) | 安全组的 ID 或包含另一个实例的子网的 CIDR 范围（请参阅注释）。 | 

## 用于 ping/ICMP 的规则
<a name="sg-rules-ping"></a>

**ping** 命令是一种 ICMP 流量。要对实例执行 ping 操作，您必须添加以下入站 ICMP 规则之一。


| Type | 协议 | 来源 | 
| --- | --- | --- | 
| 自定义 ICMP - IPv4 | Echo 请求 | 计算机的公有 IPv4 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 
| 所有 ICMP - IPv4 | IPv4 ICMP (1) | 计算机的公有 IPv4 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 

要使用 **ping6** 命令对您的实例的 IPv6 地址执行 ping 操作，您必须添加以下入站 ICMPv6 规则。


| Type | 协议 | 来源 | 
| --- | --- | --- | 
| 所有 ICMP - IPv6 | IPv6 ICMP (58) | 计算机的 IPv6 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 

## DNS 服务器规则
<a name="sg-rules-dns"></a>

如果您已将 EC2 实例设置为 DNS 服务器，则必须确保 TCP 和 UDP 流量可通过端口 53 访问您的 DNS 服务器。

对于源 IP，请指定以下其中一项：
+ 网络中的 IP 地址或 IP 地址范围（采用 CIDR 数据块表示法）
+ 您网络中需要访问 DNS 服务器的实例组的安全组 ID。


| 协议类型 | 协议编号 | 端口 | 
| --- | --- | --- | 
| TCP | 6 | 53 | 
| UDP | 17 | 53 | 

## Amazon EFS 规则
<a name="sg-rules-efs"></a>

如果您将 Amazon EFS 文件系统与 Amazon EC2 实例结合使用，与 Amazon EFS 挂载目标关联的安全组必须允许使用 NFS 协议传输的流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 2049 (NFS) | 安全组 ID | 允许从与该安全组关联的资源 (包括挂载目标) 进行入站 NFS 访问。 | 

要在 Amazon EC2 实例上挂载 Amazon EFS 文件系统，您必须连接到您的实例。因此，与您的实例关联的安全组必须拥有允许来自本地计算机或本地网络的入站 SSH 的规则。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 22 (SSH) | 本地计算机的 IP 地址范围或网络的 IP 地址范围（采用 CIDR 数据块表示法）。 | 允许从您的本地计算机进行入站 SSH 访问。 | 

## Elastic Load Balancing 规则
<a name="sg-rules-elb"></a>

如果在负载均衡器中注册 EC2 实例，与负载均衡器关联的安全组必须允许与实例进行通信。有关更多信息，请参阅弹性负载均衡文档中的以下内容。
+ [应用程序负载均衡器的安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html)
+ [网络负载均衡器的安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-security-groups.html)
+ [为经典负载均衡器配置安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-vpc-security-groups.html)