AWS網路規劃系列 — 如何建立安全的VPC環境

Tony Lin
12 min readMay 22, 2018

利用工作之餘,分享使用AWS的心得,由於服務的多是B2B的案例,所以整體的Use Cases會從帶領開發團隊進行中大型專案的角度介紹,此系列網路規劃文章的目標,是透過說明如何使用AWS服務規劃解決方案的網路架構,來解釋IT架構師從傳統On-premise應用專案轉型雲端應用專案可能面臨的問題及解法。

從雲端環境網路架構規劃角度出發,若要規劃公有雲上的解決方案,首要的要求就是: 如何規劃一個安全的網路架構,讓開發團隊可以順暢工作之外,同時也確保雲端的服務和資源,不會被任意的存取。

本文會採用一個稍微簡化的範例,但有涵蓋到上線環境部署的核心精神,請參考下方AWS部署架構圖。本文將會介紹,如何在AWS中,部署一個單一Region、多個獨立VPC、跨Availability Zones(AZs)、 區分Public/Private Subnet、可連接Internet、透過Amazon WorkSpaces(全代管服務)才能Access的安全VPC環境。

AWS 部署架構圖

仔細分析上圖的結構後,可以拆解成以下不同的AWS Networking Resources,包含:

  1. VPC (Virtual Private Cloud): 在實務上我們會將需要獨立的環境(網段),用VPC區隔開來。例如: vpc-sit、vpc-uat、vpc-prod、vit-workspace,本篇文章將以workspace和sit二個vpc為例來說明。
  2. Subnet : Subnet就是在VPC的網段下,再細分不同的子網段。Subnet可區分為Public、Private和Vpn-Only三種,在subnet的Route Table中,能將流量route到Internet Gateway的屬於Public Subnet;如果只能將流量route到Virtual Private Gateway就是Vpn-Only Subnet; 否則就是Private Subnet。
  3. Internet Gateway : Internet Gateway可以attach在vpc上,為該vpc提供向外access internet的能力。
  4. NAT Gateway : NAT Gateway扮演了讓Private Subnet可以透過Net Address Translation間接向外訪問Internet的能力;也就是Source NAT。
  5. Route Tables : 每個subnet都有一個Route Table,來決定Traffics的流向。
  6. Peering Connection : 二個獨立的VPC之間,若需要互相溝通,則需要建立Peering Connection,在本文的範例中,將用來打通vpc-workspace和vpc-sit之間的流量。
    註:Amazon WorkSpaces 和 Directory Services的部分,由於是另一個收Amazon全代管服務,請參考海爸的另一篇文章 使用Amazon WorkSpaces連接VPC內的Private EC2 Instances

VPC

首先,要決定你未來所有的Resource要部署在哪一個AWS Region,我們以US West (Oregon)為例。小提示:在AWS Management Console中,右上角選到哪一個Region,就代表建立的Resource會在目前的Region建立。

在VPC Dashboard > Your VPCs中,點選Create VPC。題外話,海爸工作的習慣,會用一個Excel來整理需要的所有資源名字(Name Tag)和設定 (如: IPv4 CIDR block),也易於和客戶溝通所有的細節。

Create VPC 選項

我們從建立VPC開始,在此次的範例中,我們僅需要vpc-workspace和vpc-sit即可,下方的vpc-uat可以不必創建,在此列出是為了體現可以將uat或未來的production環境用vpc進行隔離。

  • vpc-workspace : CIDR 9.0.10.0/24
  • vpc-sit : CIDR 9.0.3.0/24
  • vpc-uat : CIDR 9.0.2.0/24
海爸註: CIDR指的是Classless Inter-Domain Routing由<IPv4 Address>/<Mask Bits>組成,如果不是很熟悉,請讀者Google查詢他的意義,這個對你如何有效切分VPC內的IP位址,和未來可以Auto Scaling的擴展性有關。CIDR的正式定義可以查閱 RFC4632 (https://tools.ietf.org/html/rfc4632)。
vpc-workspace and vpc-sit

Subnet

在VPC Dashboard > Subnets中,點選Create Subnet。

建立四個Subnet :

  • subnet-workspace-1 : CIDR 9.0.10.0/26
  • subnet-workspace-2 : CIDR 9.0.10.64/26
  • subnet-sit-1 : CIDR 9.0.3.0/26
  • subnet-sit-2 : CIDR 9.0.3.64/26
subnets within vpc-workspace and vpc-sit
<關於VPC和Subnet的關係,可以參考以下AWS文件說明>
A VPC spans all the Availability Zones in the region. After creating a VPC, you can add one or more subnets in each Availability Zone. When you create a subnet, you specify the CIDR block for the subnet, which is a subset of the VPC CIDR block. Each subnet must reside entirely within one Availability Zone and cannot span zones. Availability Zones are distinct locations that are engineered to be isolated from failures in other Availability Zones. By launching instances in separate Availability Zones, you can protect your applications from the failure of a single location. We assign a unique ID to each subnet.
海爸帶你潛水5米:subnet CIDR一定會是vpc CIDR的子集,所以在規劃vpc的CIDR時就要預估未來的subnet可能會需有多少的IPv4的地址。一般來說,會使用Class A (10.0.0.0/8), Class B (172.16.0.0/12)及 Class C (192.168.0.0/16)的Private IPv4 address spaces。但如果你的客戶是自己有Intranet或者採用Hybrid Cloud的話,在打Site-to-Site VPN時就容易遇到Private IP Address衝突的問題。舉例來說,在雲上的vpc你採用的是10.x.x.x的網段,而客戶的Intranet也是採用10.x.x.x的網段,若同時有二台機器都使用的10.0.0.1的IP,那對10.0.0.1的封包要路由到雲上的機器或是Intranet的機器呢?解決方法有很多,一般可以採用雙邊NAT,將重複使用的小部分網段,對映到Class B 或 Class C的Private IP Address即可解決,但如果重複的網段太過零散或分散,對網管來說就是一個沈重的負擔,所有的AP開發團隊也會需要額外留心,海爸自己是開發AP出身的,所以很了解AP開發團隊與網管之間的溝通成本。若你客戶的Intranet,採用的是10.x.x.x/8做為Intranet內的IP地址,因此在雲上的vpc若可改用其它的IP範圍,例如9.x.x.x,可以省去不少的麻煩。

Internet Gateway

在VPC Dashboard > Internet Gateways中,點選Create Internet Gateway。

Create Internet Gateway 選項

建立一個Internet Gateway:

  • internet-gateway-workspace 並且設定attach 到vpc-workspace

NAT Gateway

在VPC Dashboard > NAT Gateways中,點選Create NAT Gateway。選擇位於vpc-workspace中的subnet-workspace-2,並為NAT Gateway配上一個EIP (Elastic IP)

Create NAT Gateway 選項
Create NAT Gateway成功後的訊息

Route Tables

在VPC Dashboard > Routes Tables,你己經可以看到AWS己經為你的每個VPC建立了預設的Route Table。

講到這裡,請讀者回頭看文章開頭的AWS 部署架構圖,可以發現在vpc-workspace中有一個router,我們準備要設定的route table就是要告訴這個router要如何路由來自各個subnet的流量。

在AWS的概念裡,每個subnet都會有一個Route Table,如果沒有特別定義,AWS就會使用該VPC預設的Route Table,因此預設的設定就是同一個VPC底下的Subnet會共用同一份Route Table。

vpc-workspace內的二個subnets預設共用了同一個main route

但是我們想要達成的目標是subnet-workspace-1是Public Subnet,subnet-workspace-2是Private Subnet,現在就讓我們來修改Route Table看看。首先將各vpc預設的main route 取名如下:

接著在VPC Dashboard > Routes Tables,點選Create Route Table,並取名為route-workspace-2。

Create route-workspace-2 under vpc-workspace
點選route-workspace-1,點選Subnet Associations,然點選Edit
勾選subnet-workspace-1後按Save

請重複相同的動作,將subnet-workspace-2 associate到route-workspace-2。結果如下:

Explicitly Associated With 1 Subnet Respectively

最後,將route-workspace-1及route-workspace-2的Routes分別修改如下:

設定 route-workspace-1
設定 route-workspace-2

我們就來測試看看是不是可以連到Intenet了! 因為海爸己經建好了一個Amazon Workspace環境,位於vpc-workspace內,所以有環境可以立馬測試,如果想進一步知道怎麼使用Amazon Workspace,可以參考使用Amazon WorkSpaces連接VPC內的Private EC2 Instances。打開Firebox,直連https://www.whatismyip.com,結果如下:

Public IP, Private IP and ISP

延伸閱讀

--

--

Tony Lin

Enterprise Architecture | Application Architecture | Data Architecture