写在前面~~
在这之前推一个在写文章的时候找到的好资料,点击图中的图标还有详细的描述哦。
https://lucid.app/lucidchart/703f6119-4838-4bbb-bc7e-be2fb75e89e5/view?page=eNbqbEM6f5NI#
1.VPC(Virtual Private Cloud)是什么
可以简单地理解为一个VPC就是一个虚拟的数据中心,在这个虚拟数据中心内我们可以创建不同的子网(公有网络和私有网络),搭建我们的网页服务器,应用服务器,数据库服务器等等服务。
如下图所示,互联网的流量想进到VPC里来时,首先就需要经过Internet Gateway,然后再通过与Internet Gateway绑定的路由表来转发到对应的子网(subnet),每个子网有不同的NACL(Network Access Control List),通过这些NACL来判断流量是否被允许进入,最后转发到对应的机器上。上述的一些概念我们会在下面一一介绍。
需要注意的是:
VPC内可以创建多个子网,一个VPC可以跨越多个可用区(AZ)
一个路由表可以对应多个子网,
每一个子网上可以分配自己规划的IP地址,我们可以在选择的子网上启动EC2实例,一个子网只能在一个可用区(AZ)内
创建一个Internet Gateway并且绑定到VPC上,让EC2实例可以访问互联网
安全组(Security Group)用来针对实例
网络控制列表(Network Access Control List)用来针对子网
-
安全组(Security Group)是有状态的,而网络控制列表(Network Access Control List)是无状态的
有状态:如果入向流量被允许,则出向的响应流量会被自动允许
无状态:入向规则和出向规则需要分别单独配置,互不影响
2.互联网网关(Internet gateway)
互联网网关是一种横向扩展、支持冗余且高度可用的 VPC 组件,可实现 VPC 与互联网之间的通信。
3.路由表(route table)
我们的 VPC 中的每个子网必须与一个路由表关联,而一个路由表可以关联多个子网,路由表用来控制子网的路由。
一个VPC下只能有一个主路由表,当一个子网没有显式地与路由表关联时,它默认会隐式地与主路由表关联。
路由表中的路由可以指向很多目标,比如下图,我们可以指定0.0.0.0/0,目标为Internet Gateway,这表示所有指向互联网的流量都转发到Internet Gateway上,当然我们也可以指定其他的AWS 服务,如下图选项所示。
local表示一个用于在 VPC 内部通信的本地路由,比如同一个VPC下且配置了这个路由表的EC2要跟另一台EC2通信,就可以通过这个来转发而不用走互联网。
4.子网(subnet)
我们需要在指定的VPC下指定子网,如下图,每个VPC有关联的CIDR,意味着我们在这个VPC下,可以分配给该VPC下服务这个范围内的IP地址,这一部分算是计算机网络基础就不在此赘述,简单的介绍可以看下面两个链接。
需要注意的是VPC下的子网CIDR范围不能超过VPC的CIDR大小,且子网的IPv4 块的大小必须介于 /16 网络掩码和 /28 网络掩码之间。
CIDR介绍
CIDR计算
4.1如何区分私有子网和公共子网?
公共子网指的是该子网绑定的路由表中,0.0.0.0/0指向的目标可以直接访问互联网,比如指向一个Internet gateway,那么这个子网就是一个公共子网。
相对的,0.0.0.0/0指向的目标不能直接访问互联网,比如这个子网的路由表没有配置0.0.0.0/0,或者只能间接地访问互联网,比如0.0.0.0/0指向的是NAT Gateway/Instance, 那么这个子网就是私有子网。
5.弹性IP(Elastic IP)
这个概念在EC2一章已经介绍过啦,今天再来复习一遍。
默认情况下,AWS分配的公网IP地址都是浮动的,这意味着如果关闭再启动EC2实例,这个地址也会被释放并且重新分配。但是弹性IP地址是和我们的AWS账号绑定的,除非手动释放掉这个地址,否则这个地址可以一直拥有这个账号。
6.终端节点(Endpoints)
终端节点(Endpoints)是虚拟设备,它是以能够自动水平扩展、高度冗余、高度可用的VPC组件设计而成,不需要为它的带宽限制和故障而有任何担忧。
接口终端节点由 PrivateLink 提供支持,它使用弹性网络接口 (ENI) 作为发往服务的流量的入口点。 网关终端节点充当路由表中路由的目标,用于处理以服务为目标的流量。 网关仅支持Amazon S3 和Dynamo DB
VPC终端节点能建立VPC和一些AWS服务之间的高速、私密的“专线”。这个专线叫做PrivateLink,使用了这个技术,你无需再使用Internet网关、NAT网关、VPN或AWS Direct Connect连接就可以访问到一些AWS资源了!
举个例子:VPC内的服务(比如EC2)需要访问S3的资源,只需要通过VPC终端节点和更改路由表,就可以通过AWS内网访问到这些服务。在这个情况下,VPC内的服务(EC2)甚至不需要连接任何外网。如下图所示
7.NAT网关/实例
NAT的全程是“Network Address Translation”,中文解释是“网络地址转换”,它可以让整个机构只使用一个公有的IP地址出现在Internet上。
NAT是一种把内部私有地址(192.168.1.x,10.x.x.x等)转换为Internet公有地址的协议,它一定程度上解决了公网地址不足的问题。
7.1 NAT Instance
在实际的场景下,我们经常需要将数据库、EC2放到私网,但是实例中的服务又必须要访问互联网,这个时候NAT Instance就可以帮我们解决这个问题,以私有子网内的EC2请求互联网为例,我们的请求会被先被路由表路由到公共子网内的NAT Instance中,然后通过NAT Instance服务来访问互联网。
每项 EC2 实例都会默认执行源/目标检查。这意味着实例必须为其发送或接收的数据流的源头或目标。但是,NAT 实例必须能够在源或目标并非其本身时发送和接收数据流。因此,创建NAT实例之后,一定要关闭源/目标检查(Source/Destination Check)
NAT实例需要创建在公有子网内
私有子网需要创建一条默认路由(0.0.0.0/0),指到NAT实例
NAT实例的瓶颈在于实例的大小,需要自己创建弹性伸缩组(Auto Scaling Group),自定义脚本来达到NAT实例的高可用(比如部署在多个可用区)
-
我们更推荐使用NAT Gateway的形式来实现功能,如果我们真的想要使用NAT Instance,可以在社区AMI来搜索它。
7.2 NAT Gateway
当我们使用,就不用再创建NAT Instance了,也就没有实例大小的烦恼,NAT Gateway会自动扩容。
NAT Gateway需要关联到公共子网,它自动分配一个公网IP地址(EIP)
私有子网需要创建一条默认路由(0.0.0.0/0)到NAT网关
不需要更改源/目标检查(Source/Destination Check)
7.3 堡垒机
堡垒机(Bastion Host)又叫做跳板机(Jump Box),主要用于运维人员远程登陆服务器的集中管理。运维人员首先登陆到这台堡垒机(公网),然后再通过堡垒机管理位于内网的所有服务器。
需要与NAT Instance区分,私有子网中的流量会发送到NAT Instance里,而堡垒机只是用来登录、管理。
8. 对等连接(Peering)和Transit Gateway
8.1 Peering Connect
VPC对等连接(VPC Peering)是两个VPC之间的连接,通过VPC Peering,我们就可以使用私有地址让两个VPC之间相互通信,就像它们在同一个VPC内一样。
我们可以给自己、其他AWS账号的VPC、不同区域的VPC来建立Peering Connect.
如下图所示,VPC A和VPC B之间建立了对等连接,那么VPC A中网段10.0.0.0/16内的实例就可以和VPC B中网段172.31.0.0/16内的实例进行互相通信,仿佛它们是处于同一个内网一样。
如果两个VPC出现了地址覆盖/重复,那么这两个VPC不能做Peering
例如10.0.0.0/16的VPC与10.0.0.0/24的VPC是不能做对等连接的
-
VPC Peering没有传递性
即如果VPC A与VPC B进行了对等连接
VPC B与VPC C进行了对等连接
VPC A是不能与VPC C进行直接通信的,必须再建立VPC A和VPC C的对等连接才可以
8.2 Transit Gateway
我们先来看一个情况,当我们需要创建多个VPC之间的连接时,需要非常多的Peering,Transit Gateway就是为了解决这一个问题。
需要注意的是,Transit Gateway 需要保证所有的VPC在一个region下面。
通过Transit Gateway,我们就可以简单地来管理多个VPC啦。
9.Network ACLs与Security Group
在你的默认VPC内会有一个默认的网络ACL(NACL),它会允许所有入向和出向的流量
对于所有VPC内的子网,每一个子网都需要关联一个网络ACL。如果没有关联任何网络ACL,那么子网会关联默认的网络ACL
一个网络ACL可以关联多个子网,但一个子网只能关联一个网络ACL
网络ACL包含了一系列(允许或拒绝)的规则,网络ACL会按顺序执行,一旦匹配就结束,不会再继续往下匹配
网络ACL有入向和出向的规则,每一条规则都可以配置允许或者拒绝, 还记得我们的安全组吗,它只支持显式的允许。
-
网络ACL是无状态的(安全组是有状态的)
被允许的入向流量的响应流量必须被精准的出向规则所允许(反之亦然)
一般至少需要允许临时端口(TCP 1024-65535)
临时端口
对客户端来说,每次发起 TCP 连接请求时,都需要分配一个空闲的本地端口(临时端口),去连接远端的服务器。由于这个本地端口是独占的,所以客户端最多只能发起 65535 个连接。
对服务器端来说,其通常监听在固定端口上(比如 80 端口),等待客户端的连接。根据五元组(源IP地址、目的IP地址、协议号、源端口、目的端口)结构,我们知道,客户端的 IP 和端口都是可变的。如果不考虑 IP 地址分类以及资源限制,服务器端的理论最大连接数,可以达到 2 的 48 次方(IP 为 32 位,端口号为 16 位),远大于 65535。
所以,综合来看,客户端最大支持 65535 个连接,而服务器端可支持的连接数是海量的。