如何从Amazon VPC连接到外部世界?

54

我通过向导设置了一个 Amazon VPC,将其设置为“仅公共网络”,因此我的所有实例都在公共子网中。

VPC 中分配了 Elastic IP 的实例可以毫无问题地连接互联网。

但是没有弹性 IP 的实例无法连接到任何地方。

互联网网关已存在。AWS 控制台中的路由表如下:

Destination Target 
10.0.0.0/16 local
0.0.0.0/0   igw-nnnnn

在实例内部进行路由显示

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        *               255.255.255.0   U     0      0        0 eth0
default         10.0.0.1        0.0.0.0         UG    100    0        0 eth0

我尝试打开实例所属安全组的所有入站和出站流量,以使其允许来自0.0.0.0/0的流量通过。仍然没有成功。

~$ ping google.com
PING google.com (74.125.224.36) 56(84) bytes of data.
^C
--- google.com ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5017ms

我还能做什么?

11个回答

57

看起来没有弹性IP的实例唯一的外部访问方式是:

  • 创建一个NAT网关或NAT实例
    • 必须是公共的,分配了弹性IP
    • NAT网关是一种较新的解决方案,由AWS建议,并且是完全托管的(维护成本低)。
    • NAT实例是一种较旧的方式,不被AWS推荐,但作为自我管理选项可用,可以从ami-vpc-nat-beta启动额外的m1.small实例,提供了完全控制。
  • 创建一个额外的子网,将其设置为“私有”
  • 将无弹性IP实例移动到该私有子网中
  • 修改路由表:来自私有子网的0.0.0.0/0应该发往NAT

因此,仅添加NAT是不够的。实例应该停止并移动到另一个来自另一个子网的IP地址。


2
文档指出,您还必须将EIP分配给NAT实例。 - dparkar
2
事实上,如果不将EIP分配给NAT实例,则它将无法工作。我刚测试过。 - dparkar
3
当然,你的NAT应该有EIP。这是暗示。我编辑了答案。 - Andrey Regentov
4
别忘了在 NAT 实例中禁用源/目标检查。 - Pablo SL
他们最近必须加入了“NAT实例源/目的地检查”,因为我以前连接时从未需要禁用它。默认设置不允许外部连接是相当愚蠢的,因为我想大多数人都会使用它来进行此操作。 - phocks
1
由于这是被接受的答案,请检查您的网络ACL(VPC->安全性->网络ACL)。确保您没有阻止入站或出站流量。在我的情况下,由于我的网络ACL不允许入站流量,因此它失败了。 - Adam Link

11

10
问:没有弹性IP的实例如何访问互联网?

没有弹性IP的实例可以通过以下两种方式之一访问互联网:

  • 没有弹性IP的实例可以通过NAT实例来路由其流量以访问互联网。这些实例使用NAT实例的弹性IP来遍历互联网。NAT实例允许出站通信但不会使互联网上的机器使用NAT来初始化与私有地址主机的连接。

您可以在此处找到有关设置NAT实例的详细说明:

http://docs.aws.amazon.com/zh_cn/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html

图片来源:https://istack.dev59.com/uCloS.webp


4

或者在公共VPC中创建一个NAT实例,并向该NAT实例添加静态路由

route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.0.0.5 eth0

其中10.0.0.5是您的NAT实例,请确保包含NAT实例的安全组可以接受来自需要访问互联网的服务器的内部流量


1
我也尝试过同样的方法,但它会破坏添加静态路由实例的元数据。元数据:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html 公共子网+弹性IP和私有子网+NAT实例是正确的选择。 - sayap

2
您可以在拥有EIP的VPC实例上执行此操作。我在这里描述了一些说明,应该会对您有所帮助。这里。顺便说一下:不要忘记禁用源/目标检查。

是的,实际上没有必要拥有专用的NAT实例。任何实例都可以扮演这个角色。 - Andrey Regentov

1

没有弹性公网IP的实例可以通过两种方式访问互联网。没有弹性公网IP的实例可以通过NAT实例路由其流量来访问互联网。这些实例使用NAT实例的弹性公网IP来遍历互联网。NAT实例允许出站通信,但不会启用互联网上的机器使用NAT主动连接到私有地址机器。

https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html


1
安全组 -> 出站流量
*   ALL Traffic ALL     ALL     0.0.0.0/0   Allow

请允许出站连接,如果您想连接到外部服务器,如google.com,甚至想更新-sudo apt-get update。
您可以使用AWS前端允许出站连接,转到安全组-> 出站。
确保为您的AWS实例选择正确的组。

2
不,这个问题是关于没有弹性IP的实例。 - Andrey Regentov

1
他们有一个相对较新的产品叫做NAT网关,可以创建一个托管的NAT实例在你的公共/私有子网的边缘,以实现这一点。

NAT实例和NAT网关的比较 - colllin

0
为了解决这个问题,需要禁用您配置为进行NAT的实例的“源/目标检查”。您可以在AWS控制台中的“实例操作”下完成此操作。 参考资料

1
如果您已经创建了NAT实例,那么用户是否已经完成此操作并不清楚。 - Craig Ringer

0

以下是我的解决方案:

  • VPC子网 172.20.0.0/16
  • EC2 “nat”网关 172.20.10.10 和 EIP

步骤如下:

  • 在“nat gw”上设置禁用源/目标检查
  • 创建一个新的“nat-sub”子网,例如:172.20.222.0/24
  • 将路由0.0.0.0/0修改为172.20.10.10(我的nat gw),“nat-sub”
  • 使用“nat-sub”创建一个EC2实例
  • 在你的nat网关上以root账户身份尝试以下操作:

root@gw:~# sysctl -q -w net.ipv4.ip_forward=1 net.ipv4.conf.eth0.send_redirects=0

root@gw:~# iptables -t nat -C POSTROUTING -o eth0 -s 172.20.222.0/24 -j MASQUERADE 2> /dev/null || iptables -t nat -A POSTROUTING -o eth0 -s 172.20.222.0/24 -j MASQUERADE

如果它能正常工作,就在 /etc/rc.local 中添加这两行代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接