为什么我的 EC2 实例无法通过互联网网关连接到互联网?

上次更新日期:2020 年 11 月 16 日

我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例有一个公有 IP 地址,但无法访问互联网。如何解决此问题?

解决方案

验证实例是否满足所有先决条件

实例必须满足以下条件:

验证实例是否具有公有 IP 地址

如果实例没有公有 IP 地址,但具有互联网网关,则该实例无法在其所在的 Virtual Private Cloud (VPC) 之外访问。

要允许实例连接到 Internet,请分配弹性 IP 地址将其与实例关联

或者,启用子网中的公有 IPv4 寻址属性。启用 IPv4 寻址属性意味着在启动时会将公共 IP 地址分配给在子网中启动的实例。

验证防火墙不会阻止访问

如果实例满足上述条件,而 Internet 连接问题仍然存在,请尝试以下操作:

1.    使用 ping 或 curl 工具从已知工作实例或设备测试对站点或位置的可访问性。

2.    验证任何防火墙设备或软件是否允许 HTTP 或 HTTPS 流量。以下命令将添加入站防火墙规则:

Windows Server:

对于 Windows Server 默认防火墙,请运行以下命令:

netsh advfirewall firewall show rule name=all

如果上述命令表示流量被阻止,请添加新规则,以允许该特定端口的流量。在以下示例中,将端口 80 替换为您的特定端口号。

netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80

Amazon Linux、CentOS、RHEL 6 和 Ubuntu 16.04-:

运行以下命令以验证不存在会阻止流量的规则:

$ sudo iptables -L
$ sudo iptables -L -t nat

如果上述命令表示流量被阻止,请删除规则或添加规则,以允许该特定端口的流量。在以下示例中,将 examplerule 替换为新规则,将端口 80 替换为您的特定端口号。

$ sudo iptables -D examplerule
$ sudo iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT

Amazon Linux 2、CentOS7+、RHEL 7+ 和 Ubuntu 18.04+

运行以下命令以验证防火墙是否允许 HTTP/HTTPS 流量:

$ firewall-cmd --list-services

如果上述命令表示流量被阻止,请添加允许特定端口流量的规则。在以下命令中,将端口 80 替换为您的特定端口。

$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
 $ sudo firewall-cmd –reload