Amazon VPC (Virtual Private Cloud) 是AWS的网络基础设施。使用VPC服务可以在AWS中创建一个独立隔离的网络,在这个隔离的网络空间中可以创建任何AWS资源,例如EC2、Redis、RDS数据库等等,VPC网络使这些AWS资源互相连接,传递数据,并且提供外网访问的网关。
VPC和子网(Subnet)
当新建一个VPC,需要为虚拟网络定义IP地址范围作为CIDR地址,例如CIDR为10.1.0.0/16
。IPv4的CIDR可以手动指定,但是IPv6的CIDR只能由AWS自动分配。
CIDR(无类别域间路由,Classless Inter-Domain Routing)将IP地址按照前缀分成一组,使用一种无类别的域际路由选择算法,大大减少了路由表维护的条目数。
VPC的IP地址段可以进一步划分IP段,从而创建子网(Subnet)。一个VPC横跨多个可用区(Availability Zone),但是一个子网只能位于一个可用区里面。
创建EC2、RDS等AWS资源的时候,除了要选择VPC,还要选择创建到VPC的哪个子网里面。EC2会被自动分配一个所属子网IP段内的私有IP地址,如果想要分配公网IP地址,需要手动指定弹性IP,或者可以配置子网自动为EC2分配公网IP地址。如果想要让EC2被外网访问到,除了需要配置公网IP地址,还需要配置子网的路由表,使其可以通过VPC网关(Internet Gateway)访问外网。
Subnet是一个VPC里面一个IP段. 创建任何AWS资源的时候可以选择一个Subnet。
AWS 以前没有VPC,而是叫做EC2-Classic的网络。2013年之后就支持EC2-VPC了。 对于只支持VPC的新账户,会有一个Default VPC,并且在每个Availability Zone里面都有一个默认的Default Subnet,新账号就默认使用个VPC,而不用自己选择。当然也可以自己创建VPC。
Default VPC 里面默认配置了网关(Internet Gateway),而且配置好了到网关的路由,每个Default Subnet里面的EC2都默认分配私有IP和公网IP。因此Default Subnet里面的EC2都是可以外网访问的。
Internet Gateway和Route Table
VPC是一个独立的虚拟的网络,与AWS其它的VPC、与外网都是隔离开得。如果想要让外网访问VPC里面的EC2,必须通过网关(Internet Gateway)。网关是VPC连接外网的组件,可以为VPC分配多个网关,每个网关都有唯一的ID,例如igw-8727e8e2
。配置路由表的时候,网关ID作为路由表的目标地址(target)。
如果只想让instance主动访问外网,不想让外网主动访问instance。IPv4可以使用NAT,IPv6可以使用Egress-Only Internet Gateways。
VPC里面的Subnet都关联了一张路由表(Route Table),路由表定义了VPC网络里面的网络流量的传输路径。
每个VPC创建之后都自动配置了一个路由表,这种关联在VPC上的路由表叫做主路由表(Main Route Table)。主路由表不能删除,但是可以替换为别的路由表。 每个Subnet创建之后默认使用主路由表,但是可以为Subnet创建一个自定义路由表(Custom Route Table)来设置特定路由规则。自定义路由表可以删除,删除之后就使用VPC的主路由表。
e.g. 一个使用主路由表的例子
在上面这个例子中,VPC的网段为10.1.0.0/16
,里面有两个子网:10.1.1.0/24
和10.1.2.0/24
。这两个子网没有自定义路由表,因此都使用VPC的主路由表。
主路由表中有两条路由规则:
- destination为
10.1.0.0/16
表示VPC内部的流量,因为VPC网段下的所有IP地址都是10.1
开头。这些流量的target是local
,表示内部之间通信。 - destination为
0.0.0.0/0
表示访问外网IP的流量,这些流量通过target指定ID的Internet Gateway访问外网。
Security Group
安全组(Security Group)定义了防火墙规则,包括出站规则和入站规则,可以细化到哪个IP段可以访问哪个端口。