文章段落
Google Cloud Platform(GCP,現 Google Cloud)虛擬主機(VM)連線失敗怎麼辦?其中一個常見的原因是主機內部安裝第三方軟體套件,間接阻斷了 SSH 連線。這次 Cloud Ace 的專業架構師將詳細解說上述連線失敗狀況的救援方法,一起來了解實際上該如何操作吧。
GCP 虛擬主機連線失敗 – 無法連線主機
虛擬主機連線失敗常見原因
在雲端環境內,造成 VM 連線失敗的原因有很多,例如主機的 CPU 滿載或 Disk 空間已滿,或是未妥善於雲端虛擬網路(Virtual Private Cloud,VPC)中設置防火牆規則,而被阻檔連線。又以 Linux 主機為例,由於測試需求在主機內部安裝第三方軟體套件,進而間接阻斷 SSH 連線也是有可能發生的。所以今天就為大家示範這個常見問題該如何解決。
虛擬主機連線失敗情境模擬
這次我們以不小心在主機內安裝第三方軟體,進而阻擋 SSH 連線作為模擬情境。首先必須在 Google Cloud Platform(GCP)專案內建一台作業系統為 Debian 的主機,其他選項保持預設。建立完後直接 SSH 連線進去,並安裝 ufw 防火牆。但安裝完後,服務還沒有被啟用,因此需要先執行啟用指令。
等 ufw 防火牆被啟用後,我們需要先登出,再一次嘗試連進主機。這時候就可以看到類似下圖的錯誤訊息,顯示此次連線失敗,需要進行狀況排除。
©2022 Google
這邊補充一點,如果連線時出現上圖的錯誤訊息,可先逐一檢查主機的 CPU、Disk 有沒有過載,再檢查防火牆規則有沒有妥善設置。若以上條件都不符合,則可以透過 Cloud Logging 查看連線異常的原因。
GCP 虛擬主機連線失敗救援教學 – Serial Console
雲端和地端主機最大的差異是我們無法實際走到雲端主機前排除問題,但其實 GCP 上有類似我們走到地端主機面前的功能。進入主機頁面後,看到的「CONNECT TO SERIAL CONSOLE」,就是模擬我們真的走到主機面前的樣子,透過使用 Serial port 連進需要被救援的 VM。
©2022 Google
不過當我們在 Google Compute Engine(GCE)創建好一台新主機,預設的 Serial port 是沒有被啟用的,換言之,我們還無法使用 Serial Console。所以在進行狀況排除前,必須先啟用 Serial port。而當中又可以分為在專案層級啟用,以及在 VM 層級啟用,以下分別為各位介紹。
專案層級啟用 Serial port
首先,我們進入到專案層級的 Metadata 後,在 key-value 欄位輸入以下指令,則可成功啟用專案的 Serial port。
Key:Value = serial-port-enable:TRUE
所以未來專案內有任何一台機器無法開機,我們都可以開啟 Serial Console 進去 VM 內部進行救援。
©2022 Google
不過,啟用 Serial port 後還無法真正連進去主機。前面有提到,GCP Serial Console 是模擬我們走到主機前的情境,因此正常情況下,我們會需要透過使用者帳號及密碼登入 VM。以下透過在 VM 層級啟用 Serial port 來介紹如何完成登入主機的步驟。
VM 層級啟用 Serial port
在 VM 層級啟用 Serial port 後,我們就只能針對特定的主機進行 Serial Console 救援,在管理面上會比較嚴謹。啟用步驟非常簡單,我們只需要進到主機編輯頁面,在「Remote access」的欄位勾選「Enable connecting to serial ports」即可。此外,上述有提及我們需要一組使用者帳號密碼才能登入主機,因此必須在「Metadata」的 「Startup script」內輸入以下指令來建立一名使用者。設定密碼時,建議將密碼設複雜一點,避免有心人士在過程中駭入我們的主機。
#!/bin/bash
adduser <USERNAME>
echo <USERNAME>:<PASSWORD> | chpasswd
usermod -aG google-sudoers <USERNAME>
©2022 Google
點選儲存後還沒結束!這時,主機的系統還沒有自動幫我們建立使用者,因此需重新啟動(Reset)主機,讓系統執行剛剛的 Startup script 才算是真正完成啟用 Serial port 的步驟。
©2022 Google
機器 Reset 完成後,我們就可以透過 Serial Console 連進去我們的主機了。通常 GCP 預設的 Serial port 為 「Serial port 1(Console)」。
©2022 Google
點選進 Serial port 1 後會出現一個視窗,如果什麼訊息都沒看到,按一下 Enter 就可以了。此時會跳出需輸入登入資訊的畫面,我們只要將剛剛設定的使用者名稱及密碼一一輸入就可以成功登入我們的主機囉。
©2022 Google
接著回到模擬情境,因為不小心安裝了 ufw 防火牆而造成連線失敗,所以我們的目標是要恢復主機 SSH 連線的功能。為此,我們需要進入 ufw.conf 來修改設置。
sudo nano /etc/ufw/ufw.conf
©2022 Google
進入到編輯頁面後,我們可以在第7行(或 ENABLE=yes 的下一行)增加下方的 ufw 防火牆規則來允許 SSH 連線。
ufw allow ssh
©2022 Google
儲存完後一樣要 Reset 主機,以確保剛剛的動作能有效執行。最後,我們要來檢測被救援後的主機是否可以 SSH 連線。最快且最簡單的方式,便是直接點選 GCP Console 上的 SSH 按鈕來嘗試連線進主機。
©2022 Google
如下圖所示我們已成功排除主機連線失敗的狀況!另外,考慮雲端安全性問題,救援完畢後建議把方才創建使用者的 Startup script 刪掉,以免被他人被看到密碼。
©2022 Google
這邊補充一點,GCP VM 連線的方式有三種。除了上述提到的 Console SSH,也可透過安裝 Cloud SDK 利用 gcloud CLI,或建立自己的 SSH Key 來連線主機。一般來說,Cloud Ace 不建議大家直接透過 Console SSH 連線。因為點選該按鈕時,GCP 會自動分派隨機的 IP 來當作連線進主機的 Source IP,如此一來,便無法透過防火牆限制特定 IP,意即需允許來自任何 IP 的 22 port,增加主機遭入侵的風險。
如欲增加雲端 VM 的安全性,建議可透過 Cloud IAP 搭配 OS Login 來實踐零信任資安模型(BeyondCorp)的應用。實際操作教學可參考《比 VPN 連線、跳板機更方便!利用 Cloud IAP 快速建立遠端安全連線》及《比 SSH 連線 GCE 更好管理!輕鬆以 OS Login 掌握用戶資訊》,或聯繫我們獲得更全面的資安防護建議。
如何透過其他 Serial port 登入主機?
多數 Google 的 Linux VM 預設都是用 Serial port 1 作為 Serial Console 連線的窗口。然而 port 1(ttyS0)可能會因為要紀錄 VM 的數據,或是需要將其他資訊打印到此 port 上而面臨負載變大的問題。因此,我們可選擇透過其他的 port 來登入 VM,比如 port 2(ttyS1)。
啟用另一個 Serial port 會根據不同的作業系統(Operating System,OS)而有不同的啟用方式(指令),以下幫大家整理出一些常用的作業系統對應到的服務管理(System Management),以及不同作業系統針對 Serial port 的啟用指令。
Operating System | Service Management |
CentOS 7 | systemd |
CoreOS | |
COS | |
Debian 8 | |
Debian 9 | |
OpenSUSE 13 | |
OpenSUSE Leap | |
RHEL 7 | |
SLES 12 | |
Ubuntu 16.04 | |
Ubuntu 17.04 | |
Ubuntu 17.10 |
CentOS 6 | upstart |
RHEL 6 | |
Ubuntu 14.04 |
SLES 11 | sysvinit |
針對使用 systemd 的 Linux 作業系統,可分為暫時啟用及永久啟用。
暫時啟用服務(直到下次重新啟動):
sudo systemctl start serial-getty@ttyS1.service
永久啟用服務(從下次重新啟動開始):
sudo systemctl enable serial-getty@ttyS1.service
而針對使用 upstart 的 Linux 作業系統,各自的啟用指令如下。
Ubuntu 14.04:
sudo sh -c "sed -e s/ttyS0/ttyS1/g < /etc/init/ttyS0.conf > /etc/init/ttyS1.conf"
RHEL 6.8 和 CentOS 6.8:
sudo sh -c "sed -ne '/^# # ttyS0/,/^# exec/p' < /etc/init/serial.conf | sed -e 's/ttyS0/ttyS1/g' -e 's/^# *//' > /etc/init/ttyS1.conf"
若不想要重啟(Reset)自己的主機,執行以下指令可直接顯示 Serial consoel 的登錄畫面:
sudo start ttyS1
最後針對使用 sysvinit 的 Linux 操作系統,可以執行以下指令:
sudo sed -i~ -e 's/^#T([01])/T\1/' /etc/inittab
sudo telinit q
以上,透過這些針對不同作業系統的啟用指令,我們就可以登錄不同的 Serial Console,來分擔 port 1 的負擔。
如何查看 Serial port 輸出紀錄?
最後,使用 Serial Console 的好處之一是可直接在 VM Console 的頁面查看 port 的 output logging 紀錄。不過必須在 VM 運行當下才能透過此方法查看,若將 VM 關機或刪除,就無法看到 Serial port output 了。
©2022 Google
此外,在 VM Console 上,每個 port 的 output 僅能顯示最新 1MB 的 logging 紀錄,所以如想查看更多或更久以前的紀錄,可在 VM 的 Metadata 啟用 Serial port 的 logging,就能在 Cloud Logging 查看所有的 logs 。Cloud Logging 免費提供每月前 50GiB 的 logs 紀錄 ,保留期限為30天。有分析需求的話,也可以將 logs 匯入 BigQuery 做資料分析。
©2022 Google
以上就是如何透過 Serial Console 解決 VM 連線失敗狀況的教學,大家若想了解更多細節,歡迎在下方留言。 最後,如果想更了解 GCP 或有技術服務相關需求也都歡迎聯絡我們獲得更進一步的資訊。
▋延伸閱讀:
・【GCP教學】第一次開 Google VM 就上手 – Compute Engine 操作簡介
・【GCP教學】第一次開Google VM要注意什麼?Compute Engine開機詳細介紹
・【GCP教學】如何輕鬆備份 GCP 上 VM 的資料?快照 Snapshot 自動備份設定教學
・GCP 常見問題與教學―掛載硬碟錯誤導致 VM 開機失敗
・使用 GCP VM 的5大常見錯誤 – 有一種叫忘記關機!
非常實用的教學!