我在 EC2 实例上托管了一个网站。如何允许我的用户通过 HTTP(80)或 HTTPS(443)连接?
上次更新日期:2022 年 9 月 26 日
我在一个 Amazon Elastic Compute Cloud(Amazon EC2)实例上托管我的网站。我希望用户通过 HTTP(端口 80)或 HTTPS(端口 443)连接到我的网站。该如何操作?
解决方法
要允许流量通过端口 80 和 443,您必须配置关联的安全组和网络访问控制列表(网络 ACL)。
安全组规则
对于 HTTP 流量,在端口 80 上添加一条来自源地址 0.0.0.0/0 的入站规则。
对于 HTTPS 流量,在端口 443 上添加一条来自源地址 0.0.0.0/0 的入站规则。
这些入站规则允许来自 IPv4 地址的流量。要允许 IPv6 流量,您需要在相同的端口上添加来自源地址 ::/0 的入站规则。有关创建或修改安全组的更多信息,请参阅使用安全组控制流向资源的流量。
安全组是有状态的,因此会自动允许从实例返回到用户的流量。您无需修改安全组的出站规则。
注意:下例演示了在TCP 端口 80(HTTP)和 443(HTTPS)上允许 IPv4 和 IPv6 流量的安全组规则。确定您的使用案例是否必须允许其他流量来源,例如用于登录实例的 SSH 或 RDP。然后,确保您的 SG 有相关的入站规则,以允许所需的流量。
入站规则
类型 | 协议 | 端口范围 | 源 |
HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 |
HTTP (80) | TCP (6) | 80 | ::/0 |
HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 |
HTTPS (443) | TCP (6) | 443 | ::/0 |
网络 ACL
默认网络 ACL 允许所有的入站和出站 IPv4 流量。如果您的用户使用 IPv6 连接,并且您的 Amazon Virtual Private Cloud(Amazon VPC)具有关联的 IPv6 CIDR 块,则您的默认网络 ACL 还会自动添加允许所有入站和出站 IPv6 流量的规则。不过,如果您使用具有限制更多的规则的自定义网络 ACL,则需要明确允许流量通过端口 80 和 443。
网络 ACL 是无状态的,因此需要同时添加入站和出站规则,才能允许到您网站的连接。有关修改网络 ACL 规则的更多信息,请参阅使用网络 ACL 控制流向子网的流量。
注意:下例演示了一个允许流量通过 TCP 端口 80(HTTP)和 443(HTTPS)的自定义网络 ACL。网络 ACL 应用于整个子网中的所有资源,而不仅仅是单个 EC2 实例。在示例配置中,除了目标端口 80 和 443 之外,进出同一子网中资源的所有流量都将被阻止。确定您的使用案例是否必须允许其他流量来源,例如用于登录实例的 SSH 或 RDP。然后,确保您有相关的入站规则以允许所需的流量。
入站规则
规则编号 | 类型 | 协议 | 端口范围 | 源 | 允许/拒绝 |
100 | HTTP (80) | TCP (6) | 80 | 0.0.0.0/0 | 允许 |
101 | HTTPS (443) | TCP (6) | 443 | 0.0.0.0/0 | 允许 |
102 | HTTP (80) | TCP (6) | 80 | ::/0 | 允许 |
103 | HTTPS (443) | TCP (6) | 443 | ::/0 | 允许 |
* | 所有流量 | 全部 | 全部 | ::/0 | 拒绝 |
* | 所有流量 | 全部 | 全部 | 0.0.0.0/0 | 拒绝 |
出站规则
规则编号 | 类型 | 协议 | 端口范围 | 目的地 | 允许/拒绝 |
100 | 自定义 TCP 规则 | TCP (6) | 1024-65535 | 0.0.0.0/0 | 允许 |
101 | 自定义 TCP 规则 | TCP (6) | 1024-65535 | ::/0 | 允许 |
* | 所有流量 | 全部 | 全部 | ::/0 | 拒绝 |
* | 所有流量 | 全部 | 全部 | 0.0.0.0/0 | 拒绝 |
对连接被拒绝错误进行排查
连接被拒绝错误意味着连接请求已路由到实例,但未通过指定端口从服务接收。如果主机 A 发起与主机 B 的 TCP 连接并收到连接被拒绝的错误,则该错误意味着以下内容:
- 首先,主机 A 向主机 B 发送了一个 TCP SYN 数据包。
- 然后,主机 B 向主机 A 发送了一个 TCP RST 数据包作为回应。
如果您遇到此错误,即使在安全组和网络 ACL 中允许 TCP 端口 80 和 443 之后,也请排查以下问题:
- 诸如 httpd(Apache)之类的服务进程守护程序未运行或处于停止状态。
要进行问题排查,请检查 EC2 实例中的服务是否处于运行状态。
- 该服务正在侦听错误的端口。
要进行问题排查,请检查 EC2 实例是否正在侦听所需的 TCP 端口(80/443)。
- 该端口被防火墙阻止。
要进行问题排查,请检查 EC2 实例中的操作系统级防火墙是否阻止了所需端口上的传入 TCP 流量。