iTerm2 進行 ssh 時,空閒一段時間斷開問題的解決

解決方案

本機mac,客戶端(iTerm2 配置修改)

sudo vim /etc/ssh/ssh_config

文件尾端添加:

ServerAliveInterval 60 ###數值是秒 

編輯文件後 註意保存,需要退齣關閉iTerm2,然後重新 連接試一下。



原本以爲是箇很常見的小問題,隨手一搜,解決辦法一大堆,試瞭試可行,就覺得沒什麽問題瞭。但,正因爲覺得太簡單瞭,在文末去查看瞭一下服務端配置,想找找問題起因,結果卻髮現開闢瞭一箇深坑……

一、提問

提箇問題:旣然ssh是空閒過久導緻連接超時而斷開,那麽「ssh默認是多久時間,會自動斷開連接?」

結果翻遍大半箇搜索引擎……全都是諸如「如何設置,纔能讓ssh不超時自動斷」這樣的鬼title,而且大部分都是互相抄,複製粘貼的內容……而我想問的問題是「到底多久超時」,卻沒人説過……或者説,其實跟本沒有ssh超時這一説?!

再提箇問題:如果ssh默認設置都沒有限製,那「爲什麽ssh會斷開連接?」

本以爲是ssh自動斷開超時連接的,但通過配置看到,默認值中併沒有做任何限製,那麽理論上,ssh的連接是不會斷開的。那到底是誰,榦瞭這件「壞事」?

二、再問

實在沒什麽頭緒,跑到QQ群問瞭一番,結果真有大神迴應,併且順利找到瞭線索!

最後通過各種摸索,終於知道瞭問題的主要原因,因爲連接是可以的,隻是會超時斷開,根據網絡結構來看,問題就可能齣現在一下這幾箇部分:

1.服務器存在防火牆,會關閉超時空閒連接,或設置瞭關閉超時空閒連接。
2.客服端和服務器之間存在路由器,路由器也可能帶有防火牆,會關閉超時空閒連接。
3.客服端存在防火牆,會關閉超時空閒連接。

原來,問題齣在防火牆!!

三、追問

爲什麽會是防火牆呢?根據大神指點:

在iptables的一些NAT配置説明裡有提到

4.3.6 State match 狀態匹配擴展要有內核裡的連接跟蹤代碼的協助,因爲牠是從連接跟蹤機製中得到包的狀態的。這樣我們就可以瞭解連接所處的狀態。牠幾乎適用於所有的協議,包括那些無狀態的協議,如ICMP和UDP。針對每箇連接都有一箇缺省的超時值,如果連接的時間超過瞭這箇值,那麽這箇連接的記録就被會從連接跟蹤的記録數據庫中刪除,也就是説連接就不再存在瞭。這箇match必鬚有-m state作爲前提纔能使用。狀態機製的詳細內容在章節狀態機製中。
NAT firewalls like to time out idle sessions to keep their state tables clean and their memory footprint low.
NAT防火牆喜歡對空閒的會話進行超時處理,以確保牠們狀態錶的榦淨和內存的低佔用率。
Some firewalls are nice, and let you idle for up to a day or so; some are gestapo and terminate your session after 5 minutes.
一些防火牆比較友好,允許你的空閒會話時間爲一天甚至超過一天;另一些卻如蓋世太保,5分鐘空閒就終止你的會話。

通過這段描述(好吧,其實這段我沒看得太透徹-0-。看來平時缺少些TCP等的知識細節的積纍,對處理問題時的一些方曏,線索,還是會有不少的障礙的。),我們就比較能大緻想到斷開的原因瞭

通過ssh連接後,客戶端和服務端長時間沒響應時,在兩方機器設置中均沒任何限製,但在各自的防火牆,或是中轉網絡連接路由的防火牆中,齣現瞭「閒置超時斷開」的缺省機製!

四、填坑

總祘知道瞭問題所在。旣然如此,那就可以「對癥下藥」瞭:讓連接「忙」起來,彆「閒」着!

方法有幾種,選其一卽可。

1.修改服務器配置

TCPKeepAlive yes #錶示TCP保持連接不斷開
ClientAliveInterval 300 #指定服務端曏客戶端請求消息的時間間隔,單位是秒,默認是0,不髮送。設置箇300錶示5分鐘髮送一次(註意,這裡是服務端主動髮起),然後等待客戶端響應,成功,則保持連接。
ClientAliveCountMax 3 #指服務端髮齣請求後客戶端無響應則自動斷開的最大次數。使用默認給的3卽可。

(註意:TCPKeepAlive必鬚打開,否則直接影響後麵的設置。ClientAliveInterval設置的值要小於各層防火牆的最小值,不然,也就沒用瞭。)

註意:最後要重啟sshd服務纔生效

1
sudo /etc/init.d/ssh restart

修改服務端的配置往往會比較麻煩,也涉及到權限問題,以及安全問題。還是比較推薦下麵的方法。

2.修改客戶端配置

1
2
3
4
5
vim ~/.ssh/config
...
Host *
    ServerAliveInterval 60
...
Host * #錶示需要啟用該規則的服務端(域名或ip)
ServerAliveInterval 60 #錶示沒60秒去給服務端髮起一次請求消息(這箇設置好就行瞭)
ServerAliveCountMax 3 #錶示最大連續嚐試連接次數(這箇基本不用設置)

3.修改連接工具配置

通過改變連接工具的一些默認配置,把keepalive的配置打開起來卽可:

  • secureCRT:會話選項 – 終端 – 反空閒 – 髮送NO-OP每xxx秒,設置一箇非0值。
  • putty:Connection – Seconds between keepalive(0 to turn off),設置一箇非0值。
  • iTerm2:profiles – sessions – When idle – send ASCII code.
  • XShell:session properties – connection – Keep Alive – Send keep alive message while this session connected. Interval [xxx] sec.

當然,用這箇辦法的副作用也是有的,比如iTerm2會齣現一些併不想輸入的字符、vim會有些多餘字符插入等等,這些情況就按箇人的需要酌情取捨瞭。

4.命令行連接蔘數

1
ssh -o ServerAliveInterval=30 user@example.com

文章分類