为什么我的 EC2 实例无法通过互联网网关连接到互联网?
上次更新日期:2020 年 11 月 16 日
我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例有一个公有 IP 地址,但无法访问互联网。如何解决此问题?
解决方案
验证实例是否满足所有先决条件
实例必须满足以下条件:
- 与实例子网关联的路由表具有通往互联网网关的默认路由 (0.0.0./0)。
- 与路由关联的互联网网关未被删除。
- 附加到实例弹性网络接口的安全组具有允许端口和协议的出站 Internet 流量 (0.0.0.0/0) 的规则。
- 与实例子网关联的网络访问控制列表(网络 ACL)包含允许出站和入站流量进入 Internet 的规则。
验证实例是否具有公有 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