整個過程會建立 public, private 兩個 subnet,public subnet 用來放置對外服務的 instance 具有 public IP,如 web server。而 private subnet,只允許 VPC 內部存取,如 database。
Create VPC
1. 建立 VPC,指定 CIDR block 爲 10.0.0.0/16Local 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
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
- Overview of the Exercise - Amazon Virtual Private Cloud
- AWS VPC 心得 | clifflu 又架 blog 了 O.o/
- 近況 + 一點 AWS (VPC) 小心得
- Amazon Web Services Blog: Amazon VPC
- NAT Instances - Amazon Virtual Private Cloud
- High Availability for Amazon VPC NAT Instances: An Example : Articles & Tutorials : Amazon Web Services
subnet的CIDR應該是 /24,而不是 /16?
回覆刪除