前文中咱們講到了 AWS 的網絡環境 VPC,以及組成 VPC 的公有子網、私有子網。公有子網中的實例可直接與 Internet 通訊,而私有子網不能。公有子網和私有子網是如何劃分的呢?安全
AWS 中並無一個屬性來直接標識一個子網是公有子網仍是私有子網,那麼公有子網和私有子網由何而來?網絡
對此須要先了解三個概念:路由表,路由規則和 Internet 網關。設計
一個網絡中的網絡請求被髮起後,須要經過路由器來分發(路由)向目標。VPC 中就有這樣一個路由器,這個路由器在 VPC 建立時便自動內置在 VPC 中,它對於用戶不可見,由 AWS 來管理維護,用戶不能對它進行操做。這個路由器負責路由 VPC 內的全部網絡請求,包括 VPC 內部實例(機器)之間的網絡請求,以及進出 Internet 的網絡請求。cdn
VPC 路由器在路由網絡請求時,依據什麼來選擇網絡中的目標呢?答案是路由表。VPC 經過查找路由表中的配置,從匹配到的配置項中肯定目標,而後將網絡請求路由給這個目標。對象
每一個子網都須要關聯一張路由表,也就是綁定一張路由表。每一個新建立的 VPC 在初始狀況下,默認自帶一張路由表,這張路由表被稱爲主路由表。VPC 中的每一個子網在初始狀況下,會自動關聯到主路由表,這種自動關聯是隱式關聯。你也能夠本身建立路由表,而後將該路由表和子網關聯,這種關聯即是顯式關聯。blog
路由表中記錄着路由器的一系列網絡請求路由分發規則,而這個規則也就是路由表的路由規則。路由規則的格式是怎樣的,又是如何來定義呢?網絡安全
下圖是一個典型的路由表: 圖片
這張路由表中有兩條路由規則,每條路由規則有兩個主要的屬性:Destination 和 Target。Destination 表示一組目標 IP 範圍,它的值是 CIDR 塊;Target 表示路由的目標對象,它的值是一個 AWS 資源 ID。當路由器路由網絡請求時,會根據目標的 IP 來路由表中查找匹配的 IP 範圍(Destination),以後便將網絡請求路由給對應的目標對象(Target)。資源
以圖中的兩條路由規則爲例。路由
假設如今有一個發往 IP 172.31.1.1 的網絡請求,該 IP 正好處於第一條路由規則的目標範圍 172.31.0.0/16 之間,因此請求會被路由至 local。這個 local 是一個特殊的標識,表示當前這個 VPC,請求將會發給當前 VPC 內部的 172.31.1.1。
眼尖的你可能已經發現上面的例子中有點問題,其實 172.31.1.1 這個 IP 既能匹配 CIDR 172.31.0.0/16,也能匹配 0.0.0.0/0。是的,這裏其實有一個最長前綴匹配的原則,也就是說若是有多個目標範圍被匹配到,那麼只取其中範圍最小的那個。
假設又有一個發往 IP 220.181.57.216 的網絡請求,可知目標 IP 與第二條路由規則中的目標範圍 0.0.0.0/0 匹配,這個網絡請求將被路由至 igw-88bc90ec,igw- 開頭的這串字符是 AWS Internet 網關的 ID。
那麼 Internet 網關是什麼?網絡請求路由給 Internet 網關的意圖又是什麼?
VPC 中的網絡請求想要流出 VPC 到 Internet 中去,或者 Internet 中的網絡請求想要進入 VPC,這些都須要通過 Internet 網關處理和轉發。也就是說 Internet 網關是 VPC 和 Internet 之間通訊的入口。
在前面咱們提到例子中,發往 220.181.57.216 的網絡請求匹配了目標範圍 0.0.0.0/0,因此被路由至 igw-88bc90ec 這個 Internet 網關。也就是說這實際上是個與互聯網的通訊,數據包由 VPC 路由器路由至 Internet 網關,Internet 網關繼續轉發向 Internet 上的目標。
回到咱們最初的問題,公有子網和私有子網是如何劃分的呢?
公有子網和私有子網的區別在於,公有子網所關聯的路由表中配置有一條目標爲 Internet 網關的路由規則,而私有子網關聯的路由表中沒有。這就是公有子網和私有子網的惟一差異,以及它們被分類的依據。
私有子網關聯的路由表中沒有目標爲 Internet 網關的路由規則,是否意味着一個發往 Internet 的請求無法被路由,也就沒法跟互聯網通訊?是的,私有子網不能直接與 Internet 通訊。那私有子網中的實例(機器)想要作一些軟件更新,或者我想 SSH 登錄這些實例該怎麼辦?有沒有與 Internet 通訊的途徑?這個固然也是就有的。
私有子網與 Internet 的通訊有兩個方向:從 Internet 鏈接私有子網和從私有子網鏈接 Internet。這兩個方向的通訊都離不開公有子網的輔助。
想要從 Internet 鏈接到私有子網中的機器,咱們須要在同一 VPC 下的公有子網中安放一臺機器,這臺機器做爲堡壘機向私有子網中的機器轉發網絡請求。
若是是從私有子網中的機器鏈接到 Internet,可使用 NAT(Network Address Translation)網關,NAT 網關是 AWS 的一項服務,其須要被放置在公有子網中。建立出 NAT 網關後,咱們須要把 NAT 網關配置到這個私有子網所關聯的路由表中:
也就是圖片中的第二條路由規則,這裏將全部 Internet 的網絡請求路由給了 NAT 網關,以後 NAT 網關會緊接着轉發這個請求。NAT 網關轉發的網絡請求又根據公有子網的路由表規則路由給 Internet 網關,由 Internet 網關轉發向網絡目標。由此便實現了私有子網向 Internet 的通訊。
和 NAT 網關相似的還有 NAT 實例,它們不一樣的地方在於,NAT 實例建立後其背後的機器在 EC2(AWS 虛擬機服務)列表中是可見的,你甚至能夠同時將它做爲堡壘機來用,缺點在於該實例是單點的,沒法保證高可用。NAT 網關做爲 AWS 服務,其背後實例不可見,但 AWS 會爲此保證可用性。
公有子網直接暴露在 Internet 中,勢必會面臨網絡安全威脅。AWS 在子網這個層面設計了一層保護機制,稱之爲網絡 ACL。網絡 ACL 中能夠自定義一些網絡控制規則,這些規則用於控制流入或流出子網的網絡請求,能夠容許或拒絕某類數據包。
對於網絡 ACL 的細節這裏再也不贅述,除網絡 ACL 外也其它的網絡安全機制,其中使用最多的是機器層面的安全組,這個咱們將在以後的文章中介紹。
該系列文章可點擊個人頭像查看