2014/02/18

AWS VPC 設定教學

在 AWS VPC(Virtual Private Cloud) 介紹中列了四種 scenario,在此以 Scenario 2: VPC with Public and Private Subnets 為例來說明操作過程。
整個過程會建立 public, private 兩個 subnet,public subnet 用來放置對外服務的 instance 具有 public IP,如 web server。而 private subnet,只允許 VPC 內部存取,如 database。


Create VPC

1. 建立 VPC,指定 CIDR block 爲 10.0.0.0/16
Local IP 位址從 10.0.0.0 - 10.0.255.255 共 256*256 個 IP


2. 切兩個 subnet
Public subnet CIDR: 10.0.0.0/16,IP 從 10.0.0.0 - 10.0.0.255
Private subnet CIDR: 10.0.1.0/16,IP 從 10.0.1.0 - 10.0.1.255
預設所有在 VPC 底下任何 subnet 的 IP 都可以互通



Public Subnet

3. 建立 Internet Gateway 並 attach 到我們的 VPC,這樣才能把 VPC private network 與 Internet 接軌


4. 建立 route table for public subnet
新增一組 rule,把 0.0.0.0/0 導向 Internet Gateway
再來把此 route table 與 public subnet (10.0.0.0/24)關聯起來


5. 接著我們就可以把 instance 開在此 subnet 之下,為了後續 private subnet 可以連到 Internet,以下示範開啟一個 NAT instance
先建立 VPC instance,從 Community AMIs 找到 amzn-ami-vpc image,使用 micro 等級即可。指定所屬的 VPC 與 subnet
設定 NAT 的 private IP 爲 10.0.0.4 (optional)
一直下一步下一步,建立 security group 與 key pair。
架在 public subnet 表示要對外服務,security group 要特別設定 inbound rule

舉例來說,一個 HTTP server 可以建立 3 條 rule
a) 讓所有人可以存取 80 port
b) 內部 IP 可以任意存取
c) 只有特定外部 IP 能夠 SSH 進來

在此我們的 instance 只做 NAT 服務,只接受內部連線,至少要有一條 rule
Outbound rule 預設是 allow all

另外要記得 disable NAT instance 的 Source/Dest. Check



6. 再來申請一個 EIP 並且 bind 在 NAT instance 之上


7. 使用 SSH 連進去 instance
$ ssh -i YOUR_KEY_PAIR.pem ec2-user@YOUR_NAT_IP
ping google.com 也沒有問題

到此為止,我們已經建立一個 instance 在 VPC public subnet,可以從外部存取,也可以從內部連到 Internet


Private Subnet

8. 再來我們要建立另一組 route table 給 private subnet
把 default gateway 指向 NAT instance,也就是所有對外的封包都會先到 NAT
一樣 associate with private subnet (10.0.1.0/24)


9. 試著建立 instance 在 private subnet 內,
可以建立一個 security group for internal traffic
由於此 instance 不能從外部進來,要透過 public instance 當跳板。SSH 進去後一樣試試看能不能連到 Internet

Note

要從 instance 連到 Internet 只有兩種辦法:
 - Binding EIP 並且把 default gateway 指到 Internet gateway
 - 把 default gateway 指到 NAT instance,再由 NAT 轉到 Internet gateway

Security Group 是針對 instance 做設定
Network ACLs 是針對 subnet 做設定
以上兩種設定已經能滿足大部份的需求,就沒必要再去修改 iptable 了,改壞了自己進不去,AWS console 沒有這種問題。

* 或許有人會跟我有一樣的疑問,如果只開一個 subnet (10.0.0.0/16),所有 instance 放在裡面,要對外的再 bind public IP,這樣就不用分什麼 public/private subnet 了。問題就在於 VPC route table 的套用是以 subnet 為單位,而不是針對各個 instance 做設定,所以這個 subnet 只會有一個 gateway 就是 Internet gateway,但這樣只有 private IP 的 instance 就連不到 Internet了。除非你去改 linux 內部的 route table,把 gateway 指到 NAT server,不過會有改壞掉的風險,失去了 software defined network 的優勢。

Reference





1 則留言: