sshd 響應慢緣由分析及使用 iptables 解決

在某些狀況下,你鏈接某臺服務器時發現 sshd 時響應很慢,可能十多秒,甚至幾十秒。而後你會在網上查找緣由,可能會找到緩慢的緣由是:
SSHD 服務的 DNS 反向解析  功能默認開啓所形成,且找到修正方法爲:
1. 編輯 /etc/ssh/sshd_config 文件
2. 找到 #UseDNS yes
3. 將其改成 UseDNS no
4. 重啓 sshd 服務

上面的修正方法是禁用了 sshd 服務的 DNS 反向解析功能。

其實,默認開啓反向解析是其中緣由之一,可是背後真正的元兇是開啓了嚴格的 iptables 防火牆規則,若是禁用掉 iptables 防火牆,那麼服務器能夠高速自由的鏈接 DNS 服務器,那麼即便反向解析開啓,那麼對鏈接速度也沒太多影響。

下面具體分析:

首先,我在服務器上設置兩條規則:
  1. iptables  -P INPUT DROP
  2. iptables -A INPUT -p tcp --dport 22 -j ACCEPT


第 1 條規則設置 INPUT 鏈中的默認策略是 DROP,即不接受任何輸入鏈接。這裏須要至關注意,你須要可以接觸到物理主機,不然在遠程鏈接的狀態下運行此命令,將致使你和服務器中斷鏈接,之後就再也沒法鏈接了,如果 VPS ,上面還放着網站什麼的其它服務,那就更杯具了,大半狀況下,得重裝系統才能解決了。固然,能夠先中止 iptables 服務,而後將規則寫到一個腳本中,並將該腳本放在 /etc/rc.d/rc.local 文件中,而後重啓服務器便可。若不,還能夠在中止 iptables 服務後,將規則事先寫到 /etc/sysconfig/iptables 文件中,而後再重啓 iptables 服務。

第 2 條規則是容許 22 端口的鏈接。

因此,在第 1 和 第 2 條規則的配合下,服務器只接受 sshd 服務的鏈接,其它的一概拒絕。在這種狀況下,就會出現 sshd 響應慢的問題了。緣由以下:

當 ssh 客戶端發來鏈接時,sshd 服務器將客戶端所在主機的 IP 到 DNS 服務器去執行反向解析。注意,此時防火牆的 OUTPUT 鏈是不作任何限制的,所以這個反向解析請求是可以發到 DNS 服務器那邊去,而 DNS 也會迴應。這時問題就出現了,因爲上面的 iptables 規則的限制,DNS 的迴應無法被服務器所接收到,所以 sshd 只有不斷的去重複反向解析操做,會一直等到請求超時爲止。這裏,這個重複去請求反向解析的操做所耗去的時間就是你鏈接 sshd 時發現很慢的這一事實。在超時後,sshd 這纔去應答 ssh 客戶端,所以給咱們的感受就是」爲何網絡或者服務器着麼差啊「。

在瞭解上面的緣由以後,解決辦法就簡單了。在 iptables 的 state 模塊裏定義了一個 ESTABLISHED 的狀態,該狀態簡而言之就是隻要發送端或接收端只要有一方已經成功創建了鏈接,那麼咱們就認爲這個狀態是 ESTABLISHED ,另外,DNS 解析使用的是 udp 協議,所以咱們能夠用再爲 iptables 添加一條規則:
  1. iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT

這麼作以後,在發生 DNS 反向解析時防火牆不會再阻攔 DNS 服務器端發送過來的響應,所以 sshd 的響應速度就提升了。
相關文章
相關標籤/搜索