概述
在本教程中, 你將建立幾個 VPC 網路 以及 VM instances, 並且測試這些網路間的連接。 更準確的說, 你將建立兩個客製化模式的網路 (management 以及 privatenet), 以及各自的防火牆規則跟 VM instances, 如下圖所示:
mynetwork 網路以及它的防火牆規則跟 VM instances (mynet-eu-vm 以及 mynet-us-vm) 在本教程的專案中已經被建立了
目標
在本教程中, 你將會學習到如何完成以下任務
- 建立一個客製化模式的 VPC 網路以及它的防火牆規則
- 使用 Compute Engine 建立 VM instances
- 在不同的 VPC 網路間, 探索 VM instances 之間的連接
- 使用多重網路介面建立 VM instance
設定及要求
在你按下 Start Lab 按鈕之前
詳讀所有的教學。Labs 是有時間限制的,而且你不可以停止時間倒數。倒數計時器在你按下 Start Lab 按鈕後開始倒數,上面顯示的時間為你還能使用 Cloud 資源的時間。
Qwiklabs 的手把手環境,讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程,而不是在一個模擬或是展示的環境。我們透過提供你一個全新的、暫時的帳號密碼,在計時器歸零之前,你可以用來登入並存取 Google Cloud Platform。
你需要什麼?
要完成這個 lab ,你需要:
- 一個一般的網路瀏覽器(推薦 Chrome)
- 完成這個 lab 的時間
備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab
現在你已經開始你的 lab
, 你將會登入 Google Cloud Shell
主控台,然後開啟命令列工具
如何開始你的 lab ,然後登入 Console?
- 按下 Start Lab 按鈕。如果你需要付費,會有一個彈出視窗來讓你選擇付費的方式。在左方你會看到一個面板,上面有暫時的帳號密碼,你必須使用這些帳號密碼在此次 lab
- 複製
username
, 然後點擊Open Google Console
。 Lab 會開啟另外一個視窗,顯示選擇帳號
的頁面
tip: 開啟一個全新的視窗,然後跟原本的頁面並排
- 在
選擇帳號
頁面, 點擊Use Another Account
- 登入頁面開啟,貼上之前複製的
username
以及password
,然後貼上
重要:必須使用之前於 Connection Details 面板
取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號,請不要用在這裡(避免產生費用)
- 點擊並通過接下來的頁面:
- 接受
terms
以及conditions
- 不要增加
recovery optoins
或two factor authentication
(因為這只是一個臨時帳號) - 不要註冊免費體驗
- 接受
稍待一些時候, GCP 控制台將會在這個視窗開啟。
注意:按下左上方位於Google Cloud Platform
隔壁的 Navigation menu
,你可以瀏覽選單,裡面有一系列的 GCP 產品以及服務
啟動 Google Cloud Shell
Google Cloud Shell
是載有開發工具的虛擬機器。它提供了5GB的 home 資料夾,並且運行在 Google Cloud
上。 Google Cloud Shell
讓你可以利用 command-line 存取 GCP
資源
- 在
GCP 控制台
,右上的工具列,點擊Open Cloud Shell
按鈕
- 在打開的對話框裡,按下
START CLOUD SHELL
:
你可以立即按下 START CLOUD SHELL
當對話視窗打開。
連結並提供環境會需要一點時間。當你連結成功,這代表你已成功獲得授權,且此專案已被設為你的專案ID,例如:
gcloud 是 Google Cloud Platform
的 command-line 工具,他已事先被安裝在 Cloud Shell
並且支援自動補齊
使用這個 command ,你可以列出有效帳戶名稱:
gcloud auth list |
輸出:
Credentialed accounts: |
範例輸出:
Credentialed accounts: |
你可以使用以下 command 來列出專案 ID
gcloud config list project |
輸出:
[core] |
範例輸出:
[core] |
gcloud
的完整文件可以參閱 Google Cloud gcloud Overview
建立客製化模式的 VPC 網路以及防火牆規則
建立兩個客製網路 managementnet 以及 privatenet, 以及防火牆規則允許 SSH, ICMP, 以及 RDP 流量進入
建立 managementnet 網路
使用 GCP Console 建立 managementnet 網路
在 Console 內, 到 Navigation menu > VPC network > VPC networks
注意到 default 以及 mynetwork 網路以及它們的子網路
每一個 GCP 專案都會有一個 default 網路。 另外, mynetwork 網路已經被事先建立, 如同上面的網路圖表呈現。點擊 Create VPC Network
將 Name 設為
managementnet
Subnet creation mode, 點擊 Custom
做如下設定, 其餘留為預設
點擊 Done
點擊 command line
這些指令顯示網路以及子網路是可以使用 Cloud Shell 指令來建立的。 你將使用這些指令以及類似的參數來建立與設定 privatenet 網路
- 點擊 Close
- 點擊 Create
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功建立 managementnet 網路, 你將獲得一個評價分數。
建立 privatenet 網路
使用 Cloud Shell 指令來建立 privatenet 網路:
執行以下指令來建立 privatenet 網路
gcloud compute networks create privatenet --subnet-mode=custom
執行以下指令來建立 privatesubnet-us 子網路:
gcloud compute networks subnets create privatesubnet-us --network=privatenet --region=us-central1 --range=172.16.0.0/24
執行以下指令來建立 privatesubnet-eu 子網路
gcloud compute networks subnets create privatesubnet-eu --network=privatenet --region=europe-west1 --range=172.20.0.0/20
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功建立 privatenet 網路, 你將獲得一個評價分數。
- 執行以下指令來列出可用的 VPC 網路:
gcloud compute networks list
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 |
default 以及 mynetwork 屬於自動模式的網路, 而 managementnet 以及 privatenet 屬於客製化模式網路。 自動模式網路會自動地在某一個 region 建立子網路, 而客製化模式剛建立時是沒有子網路的, 你有著子網路建立的所有控制權
- 執行以下指令來列出可用的 VPC 子網路(由 VPC 網路分類)
gcloud compute networks subnets list --sort-by=NETWORK
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME REGION NETWORK RANGE |
如預期般, default 以及 mynetwork 網路在 每一個 region 都有各自的子網路, 因為它們是屬於自動模式網路。 managementnet 以及 priavtenet 網路唯有當你有建立時, 它們才會有子網路, 因為它們是屬於客製化模式網路。
- 在控制台, 到 Navigation menu > VPC network > VPC networks
- 你可以看到一樣的網路以及子網路被列在控制台中
建立 managementnet 的防火牆規則
建立防火牆規則來允許 SSH, ICMP, 以及 RDP 流量進入到 managementnet 網路中的 VM instances
- 在控制台, 到 Navigation menu > VPC network > Firewall rules
- 點擊 + Create Firewall Rule
- 做如下設定, 其餘留為預設
請務必確認 Source IP ranges 後面有包含 /0 已指定所有網路
- 點擊 command line
這些指令顯示防火牆規則是可以使用 Cloud Shell 指令來建立的。 你將使用這些指令以及類似的參數來建立與設定 privatenet 的防火牆規則 - 點擊 Close
- 點擊 Create
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功建立 managementnet 的防火牆規則, 你將獲得一個評價分數。
建立 privatenet 的防火牆規則
使用 Cloud Shell 指令來建立 privatenet 網路的防火牆規則
- 在 Cloud Shell 中, 執行以下指令來建立 privatenet-allow-icmp-ssh-rdp 防火牆規則
gcloud compute firewall-rules create privatenet-allow-icmp-ssh-rdp --direction=INGRESS --priority=1000 --network=privatenet --action=ALLOW --rules=icmp,tcp:22,tcp:3389 --source-ranges=0.0.0.0/0
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME NETWORK DIRECTION PRIORITY ALLOW DENY |
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功建立 privatenet 網路的防火牆規則, 你將獲得一個評價分數。
- 執行以下指令來列出所有的防火牆規則 (依 VPC 網路分類)
gcloud compute firewall-rules list --sort-by=NETWORK
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME NETWORK DIRECTION PRIORITY ALLOW DENY |
mynetwork 的防火牆規則已經被建立好了。 你可以在一個防火牆規則中定義多個協定以及 port (privatenet 以及 managementnet), 或是分別用多條規則來定義 (default 以及 mynetwork)
- 在主控台中, 到 Navigation menu > VPC network > Firewall rules
- 你可以看到同樣的防火牆規則被列在主控台
建立 VM instances
建立兩個 VM instances:
- 在 managementsubnet-us 中, managementnet-us-vm
- 在 privatesubnet-us 中, privatenet-us-vm
建立 management-us-vm instance
使用 GCP 主控台來建立 management-us-vm instance
在主控台中, 到 Navigation menu > Compute Engine > VM instances
如同上面的圖表顯示的一樣, mynet-eu-vm 以及 mynet-us-vm 已經被建立好了點擊 Create instance
做如下設定, 其餘留為預設
點擊 Management, disks, networking, SSH keys
點擊 Networking
點擊鉛筆的圖案來編輯 Network interfaces
做如下設定, 其餘留為預設
點擊 Done
點擊 command line
這些指令顯示 VM instances 是可以使用 Cloud Shell 指令來建立的。 你將使用這些指令以及類似的參數來建立與設定 privatenet-us-vm 的防火牆規則gcloud beta compute --project=qwiklabs-gcp-03-2779af1ddf93 instances create managementnet-us-vm --zone=us-central1-c --machine-type=f1-micro --subnet=managementsubnet-us --network-tier=PREMIUM --maintenance-policy=MIGRATE --service-account=357292195316-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append --image=debian-9-stretch-v20200210 --image-project=debian-cloud --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=managementnet-us-vm --reservation-affinity=any
點擊 Close
點擊 Create
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功在 managementnet 網路建立 VM instance, 你將獲得一個評價分數。
建立 privatenet-us-vm instance
使用 Cloud Shell 指令來建立 privatenet-us-vm instance
- 在 Cloud Shell 中, 執行以下指令來建立 privatenet-us-vm instance
gcloud compute instances create privatenet-us-vm --zone=us-central1-c --machine-type=n1-standard-1 --subnet=privatesubnet-us
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS |
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功在 privatenet 網路建立 VM instance, 你將獲得一個評價分數。
- 執行以下指令來列出所有的 VM instances (依 zone 分類)
gcloud compute instances list --sort-by=zone
輸出類似如下 (不要複製; 這個只是範例輸出):
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS |
- 在主控台, 到 Navigation menu > Compute Engine > VM instance
- 你可以看到 VM instances 被列在主控台
- 點擊 Columns, 然後選擇 Network
可以看到在 us-central-c 有 3 台 instances, 而在 europe-west1-c 有 1 台 instance 。 然而, 這些 instances 橫跨了三個 VPC 網路 (managementnet, mynetwork 以及 privatenet), 沒有任何一台 instance 是同一個 zone 又同一個網路的。 在下一節中, 你將探索這在內部連線中的影響。
探索不同 VM instances 之間的連線
探索不同 VM instances 之間的連線。 更準確的說, 確定當 VM instances 在同一個 zone 的影響, 以及當他們在同一個 VPC 網路的影響
Ping 外部 IP 位址
藉由 ping VM instances 的外部 IP 位址來確定它們是否可以在公開網路被觸及到。
- 在控制台, 到 Navigation menu > Compute Engine > VM instances
- 檢視 mynet-eu-vm, managementnet-us-vm, 以及 privatenet-us-vm 的外部 IP 位址
- 點擊 mynet-us-vm 的 SSH 來啟動一個終端機連線
- 執行以下指令, 將 mynet-eu-vm 替換成外部 IP, 藉此測試 mynet-eu-vm 的外部 IP 連線
ping -c 3 <Enter mynet-eu-vm's external IP here>
這應該要可以通過
- 執行以下指令, 將 managementnet-us-vm 替換成外部 IP, 藉此測試 managementnet-us-vm 的外部 IP 連線
ping -c 3 <Enter managementnet-us-vm's external IP here>
這應該也要可以通過
- 執行以下指令, 將 privatenet-us-vm 替換成外部 IP, 藉此測試 privatenet-us-vm 的外部 IP 連線
ping -c 3 <Enter privatenet-us-vm's external IP here>
這應該也要可以通過
你可以通過 VM instances 的外部 IP 位址來 ping 到機器, 儘管他們處於不同的 zone 或是 VPC 網路。 這確認了一件事, 那就是公開網路存取只會由早先建立的 ICMP 防火牆規則所控制
Ping 內部 IP 位址
透過 ping VM instances 的內部 IP 位址來確定在同一個 VPC 網路中的 instances 是否可以互相觸及對方
在控制台, 到 Navigation menu > Compute Engine > VM instances
檢視 mynet-eu-vm, managementnet-us-vm, 以及 privatenet-us-vm 的內部 IP 位址
點擊 mynet-us-vm 的 SSH 來啟動一個終端機連線
執行以下指令, 將 mynet-eu-vm 替換成內部 IP, 藉此測試 mynet-eu-vm 的內部 IP 連線
ping -c 3 <Enter mynet-eu-vm's internal IP here>
你可以經由 mynet-eu-vm 的內部 IP 位址 ping 到它, 因為它與 ping 的來源機器 (mynet-us-vm) 處於同一個 VPC 網路, 儘管兩台 VM instances 在不同的 zones, regions, 以及 continents
- 執行以下指令, 將 managementnet-us-vm 替換成內部 IP, 藉此測試 managementnet-us-vm 的內部 IP 連線
ping -c 3 <Enter managementnet-us-vm's external IP here>
這應該不能通過, 如同資料顯示, 封包 100% 遺失
- 執行以下指令, 將 privatenet-us-vm 替換成內部 IP, 藉此測試 privatenet-us-vm 的內部 IP 連線
ping -c 3 <Enter privatenet-us-vm's external IP here>
這應該也無法通過, 如同回饋顯示, 封包 100% 丟失了! 你無法經由 managementnet-us-vm 以及 privatenet-us-vm 的內部 IP 位址來 ping 到對方, 因為它們與來源機器 (mynet-us-vm) 的 VPC 網路不同, 儘管他們都處於同一個 zone us-central1
VPC 網路預設上是獨立的私人網路 domains 。 然而, 除非你有設定一些機制, 像是 VPC peering 或是 VPN, 否則, 網路之間是不允許內部 IP 位址來互相通信的。
建立有著多重網路介面的 VM instances
每一台 VPC 網路內的 instance 都會有一個預設的網路介面。 你可以建立額外的網路介面, 然後附加到你的 VM 上。 多重網路介面可以讓你建立一個設定, 這個設定可以讓一台 instance 直接的連接到多個 VPC 網路 (最多八台 instances, 取決於 instance 的類型)
建立有著多重網路介面的 VM instances
建立一台名為 vm-appliance 的 instance, 這台 instance 會在 privatesubnet-us, managementsubnet-us, 以及 mynetwork 這些網路介面中。 這些子網路的 CIDR 範圍不可互相重疊, 這是建立一台有著多重網路介面控制器 (NICs) 的 VM 的要求之一。
- 在控制台, 到 Navigation menu > Compute Engine > VM instance
- 點擊 Create instance
- 做如下設定, 其餘留為預設
一台機器允許的介面數量取決於機器類型以及 VCPUs 的數量。 n1-standard-4 允許最多 4 個網路介面。 更多資訊可以參考這裏
點擊 Management, disks, networking, SSH keys
點擊 Networking
點擊鉛筆圖案編輯 Network interfaces
做如下設定, 其餘留為預設
點擊 Done
點擊 Add network interface
做如下設定, 其餘留為預設
點擊 Done
點擊 Add network interface
做如下設定, 其餘留為預設
點擊 Done
點擊 Create
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經成功建立多網路介面的 VM, 你將獲得一個評價分數。
探索多網路介面細節
在主控台以及 VM’s 終端機探索 vm-appliance 的多網路介面細節
在主控台, 到 Navigation menu > Compute Engine > VM instances
點擊 vm-appliance 的 Internal IP 的 nic0 來打開 Network interface details 頁面
確認 nic0 有被附加到 privatesubnet-us, 在子網路 (172.16.0.0/24) 中有被分配一組內部 IP, 以及已有生效的防火牆規則
點擊 nic0, 選擇 nic1
確認 nic1 有被附加到 managementsubnet-us, 在子網路 (10.130.0.0/20) 中有被分配一組內部 IP, 以及已有生效的防火牆規則
點擊 nic1, 選擇 nic2
確認 nic2 有被附加到 mynetwork, 在子網路 (10.128.0.0/20) 中有被分配一組內部 IP, 以及已有生效的防火牆規則
每一個網路介面有它們自己的內部 IP 位址, 所以 VM instance 可以與他們溝通在控制台, 到 Navigation menu > Compute Engine > VM instances
點擊 SSH 啟動 vm-appliance 的終端連線
執行以下指令來列出 VM instance 的網路介面
sudo ifconfig
輸出類似如下 (不要複製; 這個只是範例輸出):
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460 |
sudo ifconfig 這個指令列出了 Linux VM 的網路介面以及這些介面的內部 IP
探索網路介面的連線
我們可以藉由 ping 這些子網路來演示一下 vm-appliance 是與 privatesubnet-us, managementsubnet-us 以及 mynetwork 互相連接的
- 在主控台, 到 Navigation menu > Compute Engine > VM instances
- 注意一下 privatenet-us-vm, managementnet-us-vm, mynet-us-vm, 以及 my-eu-vm 的內部 IP 位址
- 回到 vm-appliance 的 SSH 終端機
- 執行以下指令, 將 privatenet-us-vm 替換成內部 IP, 藉此測試 privatenet-us-vm 的內部 IP 連線
ping -c 3 <Enter privatenet-us-vm's internal IP here>
這是可以連到的!
- 重複以上步驟, 執行以下指令
ping -c 3 privatenet-us-vm
你可以 ping 到 privatenet-us-vm 的 name, 因為 VPC 網路有內部 DNS 服務, 這個服務讓我們可以透過 DNS name 來連接到機器, 而不用透過 IP 位址。
執行以下指令, 將 managementnet-us-vm 替換成內部 IP, 藉此測試 managementnet-us-vm 的內部 IP 連線
ping -c 3 <Enter managementnet-us-vm's internal IP here>
這是可以連到的!
執行以下指令, 將 mynet-us-vm 替換成內部 IP, 藉此測試 mynet-us-vm 的內部 IP 連線
ping -c 3 <Enter mynet-us-vm's internal IP here>
這是可以連到的!
執行以下指令, 將 mynet-eu-vm 替換成內部 IP, 藉此測試 mynet-eu-vm 的內部 IP 連線
ping -c 3 <Enter mynet-eu-vm's internal IP here>
這個無法連到! 再多網路介面 instance 中, 每一個介面都會有一個可以連到它們所在的子網路的路由。 再者, instance 只會有一個預設路由, 這個路由與主要介面 eth0 相關聯。 除非手動設置, 否則任何離開這個 instance 的流量, 不管目的地是哪, 只要不是透過直接連接的子網路, 都將經由這個預設的路由離開。
- 執行以下指令來列出 vm-appliance 的所有路由
ip route
輸出類似如下 (不要複製; 這個只是範例輸出):
default via 172.16.0.1 dev eth0 |
主要介面 etho 有其預設路由 (預設經由 172.16.0.1 dev eth0), 以及所有三個介面 eth0, eth1, eth2 都有通往其各自子網路的路由。 因為 **mynet-eu-vm (10.132.0.0/20) 的子網路並沒有被包含在這台 instance 的路由表中, 當我們 ping 這台機器時, 請求會離開 eth0 的 vm-appliance (這是在一個不同的 VPC 網路)。 你可以設置政策路由來變更這個行為, 可參考文件
恭喜
你已經完成本教程!
Questions And Answers
- 解釋以下 GCP command
- command:
gcloud compute networks create privatenet --subnet-mode=custom
- Answer:
- 建立一個 GCP network
- 子網路的模式為, custom
- command:
- 解釋以下 GCP command
- command:
gcloud compute network subnets create privatesubnet-eu --network=privatenet --region=europe-west1 --range=172.20.0.0/20
- Answer:
- 建立一個 GCP 子網路
- 上層網路的名稱為 privatenet
- 地區為 europe-west1
- 確切網域範圍為 172.20.0.0/20
- command:
- 解釋以下 GCP command
- command:
gcloud compute networks list
- Answer:
列出所有網路, 不包含子網路
- command:
- 解釋以下 GCP command
- command:
gcloud compute networks create privatenet --subnet-mode=custom
- Answer:
- 建立一個 GCP network
- 子網路的模式為, custom
- command:
- 以下的 GCP Command 中, –subnet-mode 預設為 auto 還是 custom?
- Example:
gcloud compute networks create privatenet --subnet-mode=custom
- Answer:
auto
- Example:
解釋以下 GCP command
- Command:
gcloud compute networks subnets list --sort-by=NETWORK
- Answer:
- 列出所有 subnets
- 以 network 排列
- Command:
解釋以下 GCP command
- Command:
gcloud compute firewall-rules create privatenet-allow-icmp-ssh-rdp --direction=INGRESS --priority=1000 --network=privatenet --action=ALLOW --rules=icmp,tcp:22,tcp:3389 --source-ranges=0.0.0.0/0
- Answer:
- 建立一個 firewall-rules
- 名稱為 *privatenet-allow-icmp-ssh-rdp
- 方向為 INGRESS, 即外到內
- –priority 為優先性, 數字介於 0 ~ 65535, 數字越小優先性越高
- –action 為 ALLOW, 也可設為 DENY
- –rules 為規則, 可設定多種協議
- –source-ranges 為此 rule 作用到的來源 IP 範圍, 預設為 0.0.0.0/0, 即全部
- Command:
解釋以下 GCP command
- Command:
gcloud compute firewall-rules list --sort-by=NETWORK
- Answer:
- 列出所有的 firewall-rules
- 以 NETWORK 排
- Command:
解釋以下 GCP command
- Command:
gcloud compute instances create privatenet-us-vm \
--zone=us-central1-c \
--machine-type=n1-standard-1 \
--subnet=privatesubnet-us - Answer:
- 建立一台 vm, 名為 privatenet-us-vm
- 將該 vm 掛在 privatesubnet-us 這個子網路下
- Command:
解釋以下 GCP command
- Command:
gcloud compute instances list --sort-by=zone
- Answer:
- 列出所有 instances
- 以 zone 排列
- Command:
假如我有三台 VM, 分別位於不同的子網路下, 在不考慮防火牆的因素下, 我可以經由各自的 External IP ping 到對方嗎?
可以
- 假如我有兩台 VM, 分別位於 GCP 不同的子網路, 但相同的 network 下, region 跟 zone 都不同的情況下, 在不考慮防火牆的因素下, 我可以經由各自的 Internal IP ping 到對方嗎?
可以
- GCP VM Instances 當中, NIC 的上限是多少?
8 個
- GCP VM Instances 當中, 如果 vCPU 的數量不超過 2, 則 NIC 的數量限制為多少?
2 個
- GCP VM Instances 當中, 如果 vCPU 的數量超過 2, 則每多一個 CPU, 可以提高幾個 NIC 上限?
1 個
留言