私有子网的机器访问公网有两种方式,一种是通过nat gateway
,另一种是通过nat instance
。
本节我们将通过NAT instance
的方式,让私有子网的机器能够访问公网。我们将在公有子网里创建一台NAT Instance
:
进入EC2页面,点击Launch Instance
。
命名为my-nat-instance
, NAT Instance
需要使用特定的AMI,搜索nat
关键字:
选择社区里第一个nat
AMI:
创建一个密钥对,并使用它做为EC2连接的密钥。
在网络设置部分,点击Edit
:
我们需要将NAT Instance
部署在公有子网my-subnet-01
:
在安全组配置的部分,增加一条新的规则,允许私有子网VPC的机器使用ICMP协议访问该实例 :
上图应该是
10.100.1.0/16
注意ICMP协议和TCP协议不同!我们将后面将基于ping命令来测试网络的连通性
其他选项保持默认,点击创建机器。
创建完成后,需要修改source/destination check
:
禁用源/目的地检查
:
创建新的一台实例,命名为my-private-subnet-instance
编辑网络设置,将其部署在私有子网my-subnet-02
:
其他选项保持默认,点击创建。
创建完成后,复制下来这台私有子网机器的IP:
从控制台获取NAT Instance
的公网IP,登录到NAT Instance
:
ssh -i keypair1.pem ec2-user@35.89.190.245
将私网机器登录的密钥复制到上面:
[ec2-user@ip-10-100-0-171 ~]$ vi keypair1.pem
[ec2-user@ip-10-100-0-171 ~]$ chmod 400 keypair1.pem
在NAT Instance
登录到私有子网的机器,执行Ping命令:
此时能Ping通,因为上一节我们为私有子网创建的路由创建了一条规则,0.0.0.0/0
-> NAT Gateay
。
我们把上一节创建的NAT Gateway
删除掉:
删除NAT Gateway
大概需要两分钟。
删除完成后,查看私有子网的路由表,发现此时到Nat gateway
的路由状态变成blackhole
:
在实例上执行Ping命令,此时到公网的流量不能出去:
重新编辑私有子网的路由表,将0.0.0.0/0
的流量送往NAT Instance
:
更新完成后。此时到公网的流量被送到NAT Instance
的ENI:
在私有子网的实例上执行Ping命令,可以Ping通公网:
此时私有子网的流量流向为私有子网EC2 -> NAT Instance(公有子网) -> IGW -> baidu.com
因为私有子网的机器和NAT Instance
中间流量要经过网关。例如下图中私有子网的实例10.1.1.23
要经过网关10.1.1.1
,如果不禁用,NAT instance
就不能将包发往10.1.1.23
: