无法通过 NAT 将 AWS VPC 私有实例连接到互联网

无法通过 NAT 将 AWS VPC 私有实例连接到互联网

尝试使用此处描述的方案 2 在 VPC 私有子网中的 aws 实例上安装 LAMP 堆栈
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario2.html

我已经设置好了相关子网、安全组、互联网网关和路由表。

通过我的设置,我可以成功:
- ping NAT
- ssh 到 NAT
- 从 NAT ping 外部网站(例如ping ietf.org
- 从 NAT ping 私有实例(例如ping 10.0.X.X
- ssh 到私有实例
- 从私有实例 ping NAT

但是我无法从私有实例 ping 通互联网(即ping ietf.org不起作用)
并且当我sudo yum update从私有实例尝试时出现以下错误:
Cannot find a valid baseurl for repo: amzn-main/latest

我认为这是一个路由错误或安全组错误......?

笔记:
- NAT 实例的源/目标检查已禁用
- NAT 实例已分配公共 IP,但没有弹性 IP
- 未实施 ACL(保留为默认值)
- 公共子网的路由表:

10.0.X.X/XX local  
0.0.0.0/0 internet gateway

- 私有子网的路由表:

10.0.X.X/XX local  
0.0.0.0/0 nat instance

- 安全组如下:

私有实例入站

ALL Traffic =  vpc_private_sg    
SSH(22) = vps_nat_sg  
MySQL(3306) = vpc_public_sg  
ALL ICMP = 0.0.0.0/0  

私有实例出站

SSH(22) = vps_nat_sg  
HTTP(80) = 0.0.0.0/0  
HTTPS(443) = 0.0.0.0/0  
ALL ICMP = 0.0.0.0/0  

NAT 实例入站

ALL Traffic =  vpc_private_sg    
SSH(22) = vps_nat_sg  
SSH(22) = 10.0.X.X/XX  
HTTP(80) = 10.0.X.X/XX  
HTTPS(443) = 10.0.X.X/XX  
ALL ICMP = 0.0.0.0/0  

NAT 实例出站

SSH(22) = 10.0.X.X/XX  
HTTP(80) = 0.0.0.0/0  
HTTPS(443) = 0.0.0.0/0  
ALL ICMP = 0.0.0.0/0  

答案1

问题:

标准 AMI 实例无法作为 NAT 实例正常工作

如果您尝试使用标准 AMI 实例作为 NAT 实例,它将具有与上述问题中描述的相同的症状:

  • SSH 连接到 NAT = OK
  • SSH 连接到私有子网实例 = 正常
  • 对私有子网实例执行 ping 操作 = 正常
  • 私有子网实例出站调用 = 失败(即使有有效的路由表/安全组)

困难的解决方案:

要使标准 AMI 实例作为 NAT 实例运行,您需要对其进行自定义:

  • 修改 iptables,如图所示这里
  • 确保已启用 IPv4 转发,并且已禁用 ICMP 重定向这里

简单的解决方案:

使用社区amzn-ami-vpc-nat实例已配置为用作 NAT 实例

对于大多数人(使用 NAT 实例进行管理连接目的)来说,定制的 NAT 实例根本就没有必要。

AWS 提供为 NAT 使用而配置的标准实例(即如上所述进行修改)作为社区 AMI 实例。

  • 单击Launch InstanceEC2 控制面板
  • 点击左侧的选择Step 1: Choose an Amazon Machine Image (AMI)Community AMIs
  • 在搜索输入框中输入amzn-ami-vpc-nat 2017或更简单的内容(见下文)nat 2017
  • 启动 NAT 并确保路由表 + 安全组正确 - 请参阅这里

注意:
在社区 AMI 实例搜索中包含年份的原因是 AWS 保留了所有旧的 NAT AMI 版本(撰写本文时为 21 个,可追溯到 2013 年) - 其中大部分在版本号中包含年份
...最好/最简单的方法是选择最新版本。

相关内容