準備環境
開啟 Cloud Shell,看一下它是什麼 OS ?
cat /etc/os-release
看來是 Debian,因為這篇是要設定網路組態,需要用到 ping 指令,先執行如下指令安裝:
sudo apt install iputils-ping
進入主題前,先了解以下基本觀念:
VPC (Virtual Private Cloud) 在 GCP 中是彼此隔離的。
每個 Google Cloud project 建立時,系統會自動建立一個預設的 subnet 網路。
Create network
VPC 分兩種模式 (mode): auto、custom。
在同一個 project 裡,VPC 名稱不能重複。
每個 project 可以有四個 VPC
建立一個 custom 模式的網路,指令如下,網路命名為 labnet。
gcloud compute networks create labnet --subnet-mode=custom
上面的指令說明如下:
gcloud: 調用 Cloud SDK 裡的 gcloud 命令
compute: gcloud 指令集之一
network: compute 的指令集之一
create: 執行的動作
labnet: 網路名稱
--subnet-mode=custom: 指定要建立的網路模式為 custom
點選 Google Cloud Console 左邊選單「網路 > 虛擬私有雲網路 > 虛擬私有雲網路」
顯示出如下畫面,確實建立了一個名稱為 labnet 的 Network。
Create a subnetwork一個 project 可以跨好幾個 region
subnetwork 的名稱在同一個 project 的同一個 region 裡不能重複
subnetwork 的名稱在同一個 project 可在不同 region 出現兩次
每個 subnetwork 要設定一個 IP 網段,這個網段在同一 project 的同一 region 中不可與其它 subnetwork 衝突。
建立 subnetwork 指令如下:
gcloud compute networks subnets create labnet-sub --network labnet --region asia-east1 --range 10.0.0.0/28
這個 subnetwork 的 IP 範圍會是 10.0.0.0 ~ 10.0.0.255
Viewing networks
gcloud compute networks list
顯示出共有兩個網路,一個 default、一個 labnet,與從控制台的「虛擬私有網路」看到是一樣的,要看網路的詳細資料,指令如下:
gcloud compute networks describe labnet
最後一個參數是網路名稱,這裡查看剛剛新建立的 labnet,得到如下結果:
List subnets
gcloud compute networks subnets list
如上指令查看 subnets,得到的結果非常多,找到 labnet-sub 的 subnetwork,內容如下:
內容太多不好找,可以執加過濾條件,如下,只會列出在台灣彰濱機房的 subnetwork。
gcloud compute networks subnets list --filter=“REGION: asis-east1”
Creating firewall rules
network 的模式 (mode) 為 custom
時,系統不會預設建立任何防火牆規則。
防火牆規則是定義在 network 層。
防火牆規則的名稱,在同一個 project 中不可重複。
gcloud compute firewall-rules create labnet-allow-internal --network=labnet --action=ALLOW --rules=icmp,tcp:22 --source-ranges=0.0.0.0/0
上面指令為 network labnet 建立了一條防火牆規則,名為 labnet-allow-internal,允許通過 icmp 及 tcp:22 port,連線來源不設限,說明如下:
firewall-rules: compute 指令的子類別
create: 這次指令要做的事 (動詞)
labnet-allow-internal: 防火牆規則名稱
--network=labnet: 指出這個防火牆規則要套用到那個 network
--action: 有兩個值 ALLOW (允許)、DENY (拒絕),這裡是要開通防火牆,所以用 ALLOW。
--rule=icmp,tcp:22 : 指出要開通的通訊協定 (icmp、tcp) 和 port (22)。
--srouce-ranges=0.0.0.0/0: 規定來源 IP 的範圍
Viewing firewall rules details
gcloud compute firewall-rules describe [FIREWALL_RULE_NAME]
這個指令可以查看防火牆規則的細節,執行後產生的結果如下:
從上面的細節內容 direction: INGRESS
,可以看出來,開通的這個防火牆是單向的,只允許由外向內。
Create another network
gcloud compute networks create privatenet --subnet-mode=custom
上面指令,會建立一個名稱為 privatenet 的 network,其 mode=custom,執行結果如下圖,訊息顯示,這個時候這個 network 還沒有套用任何防火牆規則。
gcloud compute networks subnets create private-sub --network=privatenet --region=asia-east1 --range 10.1.0.0/28
上面指令執行結果如下圖,在 network privatent 中建立了一個名稱為 private-sub 的 subnetwork (子網路)。
Create the firewall rules for privatenet
gcloud compute firewall-rules create privatenet-deny --network=privatenet --action=DENY --rules=icmp,tcp:22 --source-ranges=0.0.0.0/0
這個指令建立的防火牆規則和前面剛好相反,這個規則允許除 icpm、tcp:22 的所有連線通過,執行結果如下:
想看一下這條規則的詳細說明,如下用如下指令:
gcloud compute firewall-rules describe privatenet-deny
到目前建立了兩個 network,可以用以下指令列出來看看
gcloud compute firewall-rules list --sort-by=NETWORK
上面指令包含預設的都會列出來,如果只想列出我們自行建立的,可以加上過濾條件。
gcloud compute firewall-rules list --sort-by=NETWORK --filter=“NETWORK != ‘default’”
Create VM instances查一下到目前為止,我們建立了那些 subnets。
gcloud compute networks subnets list --filter=“REGION = ‘asia-east1’”
執行結果如下:
接下來要在 labnet-sub 及 privatek-sub 兩個 subnets 中各建立一個 VM,用來測試網路是否有通。
- Create the pnet-vm instance
gcloud compute instances create pnet-vm --zone=asia-east1-c --machine-type=n1-standard-1 --subnet=private-sub
執行結果如下,在 AZ = asia-east1-c 的機房,在子網路 private-sub 裡建立了名稱為 pnet-vm 的 VM,內部 IP: 10.1.0.2,外部 IP: 35.221.157.5。
- Create the lnet-vm instance
gcloud compute instances create lnet-vm --zone=asia-east1-c --machine-type=n1-standard-1 --subnet=labnet-sub
執行結果如下,在 AZ = asia-east1-c 的機房,在子網路 labnet-sub 裡建立了名稱為 lnet-vm 的 VM,內部 IP: 10.0.0.2,外部 IP: 34.80.241.172。
檢查上面建立的兩個 VM,列出來看看,指令如下:
gcloud compute instances list --sort-by=ZONE --filter="ZONE='asia-east1-c'"
結果如下, STATUS 都是 RUNNING,正常在運作。
Explore the connectivity
檢查一下防火牆,在自己的電腦開個命令列視窗,ping 上面的兩個外部 IP。
結果是 lnet-vm 可以通,pnet-vm 不通,如預期!