GCP martian source 問題網路修復

一口氣續了9年namecheap domain name

今天閒來無事,想說 Google 前陣子寄信來說 static external IP 要收錢了(後來才發現一台虛擬機是不用收錢的,而且跟是不是 static 無關),就來換個動態 IP 好了。先一口氣續了 9 年的 namecheap domain name (衝動了,一共將近4000NTD),再啟用 DDNS 服務,接下來就把 GCP 的固定 IP 移除,改成動態 IP。

想不到不改還好,一改之後發現一切都連不上了,從 Cloud Console 用SSH也無法連進去。本想找 Google GCP 服務人員幫忙,後來發現要另外收取費用(100USD起跳),不然就只能找論壇求助了。這怎麼看都不是個有效的辦法,這樣一停下去,網站不知道要停擺幾天。最後只好捲起袖子,自己來把它搞定了。

錯誤訊息

要解決問題的第一步,就是要先知道是什麼錯誤,由於 ssh 連不進去,ping 不到,網頁也無法連。可見透過網路debug肯定是行不通的。

透過 Cloud Console 進 SSH

 

觀看序列埠訊息

此時要看到錯誤訊息,只能透過 Serial Port 來查知問題了。點進虛擬機裡,有個序列埠1的主控台訊息可以觀察,點進去後便可看到序列埠的輸出。這就相當於在機器前面的畫面輸出了,果然看到當透過 SSH 要連入時,出現了類似下面的錯誤訊息。

 

上網查了一下,說這是機器收到了沒辦法 routing 的資料,可以關掉 martian source 的警告。另外一篇則提到也是重開後無法連入的類似現象,加入 startup script後就修復了,雖然它的方法對我無效,我也開始深入研究是否是網路的問題。

網友透過 startup-script 修正網路問題

從序列埠來解決問題

為了能進入系統把問題搞清楚,我開始嚐試著從序列埠登入,這也是一般機器的終級解決之道。

啟用序列埠操作

為了用序列埠連入,使用者需要「啟用序列埠連線」,這個設定在虛擬機啟動時是無法啟用的,請先停止後,再透過編輯去啟用它。下次開機後,點擊「連線至序列主控台」,就會跳出從序列主控台登入的提示訊息了。

序列埠登入提示

不幸的是,GCP預設都是用憑証登入,並沒有特別去設置密碼,所以這邊既沒辦法用root登入,也無法用一般使用者登入。

下一步前,先備個份吧!(快照)

下一步我們會試圖把 root 的密碼重設,使得可以從 root 來登入。但在這些之前,我會強烈建議先將磁碟建立快照,以免有任何意外,導致無法挽救的資料遺失。快照在某些地方是要收費的,不過一但確定可以重新登入,就可將快照刪除,省點錢下來。

建立磁碟快照

重設root密碼

重設 root 密碼的方法說起來不難,就是再新開一個 vm,把舊的磁碟掛載過去,清除root密碼。這樣下次再用舊vm開機,就可以root免密碼登入了。理論不難,只是操作起來步驟有點多就是了。

Step1 卸載(非刪除!)舊vm開機磁碟

由於一個磁碟印象檔只能給一個 vm 掛載,所以要先把舊vm的磁碟缷載。在vm編輯的地方,可以把開機磁碟缷載。

舊vm磁碟缷載

如此之後,應該就可以看到左方 “磁碟” 列表內,原本的磁碟變成無使用者。

後面的部份由於系統目前已在正常運作,無法有完整的範例圖檔示範,只能以文字說明。

Step2 建立新的vm並掛載舊vm disk為第2顆硬碟

按 Cloud Console 上方的建立執行個體,來創建新的 vm.

 

在設定時,地區要選擇跟舊vm同一處的位置,才能使用其vm的磁碟印象,否則會沒有該選項。機器用最便宜的 f1-micro就行了,開機磁碟創建一個新的,建議使用跟舊vm一樣的Linux系統。

接下來按下方「管理、安全性、磁碟…」,來掛載舊vm的磁碟。

在磁碟的地方按下 「連接現有的磁碟」,便會跳出選擇現有磁碟的畫面,選擇舊vm的磁碟印象檔後,便可完成新vm建立,並啟動新vm。

新增磁碟

選擇舊磁碟

從新 vm 修改舊 vm的磁碟內容

當新vm開機完成後,便以ssh登入,並切換到 root 身份,此時舊 vm 的磁碟應該是 /dev/sdb1 ,我們將起掛載起來進行修改。

 

要重置 root 密碼,此時要修改 /mnt/etc/shadow 和 /mnt/etc/shadow- 這兩個密碼檔案。密碼檔的第一行應該是長的像這樣,將其 root 後面的第一個星號去除後,root 登入便不需要密碼。

 

修改完成後,將 /mnt 缷載,並關閉新vm。

 

重新掛載舊vm印象檔回舊vm

此時,停止新vm後,可以把舊磁碟印象檔從新vm缷載,方法與之前類似,都是要先停止vm後,再進入編輯去缷載。缷載後,再去舊vm重新掛載成開機磁碟,然後啟動舊vm。再透過序列埠連線至 Linux,此時應該就可以使用 root 登入了。

手動設定 IP

登入 Linux 後,可以下達 ifconfig 和 route 命令來看目前 IP 的配置狀況。

ip與路由

 

上圖是正常的狀況下。在有問題時,我的狀況是有IP,但 route 所顯示出來卻是空的,也難怪連線都無法成功。我的解法是將 IP 設定放置 /etc/rc.local 內,強制設定 default gateway,而沒有去找問題的原因,這也証明前面提到網友的做法是對的,只是不知為何他建議的設定沒有生效。根據你的vm所在地區的不同,private IP 可能也會有所不同,但一般都是從 .2 開始編號,.1 是 default gateway.

在rc.local設定IP

最後,再把 /etc/shadow 和 /etc/shadow- 原本去掉的星號再加回去,避免可以直接免密碼 root 直接登入,以免造成安全漏洞。

 

結語

自己架 WordPress 出問題真的很頭大,上次是 YUZO Related Plugin 被駭,導致網路上大規模的哀號,我也是其中之一。在發現原因前,我一個一個的 disable plugin 才發現原因。這次 GCP 出了包(應該算是 Google 的問題吧),其實根本求助無門,這種超級大廠 (Facebook 也是),要嘛不理人,要嘛要收錢。還記得上次從 Bluehost 搬過來的時候,抱怨 Bluehost 太機車,但其實他們的客服至少有問必回,雖然是官方說法,也不會讓你覺得求助無門。果然是各有好壞,也許哪一天又搬回 Bluehost 也說不定~~~

Leave a Reply