Linux為什么卡住了?


導讀 通過SSH登錄Linux服務器時,輸完用戶名就卡住了,要等待10秒鍾才提示密碼輸入。這究竟是什么原因導致的呢?

10秒鍾的時間並不算長,吃個薯片喝口咖啡就過去了。但是作為強迫症患者,我還是容不得它的存在,因此便決定寫篇文章,向大家演示一下怎樣用Wireshark一步步解決這個問題。

Linux為什么卡住了?Linux為什么卡住了?

首先是抓包,步驟如下
  1. 在Linux服務器上啟動抓包。
  2. 從筆記本SSH到Linux服務器,輸入用戶名並回車。
  3. 等待10秒左右,直到登錄界面提示輸入密碼。
  4. 停止抓包。

這樣就可以得到一個涵蓋該現象的網絡包了。一般在實驗室中沒有干擾流量,不用過濾也可以分析,不過我們最好在做實驗時就養成過濾的習慣,以適應生產環境中抓到的包。因為我們是通過SSH協議登錄的,所以可以直接用“ssh”來過濾,如圖所示。SSH包都是加密了的,因此我們看不出每個包代表了什么意思,不過這並不影響分析。從圖2中可以看到,21號包和25號包之間恰好就相隔10秒。

Linux為什么卡住了?Linux為什么卡住了?

這兩個包之間所發生的事件,可能就是導致這個現象的原因。於是我再用“frame.number> 21 && frame.number< 25”過濾,結果如圖所示。

Linux為什么卡住了?Linux為什么卡住了?

分析

從圖中可以看到,Linux服務器當時正忙着向DNS服務器查詢10.32.200.23的PTR記錄(即反向解析),試圖獲得這個IP地址所對應的域名。該IP屬於我們測試所用的筆記本,但由於DNS服務器上沒有它的PTR記錄,所以兩次查詢都等了5秒鍾還沒結果,總共浪費了10秒鍾。

我們由此可以推出,這台Linux服務器在收到SSH訪問請求時,會先查詢該客戶端IP所對應的PTR記錄。假如經過5秒鍾還沒有收到回復,就再發一次查詢。如果第二次查詢還是等了5秒還沒回復,就徹底放棄查詢。我們甚至可以進一步猜測,如果DNS查詢能成功,就不用白等那10秒鍾了。

為了驗證這個猜測,我在DNS服務器中添加了10.32.200.23的PTR記錄,如圖所示,然后再次登錄。

Linux為什么卡住了?Linux為什么卡住了?

這一次果然立即登錄進去了。從圖的Wireshark截屏可見,DNS查詢是成功的,所以21號包和26號包之間幾乎是沒有時間停頓的。

Linux為什么卡住了?Linux為什么卡住了?

結果

明白了DNS查詢就是問題的起因,接下來就知道怎么進一步研究了。只要在Google搜索“ssh dns”,第一頁出來的鏈接都是關於這個問題的。隨便挑幾篇閱讀一下,就連我這樣的Linux初學者都能把這個問題研究透了。原來這個行為是定義在“/etc/ssh/sshd_config”文件中的,默認配置是這樣的:

[root@Linux_Server ~]# cat /etc/ssh/sshd_config |grep -i usedns #UseDNS yes 

改成下面這樣就可以解決了,不用去動DNS服務器上的配置:

[root@Linux_Server~]# cat /etc/ssh/sshd_config |grep -i usedns UseDNS no

本文轉載自:http://www.linuxprobe.com/linux-connect-slowly.html

更多Linux干貨請訪問:http://www.linuxprobe.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM