Posted in: Amazon VPC, Aws云上云维
AWS VPC
VPC
Virtual Private Cloud,你可以完全自訂這個網路裡面的subnet、ip range、routing table、gateway、security…等,當然也可以加EC2的instance進去。
VPC及相關resource的對應關係
- 一個Region可以有多個VPCs
- 一個VPC可跨多個AZs
- 一個AZ可以有多個subnets
- 一個subnet可以有多個instances
Subnet
是一段IP位址的範圍,aws的resource都可以擺在subnet裡面。一般會分為兩種:
- Public Subnet:可以連上Internet的叫做Public Subnet
- Private Subnet:沒辦法連上Internet的叫做Private Subnet
default VPC
如果你的region只有EC2-VPC而沒有EC2-Classic的話,在新增instance的時候就會有一個預設的VPC可以使用,並且有以下特性:
- 每一個instance都有一個public IP
- 網段預設為172.31.0.0/16,在新建instance的時候會自己切兩個subnet,分別為172.31.0.0/20及172.31.16.0/20。
nondefault VPC
如果想要自建私有雲,或是想客製化網路環境的話,可以自建VPC實作。 因為自建VPC並不提供Public IP,所以必須搭配EIP及NAT…等技術才能與Internet連線 。基本上有以下四種情境,其他的變型情境都可以用這四種來衍生。
- Public Subnet – 用來提供公眾型的應用服務幾乎都應該適用,可大大增加安全性,也能自定內部IP位置
- Public + Private Subnet – 有些用戶會想把DB Server等重要服務移至不能直接存取的區域,便可選此模式
- VPN + Public + Private Subnet – 就是上一個模式中加上一個Hardware VPN設備來與企業的VPN設備串接
- VPN + Private Subnet – 把AWS完全用來當做私有雲,一樣用Hardware VPN設備來與企業的VPN設備串接
常見使用情境
由於第三及第四種使用情境比較不符我們的使用方式,所以在此不深入研究,這邊只介紹第一及第二種情境。
Public Subnet
基礎元件
- VPC底層使用10.0.0.0/16的網段,可以提供65536個private IP
- 一個subnet,並且設定為10.0.0.0/24,這可以提供256個private IP。
- 一個Internet Gateway,這可以讓VPC連到Internet以及其他的AWS服務上面(例如S3)。
- 一個EC2 instance,這個instance必須要加到這個VPC裡面才能跟其他instance連線,並且啟用EIP,這樣子instance才有Public IP可以讓Internet連線。
- 一個route table,控制VPC裡面的所有resource要如何連線。
路由規則
Destination | Target | Description |
---|---|---|
10.0.0.0/16 | local | 表示所有連線到10.0.0.0/16網段的request,都要走local內網 |
0.0.0.0/0 | igw-xxxxxxxx | 表示所有連線到0.0.0.0/0網段的request,都要走到internet gateway,這樣才能連線到Internet |
安全規則
流入
Source | Protocol | Port Range | Comments |
---|---|---|---|
0.0.0.0/0 | TCP | 80 | 允許Internet可以讓所有HTTP連線連進來 |
0.0.0.0/0 | TCP | 443 | 允許Internet可以讓所有HTTPS連線連進來 |
x.x.x.x | TCP | 22 | 允許特定IP可以使用SSH連進來 |
流出
Destination | Protocol | Port Range | Comments |
---|---|---|---|
0.0.0.0/0 | TCP | 80 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
0.0.0.0/0 | TCP | 443 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
Public + Private Subnet
基礎元件
- VPC底層使用10.0.0.0/16的網段,可以提供65536個private IP
- 一個public subnet,並且設定為10.0.0.0/24,這可以提供256個private IP。
- 一個private subnet,並且設定為10.0.1.0/24,這可以提供256個private IP。
- 一個Internet Gateway,這可以讓VPC連到Internet以及其他的AWS服務上面(例如S3)。
- 將要對外的instance放在public subnet,例如web server;將不對外的instance放在private subnet,例如ap server和db server。
- 一個NAT的instance,讓private subnet的instance利用這個instance可以與internet連線,主要功能是拿來做系統更新用。使用VPC Wizard建立VPC時,AWS會自己新增一個m1.small的instance,並且使用的是amazon linux,而且也會自己新增一個EIP並綁在NAT instance上面。
- 兩個route table,分別控制VPC裡面public及private subnet的所有resource要如何連線。
路由規則
Public subnet
Destination | Target | Description |
---|---|---|
10.0.0.0/16 | local | 表示所有連線到10.0.0.0/16網段的request,都要走local內網 |
0.0.0.0/0 | igw-xxxxxxxx | 表示所有連線到0.0.0.0/0網段的request,都要走到internet gateway,這樣才能連線到Internet |
Private subnet
Destination | Target | Description |
---|---|---|
10.0.0.0/16 | local | 表示所有連線到10.0.0.0/16網段的request,都要走local內網 |
0.0.0.0/0 | eni-xxxxxxxx / i-xxxxxxxx | 表示所有連線到0.0.0.0/0網段的request,都要走到特定的網路介面(eni-xxxxxxxx)或NAT instance(i-xxxxxxxx),這樣才能透過Public subnet的NAT instance連線到Internet |
安全規則
WebServerSG
給Public subnet裡面的web server使用
流入 | |||
---|---|---|---|
Source | Protocol | Port Range | Comments |
0.0.0.0/0 | TCP | 80 | 允許Internet可以讓所有HTTP連線連進來 |
0.0.0.0/0 | TCP | 443 | 允許Internet可以讓所有HTTPS連線連進來 |
x.x.x.x | TCP | 22 | 允許特定IP可以使用SSH連進來 |
流出 | |||
Destination | Protocol | Port Range | Comments |
0.0.0.0/0 | TCP | 80 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
0.0.0.0/0 | TCP | 443 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
DBServerSG-id | TCP | 3306 | 允許套用這個rule的instance,可以直接連線到DB server(此處以MySQL為例) |
NATSG
給Public subnet裡面的NAT instance使用。
流入 | |||
---|---|---|---|
Source | Protocol | Port Range | Comments |
10.0.1.0/24 | TCP | 80 | 允許讓private subnet的HTTP連線連進來 |
10.0.1.0/24 | TCP | 443 | 允許讓private subnet的HTTPS連線連進來 |
x.x.x.x | TCP | 22 | 允許特定IP可以使用SSH連進來 |
流出 | |||
Destination | Protocol | Port Range | Comments |
0.0.0.0/0 | TCP | 80 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
0.0.0.0/0 | TCP | 443 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
DBServerSG
給Private subnet裡面的DB instance使用。
流入 | |||
---|---|---|---|
Source | Protocol | Port Range | Comments |
WebServerSG-id | TCP | 3306 | 允許public subnet可以用DB connection(此處以MySQL為例)連進來 |
流出 | |||
Destination | Protocol | Port Range | Comments |
0.0.0.0/0 | TCP | 80 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
0.0.0.0/0 | TCP | 443 | 允許套用這個rule的instance,可以直接連線到Internet,一般是拿來做系統更新用 |
實務上應用
- 因為DB server需要用SSH連進去維護,所以DBServerSG的inbound必須要增加SSH (10.0.0.0/24)。
- 因為public subnet預設沒辦法用SSH連到private subnet,所以WebServerSG及NATSG的outbound必須要增加SSH (10.0.1.0/24)。
- 因為預設的SSH連線方式都為ssh -i xxx.pem uuu@a.b.c.d。 用這方式會造成因為憑證在local端,沒辦法在public subnet用憑證登入private subnet的instance。所以解決方式之一為先調整private subnet的routing table,將0.0.0.0/0的routing暫時從NAT instance改為Internet Gateway,然後綁一個EIP在private subnet的instance上面。再用憑證+SSH登入後,修改sshd_config,改為用密碼登入。最後再移除EIP、還原routing table,這樣就可以在public subnet用密碼+SSH登入private subnet了。
Security
Security groups (SG)
安全群組,屬於instance level的安全管理機制,必須與EC2 instance綁在一起。在launch一個instance如果沒選擇sg時,AWS會自動將instance指定到一個預設的sg。
- 只支援ALLOW規則
- 無論規則如何,response connection為永遠ALLOW
Network access control lists (ACLs)
網路存取控制清單,屬於subnet level的安全管理機制,必須與subnet綁在一起。
- 支援ALLOW及DENY規則
- response connection會依照規則做控制
- 規則會依照rule number的順序做套用