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的访问权限