Virtual Private Cloud
VPC
定义
Virtual Private Cloud是AWS提供的一种从逻辑上分离且独立的网络单元(物理上不一定). 创建VPC的时候可以通过CIDR来指定VPC的大小(VPC内IP地址的数量 最大65535最小16). VPC还可以进一步划分成更小的逻辑单元 - Subnet. Subnet可以进一步分割VPC内的IP范围(Subnet的IP范围必须在VPC的IP范围之内).
可用组件
-
Subnet
-
Route Table
-
Security Group
-
ACL
-
NAT Gateway/Instance
-
IGW
-
CGW & VPG
-
Peering Connection
-
Endpoint
-
Elastic IP
-
Elastic Network Interface
Subnet
子网是VPC的基本组成部分,EC2实例实际上是运行在Subnet里而非直接运行在VPC上。
分类:
-
Public subnet - 所关联的route table中流量导向VPC的IGW
-
Private subnet - 所关联的route table中的流量没有导向到VPC的IGW
-
VPN only subnet - 所关联的route table中的流量导向到VGW
注意
-
一个Subnet必定所属一个AZ,且创建之后不能更换所属的AZ
-
一个Subnet必定至少关联到一个路由表,如果有没显示的关联,则隐式关联到VPC的主路由表.
-
子网的大小必须小于VPC的IP范围且大于等于/28(i.e: VPC CIDR - 10.0.0.0/16, 则Subnet的CIDR必须是10.0.X.X/17~28). NOTE: AWS会保留CIDR IP段的前4个IP和最后一个IP, 所以对于10.0.X.X/28实际可用的IP数量是16-5=11个IP地址
-
可以通过ACL来做子网级别的安全控制(入/出站规则)
-
默认VPC在所有的AZ都有一个规模为/20的子网
Route Table
一组所关联的子网的流量导向规则. 每条路由规则有2个字段destination和target. destination用来表示请求的最终目的地, target用来指定由谁来处理路由的下一跳.
下条路由规则的语义为: 子网内所有访问172.9.X.X的请求都经由IGW来处理
Destination | Target |
---|---|
172.9.0.0/16 | igw-id |
典型的Target
-
target=local的规则实现同一VPC内不同子网之间的通讯. (每个路由表都带有一个只读的规则 x.x.x.x/x - local).
-
target=IGW的规则实现了VPC外对于子网的访问,
-
target=NAT的规则实现了子网对于VPC外的访问
-
target=Peering Connection的规则实现了VPC和VPC之间的访问
-
target=VPG的规则实现了子网的VPN访问
-
target=endpoint的规则实现了子网对于相同region的其他AWS service的访问(目前仅支持S3切该调路由不是手动加入的)
注意
-
一个VPC在创建的时候会自动生成一个主路由表, 所有没有指定路由表的子网都会默认关联这个主路由表
-
你可以将自己创建的路由表设置为主路由表
-
路由表中的路由规则的优先级由规则的具体程度来决定(越具体优先级越高). 如下表中,规则2的优先级高于规则3,规则3高于规则1
Destination | Target |
---|---|
0.0.0.0/0 | igw-id |
172.9.1.0/24 | peer-connection-reject |
172.9.0.0/16 | peer-connection-approve |
Internet Gateway
IGW实现了VPC中的instance和Internet通讯. 在AWS的VPC中,即便一台instance被分配了public ip/eip也是无法被从VPC外访问到的.必须要往该instance所属的子网关联的路由中添加target=igw的路由才可以. 在通讯过程中IGW具体做了:
-
维护一个public ip-private ip的one-to-one的映射表
-
当具有public ip的instance试图从VPC内访问Internet, IGW负责将被访问端的reply的目标地址转换成instance的public ip。并
-
当VPC外的机器试图访问VPC内的具有public ip的instance的时候, IGW在请求到达VPC后将目标地址从public ip转换成private ip,最终到达instance.
EIP
Elastic IP是AWS对于某个region的IP资源池中的IP, 所以一个EIP是无法跨region的被其他资源(instance, nat gateway等)使用。并且EIP是分配到你的AWS Account的,所以不管一个EIP是否被使用,只要没有从你的Account里面释放出去都会被计费。
与Public IP的不同
-
EIP绑定到账户就计费,Public IP只有使用的时候才收费
-
EIP除非你释放了,否则一旦分配到Account就是稳定不变的. Public IP分配给Instance之后随着Instance关闭而释放,而且当instance重启之后,之前分配的Public IP会被重新分配
NAT Gateway/Instance
NAT在AWS中主要提供帮助私有子网访问internet的服务.(通过upnp协议实现). 本质上来讲无论NAT Gateway还是NAT Instance都是一个具有公有IP的实例(NAT Gateway只是从服务角度进行了封装),不过这个特殊的instance提供端口映射的服务,所有的内网主机对外发送的请求都经由NAT Gateway/Instance发出,NAT会给相应的内网主机随机分配一个端口号,然后请求再经过IGW进入Internet. 所有被访问服务器的返回地址都是NAT Gateway/Instance的公有IP和之前所分配的随机端口号。当response返回到NAT后,NAT再根据端口映射表找到相应的主机,转发返回的response.
NAT与IGW的不同
-
NAT只提供内网到外网的单项访问,IGW提供内网-外网的双向反问
-
路由到IGW的公有子网的instance需要有public ip/eip. 而和NAT关联的私有子网主机只需要私有ip
-
NAT必须绑定一个EIP, IGW不需要
NAT Gateway和NAT Instance的不同
注意
-
NAT Gateway必须所处公有子网中(如果NAT自己都访问不了外网如何帮私有子网的主机访问外网?)
-
私有子网所关联的路由必须将流量切到NAT Gateway
Peering Connection
Peer connection提供VPC之间的访问。在建立了Peer connection的2个VPC的主机上,可以直接通过private ip相互通讯。
注意
-
Peer connection不具备传递性,比如VPC A和VPC B建立了connection, VPC B和VPC C建立了connection, 但是VPC A和VPC C依旧无法相互访问
-
建立了Peer connection的2个VPC的IP范围不能有重叠(在建立了Peer connection以后如果VPC的ip范围重叠,就有可能一个ip代表2台主机)
-
建立了Peer connection之后必须同时更新2个VPC需要相互通信的子网的路由(requester和receiver的路由都要更新),将相互访问的CIDR指向peer connection - pcx-xxxxx. 例如VPC A 10.0.0.0/16和VPC B 192.168.0.0/16. 建立了peer connection,在VPC A和B的路由中需要分别添加一条
Destination | Target |
---|---|
192.168.0.0/16 | pcx-xxxx |
Destination | Target |
:-------- | :-------- |
10.0.0.0/16 | pcx-xxxx |
Security Group & ACL
SG和ACL都是用来保障你VPC的网络安全的。但是它们有一些区别
-
SG是作用于instance级别的访问控制,而ACL是Subnet级别的访问控制
-
SG是白名单性质的防火墙,你只能允许某些ip访问某些端口而不能拒绝。ACL可以显示的deny一些访问,也可以显示的approve一些访问
-
SG是有状态的,你不能分开控制SG的出站规则和入站规则。入站请求和出站请求会被同时approve.而ACL是无状态的,你可以对于同一个目标允许入站拒绝出站(或相反)
-
ACL的安全规则带有具备优先级属性的rule #,(rule #越小优先级越高)
-
一个instance可以关联多个SG, 但是一个Subnet同一时间仅能绑定一个ACL
Endpoint
Endpoint是用来建立你的VPC和同region的AWS其他service的内部通讯链路的。目前仅支持S3。当你建立了和S3的Endpoint之后,你的VPC内部访问S3的时候就不会通过广域网来进行访问,而且从AWS的内部网路进行访问。
注意
-
在建立了endpoint之后还需要同时更新路由表,保证相关service(destination)的请求经由endpoint(target)处理
-
你可以建立access policy来控制endpoint对service的访问权限