AWS為用戶提供了一個虛擬的數(shù)據(jù)中心番捂,用戶可以將EC2 instance蹦哼、RDS(Amazon Relational Database Service)朵逝、EMR Clusters等資源部署到這個虛擬的數(shù)據(jù)中心淳蔼。不僅如此稚虎,這些資源還需要同internet進行通訊撤嫩。
Amazon VPC 允許用戶在 Amazon Web Services (AWS) 云中預(yù)置出一個邏輯隔離的部分偎捎,讓用戶在自己定義的虛擬網(wǎng)絡(luò)中啟動 AWS 資源蠢终。用戶可以完全掌控這個虛擬網(wǎng)絡(luò)環(huán)境,包括選擇自己的 IP 地址范圍茴她、創(chuàng)建子網(wǎng)以及配置路由表和網(wǎng)絡(luò)網(wǎng)關(guān)寻拂。
VPC 概念和基礎(chǔ)知識
IP 地址范圍
根據(jù)RFC 1918,為了解決IPV4地址將要耗盡和ISP(Internet Service Provider)路由負(fù)荷即將過載的問題丈牢,人們提出了一個方案:一個ISP從地址注冊組織獲得一個地址塊祭钉,然后根據(jù)每個客戶的要求將塊內(nèi)的地址分配給客戶。到許多客戶的路由將會被聚合起來,對其他服務(wù)提供商呈現(xiàn)為一個單一的路由己沛。
在企業(yè)內(nèi)部使用IP的主機在企業(yè)內(nèi)部無多義慌核,而根據(jù)其在企業(yè)之間是否可能有多義的IP地址距境,可以將主機分為“私有的”和“公開的”。
因特網(wǎng)域名分配組織IANA組織(Internet Assigned Numbers Authority)保留了以下三個IP地址塊用于私有網(wǎng)絡(luò)垮卓。
10.0.0.0 - 10.255.255.255 (10/8比特前綴)
172.16.0.0 - 172.31.255.255 (172.16/12比特前綴)
192.168.0.0 - 192.168.255.255 (192.168/16比特前綴)
我們把第一塊稱為“24-比特塊”垫桂,第二塊稱為“20-比特塊”,第三塊稱為“16-比特塊”注意(在前面的CIDR 記號中)粟按,第一塊地址就是一個A類網(wǎng)絡(luò)號诬滩,第二塊地址是16個連續(xù)的B類網(wǎng)絡(luò)號集合,第三塊地址是256個連續(xù)的C類網(wǎng)絡(luò)號集合灭将。
假設(shè)疼鸟,一個私有網(wǎng)絡(luò)172.31.0.0/16,那么可以將這個私有網(wǎng)絡(luò)的IP分為兩部分庙曙,“172.32”是網(wǎng)絡(luò)號空镜,后16位是主機號。這個私有網(wǎng)絡(luò)中的IP地址范圍不會和Internet中的IP沖突捌朴。但是姑裂,要盡量避免和其他VPC中的私有IP地址范圍產(chǎn)生沖突。
AWS推薦 /16 的IPv4 CIDR block(例如172.31.0.0/16)男旗。
在VPC中建立subnet
為每個AZ建立一個subnet舶斧,這樣,如果一個AZ的 subnet出現(xiàn)了問題察皇,就不會影響到其他subnet:172.32.0.0/24茴厉,172.32.0.1/24,172.32.0.2/24什荣。
Routing in a VPC
每個VPC都有一個route table矾缓,用于告訴系統(tǒng)如何對package進行路由。每個VPC都有一個default table稻爬,用于描述package如何在VPC內(nèi)部進行通訊嗜闻。用戶可以為subnet創(chuàng)建不同的route table。
VPC 內(nèi)部
通過default table完成
和Internet
和 internet 通訊的三要素:
- 某種形式的connection
- route to internet
- public address
從這張圖上可以看到桅锄,VPC是如何實現(xiàn)三要素的琉雳。
首先,VPC 通過 internet gateway和internet建立連接友瘤。在圖里是個“門”的形狀翠肘,不過最新的圖里面是這樣的圖標(biāo):
其次,VPC提供了兩個route表辫秧。一個是igw_id束倍,部署在共有subnet上,用與將目的地址不是本subnet的package發(fā)送到internet gateway,以實現(xiàn)同internet的通訊绪妹,該網(wǎng)關(guān)允許來自internet的請求甥桂;另一個route表是Nat_gw_id,部署在私有subnet上邮旷,指向NAT gateway格嘁,這是一張單向表,只允許從VPC內(nèi)部訪問internet的request(Outbound internet access)通過廊移,不允許internet到VPC內(nèi)部的request通過糕簿。這里為了讓私有subnet能夠和internet gateway 通訊,引入了一個新的網(wǎng)關(guān)狡孔,NAT gateway懂诗,其圖標(biāo)為:
最后,在launch上面的subnet的時候苗膝,為其制定了一個公有IP殃恒,即198.51.100.3。
網(wǎng)絡(luò)安全
Security Group(SG)
首先有一點值得強調(diào)辱揭,Security Group是Stateful
的离唐,如果一個入站(inbound)的traffic是被允許通過的,那么其對應(yīng)的出站(outbound)的response也必然被允許通過问窃。
具體來說亥鬓,在下圖中共有7個實例,其中4個被標(biāo)成了黃色域庇,表示需要和internet 通訊的web sever嵌戈;另外3個被標(biāo)成了藍色,表示不需要和外部通訊的backend server听皿。為黃色的實例建立Security Group MyWebServer
熟呛,為藍色的實例建立Security Group MyBackendServer
,這樣可以允許來自任意地址的traffic訪問MyWebServer
內(nèi)的實例尉姨,而只允許來自MyWebServer
訪問MyBackendServer
內(nèi)的實例庵朝。
Network Access Control List(NACL)
NACL也是VPC的一種安全機制,但是和Security Group 有一些不同之處:
Flow logs
在VPC中又厉,日志有以下幾種級別:
- instance level
- subnet level
- VPC level
如以下圖所示九府,VPC將日志信息發(fā)送到AWS 的 Bucket 和 Cloud Watch 組件上,進一步用于可視化馋没、問題排查昔逗、流量分析降传。這里篷朵,流量分析
僅涉及package的描述信息,而不涉及package的payload信息。
這里又多了三個新的圖標(biāo):
最后声旺,讓我們簡單看一下VPC flow logs的格式:
這條日志描述了以下信息:
接受從共有地址210.21.226.2的ssh入站package笔链。
Connectivity Options for VPCs
VPC主要涉及兩類連接:
- Connecting to other VPCs
-
Connecting to your on-premises networks
Connecting to other VPCs
VPC之間的連接有兩種形式,VPC peering 和 Transit gateway腮猖。
- 首先鉴扫,來看VPC peering。
VPC peering 是指在兩個VPC之間建立連接澈缺,使得他們之間可以相互通訊坪创,就好像在同一個私有網(wǎng)絡(luò)內(nèi)一樣。VPC Peering 可以跨AWS region姐赡,也可以跨 AWS 賬戶莱预。
VPC Peering 有其自身的局限性,它無法在兩個重疊的CIDR block間建立連接项滑。 而且它是1對1的關(guān)系依沮,也就是說下圖所示的關(guān)系是不可能的:
必須以以下方式建立連接:
- 接下來,再看 Transit gateway
在Peering模式下枪狂,必須在任意兩個VPC之間建立連接危喉。如果有很多VPC,這項工作將變得異常繁重州疾。這個時候辜限,就需要引入Transit Gateway 模式了。
Transit gateway 將多個VPC之間的連接關(guān)系集中管理严蓖,且這些VPC可以來自不同的賬戶列粪,盡管他們必須和Transit gateway在同一region。
- 比較 Peering 和 Transit gateway
Connect to on-premises networks
有兩種方法在 VPC 和 on-premises 之間建立網(wǎng)絡(luò)連接:AWS VPN 和 AWS Direct Connection谈飒。
AWS VPN
為了建立AWS VPN岂座,首先需要在 on_premise 端建立Customer gateway,并為其配置路由杭措;在VPC端费什,建立 Virtual private gateway。之后手素,為這兩個 gateway 建立兩個獨立的IPSec tunnel鸳址,之所以需要兩個IPSec tunnel,是為了保證通訊的高可用性(HA)泉懦。最后稿黍,如果沒有用動態(tài)的路由協(xié)議(例如 BGP),那么就需要更新VPC內(nèi)的路由表崩哩,告訴 VPC 如何到達on-premise巡球。
看起來不錯言沐,但是 AWS VPN 畢竟是運行在 internet 上的,有一定的不確定性酣栈,而 Direct Connect 就可以解決這個問題险胰。
Direct Connect
在AWS上,不僅有VPC矿筝,還有各種各樣的service起便,這些service是在VPC之外的。我們希望從on_premise訪問VPC的同時窖维,也能訪問到這些service榆综。為此,就需要 AWS Direct Connect Location 的幫助铸史。AWS Direct Connect Location 被發(fā)布到website上奖年,可以根據(jù)data center的位置就近選擇。這是一種物理上的專線沛贪,在On_Premise端陋守,建立private virtual interface(VLAN),用于訪問VPC利赋;同時建立一條public virtual(VLAN)水评,用于訪問service。
這里引入了兩個新的圖標(biāo):
在網(wǎng)上還找到了一張清楚些的圖媚送,以供參考:
多個VPC
也可以讓 On_Premise network 連接多個VPC:
一種方式是建立一個Private virtual interface (VLAN)中燥,然后通過Direct Gateway 同多個VPC建立連接:
另一種方式是通過AWS VPC。在沒有 transit gateway的時候塘偎,需要為每個VPC建立一個AWS VPC connection:
而有了 transit gateway 疗涉, 事情變得更加簡單,通過一個 transit gateway吟秩,就可以建立從 On_Premise 到所有VPCs的連接:
Route 53
AWS DNS
VPC endpoints
在VPC之外咱扣,AWS的公有地址空間內(nèi)還有很多服務(wù),我們可以通過direct connect 和 virtual interface涵防,從On_Premise network 去訪問這些資源闹伪。但是如何在VPC內(nèi)部訪問這些資源呢?可以通過 IGW, NAT devices的方式訪問壮池,但是如果你覺得那樣做比較麻煩(因為需要public IP)偏瓤,可以選擇 endpoint 的方式實現(xiàn)。
-
通過IGW 訪問
有兩種方式:gateway endpoint 和 interface endpoint椰憋。
gateway endpoint
在route table上厅克,可以配置一個指向AWS service的路由目標(biāo),這個gateway就是所謂的gateway endpoint橙依。這里沒有public IP证舟,只需要private IP 就可以完成設(shè)置硕旗。
interface endpoint
通過interface endpoint,不需要任何路由褪储,就你所訪問的AWS service好像在VPC內(nèi)部一樣卵渴。
這里慧域,有一個新的圖標(biāo)PrivateLink鲤竹。PrivateLink是interface endpoint得以實現(xiàn)的關(guān)鍵。通過PrivateLink昔榴,你可以將你的AWS Service 分享給千千萬萬個VPC辛藻。為此,你需要將被分享的Service放在一個 Network LoadBalancer 后面互订,使得該服務(wù)可以作為一個 endpoint service 被其他VPC訪問吱肌。其他的VPC可以訂閱你的Service,并在他的VPC創(chuàng)建endpoint代表你的Service仰禽,通過本地地址的endpoint訪問你的Service氮墨。
參考資料
AWS 2019 summit 視頻地址:https://aws.amazon.com/cn/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&vpc-blogs.sort-order=desc
演講者:Perry Wald and Tom Adamski
參考讀書筆記:https://blog.csdn.net/Jerry7810/article/details/103581167