2010/03/26

Sometimes can't access Guest OS from outside in ESXi

很奇怪的問題,在專題期間如果發生了我們肯定氣死,不過現在換學弟妹痛苦了就是。

環境


描述情況,簡單說明一下 ESXi 伺服器的狀況:

ESXi Server [192.168.0.2]
├ Ubuntu Server [192.168.0.3]
└ Windows XP Pro [192.168.0.4]

ESXi 伺服器運作兩台虛擬機器,且兩台虛擬機器都直接設定靜態IP位置 (Static IP),原本是 140 開頭的為了保護我就先以 192 代替。

原本在只有 ESXi 和 Ubuntu 的時候相安無事,一切都很順。最近新灌了一個 XP,要給學弟妹用,架設完成給定 MAC Address 和對應的 IP Address,從外面連接也能瀏覽架設的網頁伺服器。

問題


但運作幾天後,從外面分別連 Ubuntu Server 和 Windows XP Pro 都出現逾時錯誤 (Connection Timeout),更扯的是 ESXi 甚至連不上管理了,感覺好像整個網路被鎖了一樣。但可能等個一段時間,又突然正常。正常的機器也不一定,可能是 Windows、Ubuntu、ESXi 其中一台,也可能一次多台。

後來有機會能夠透過同網域的電腦來連線 (即 192.168.0.1/24 網域) 發現這些伺服器都能正常連線!可是從外面連不進去,將 ESXi 更新到最新版本仍舊有此問題,因為以往都能正常連線排除網路線路問題,開始懷疑可能是網卡驅動的問題。

進一步發現,出問題的 Guest OS 一開始會無法對外瀏覽,查詢 DNS 階段就發生錯誤,但是只要進行網路操作 (Windows 是選修復網路;Ubuntu 是 ping 外面的機器),奇妙的是連線又恢復正常了。

PING XXX.XXX.XXX.XXX (---------) 56(84) bytes of data.
64 bytes from XXX.XXX.XXX.XXX: icmp_seq=1, ttl=224, time=600.59ms
64 bytes from XXX.XXX.XXX.XXX: icmp_seq=2, ttl=224, time=5.59ms
64 bytes from XXX.XXX.XXX.XXX: icmp_seq=3, ttl=224, time=4.82ms
64 bytes from XXX.XXX.XXX.XXX: icmp_seq=4, ttl=224, time=5.35ms

會有這種第一次查詢爆慢,後面查詢開始正常的狀況。

類似案例


說真的不知道要用什麼關鍵字來找這種問題,但是還是被我搜到類似的東西:

- Minix 上的 AMD Lance 网卡驱动问题
使用静态 IP 地址以后,外部网络无法 ping 通 Minix,必须 Minix 先 ping 外面,然后外面才能 ping 通它
簡直是一模一樣的狀況!不同的是OS不一樣,所以解決方案就沒有效了。不過可推測問題可能就是OS載入的網路驅動出問題。

- [other] In ESXi can't access guest OS (Ubuntu 8.10) from outside
Ubuntu 官方論壇,描述跟我的情況是最相近的了。可惜沒多少人注意並回答這個問題,回應提到可能跟 ESXi 的 vSwitch 或 VLAN 設定有關?但我都沒有更動過,完全是預設值。至少虛擬機器只有一台的時候,非常順。

結論


總之,目前無解。茲紀錄如下希望能有其他有相同問題的人、或是有能力解決的人解惑了。

土砲解法


問題不能就這樣放著,所以我想出奇招。

既然機器ping外部的時候,網路會暫時回復一陣子,那我就定時ping外面的機器,讓線路保持動作。這樣就可以確保連線正常了。聽起來很蠢,但是實際使用確實有效。需要搭配 cron 作定期工作。

/etc/crontab 加一行
*/2 * * * * root python /usr/bin/randomping.py >> /var/log/ping.log

其中 >> 後面的意思是附加輸出 STDOUT 到檔案,觀察用,與ping無關。關鍵程式 randomping.py:
import random, os

pingHosts = ["168.95.1.1", "168.95.192.1", "139.175.150.20", "139.175.55.244", "8.8.8.8", "8.8.4.4"]

Host = random.sample(pingHosts, 1)[0]
os.system("date")
os.system("ping " + Host + " -c 2")
因為怕定期ping某單一機器會被鎖之類的,所以設定了多組名單來ping。而這些Server都是公開的DNS,應該沒有問題。

存到 /usr/bin/randomping.py 後,就讓它自動運作吧。真是爛方法,但是確實有效,唉。

2 則留言:

  1. 也遇到同樣問題 ping 就不會連不到了

    最後找到原因 esxi 網卡內定 為 1000M

    不知您的網卡 是否是被指定為 1000M ?

    指定esxi 網卡為 自動 就好了(我的SWITH 為100M)

    回覆刪除
  2. 原來有跟我一樣問題的人啊,真高興。

    因為那台主機我現在也幾乎碰不到了,所以也無法得知ESXi網卡設定。
    不過如果是的話那真是感謝您提供解法。

    回覆刪除