ssh_config和sshd_config都是ssh服務(wù)器的配置文件,二者區(qū)別在于,前者是針對(duì)客戶端的配置文件,后者則是針對(duì)服務(wù)端的配置文件。
# 打開
sudo vim /etc/ssh/sshd_config
# 添加
ClientAliveInterval 30
ClientAliveCountMax 6
ClientAliveInterval表示每隔多少秒,服務(wù)器端向客戶端發(fā)送心跳,是的,你沒看錯(cuò)。
ClientAliveInterval表示上述多少次心跳無響應(yīng)之后,會(huì)認(rèn)為Client已經(jīng)斷開。
OpenSSH基于安全的理由,如果用戶連線到SSH Server后閑置一段時(shí)間,SSH Server會(huì)在超過特定時(shí)間后自動(dòng)終止SSH連線。本人習(xí)慣長時(shí)間連接,需要做如下修改:
1、打開ssh配置文件:# vim /etc/ssh/sshd_config
加入如下兩個(gè)參數(shù)保存就可以:
TCPKeepAlive yes
ClientAliveCountMax 360
注:前一個(gè)參數(shù)表示要保持TCP連接,后一個(gè)參數(shù)表示客戶端的SSH連線閑置多長時(shí)間后自動(dòng)終止連線的數(shù)值,單位為分鐘。
2、重啟sshd生效:
/etc/init.d/sshd restart
注:此法適用于所有Linux發(fā)行版的OpenSSH。ClientAliveInterval是設(shè)定SSH強(qiáng)制超時(shí)斷開的參數(shù)
ClientAliveInterval指定了服務(wù)器端向客戶端請(qǐng)求消息的時(shí)間間隔, 默認(rèn)是0,不發(fā)送。而ClientAliveInterval 60表示每分鐘發(fā)送一次,然后客戶端響應(yīng),這樣就保持長連接了。這里比較怪的地方是:不是客戶端主動(dòng)發(fā)起保持連接的請(qǐng)求(如FTerm, CTerm等),而是需要服務(wù)器先主動(dòng)。
另外,至于ClientAliveCountMax,使用默認(rèn)值3即可。ClientAliveCountMax表示服務(wù)器發(fā)出請(qǐng)求后客戶端沒有響應(yīng)的次數(shù)達(dá)到一定值,就自動(dòng)斷開,正常情況下,客戶端不會(huì)不響應(yīng)。
我的sshd配置是設(shè)置/etc/ssh/sshd_config:
TCPKeepAlive yes
ClientAliveInterval 360 #每6分鐘(360秒)向client端發(fā)個(gè)包
ClientAliveCountMax 20 #最多發(fā)20次,這樣可以保持2小時(shí)(7200秒)的連接
一、挖坑
這篇的起因主要是來自上一個(gè)問題「iTerm2中ssh保持連接不斷開」。
原本以為是個(gè)很常見的小問題,隨手一搜,解決辦法一大堆,試了試可行,就覺得沒什么問題了。但,正因?yàn)橛X得太簡單了,在文末去查看了一下服務(wù)端配置,想找找問題起因,結(jié)果卻發(fā)現(xiàn)開辟了一個(gè)深坑……
查看的默認(rèn)配置:
$ echo $TMOUT
$
# ...
#TCPKeepAlive yes
# ...
#ClientAliveInterval 0
#ClientAliveCountMax 3
# ...
二、入坑
1、提問
提個(gè)問題:既然ssh是空閑過久導(dǎo)致連接超時(shí)而斷開,那么「ssh默認(rèn)是多久時(shí)間,會(huì)自動(dòng)斷開連接?」
結(jié)果翻遍大半個(gè)搜索引擎……全都是諸如「如何設(shè)置,才能讓ssh不超時(shí)自動(dòng)斷」這樣的鬼title,而且大部分都是互相抄,復(fù)制粘貼的內(nèi)容……而我想問的問題是「到底多久超時(shí)」,卻沒人說過……或者說,其實(shí)跟本沒有ssh超時(shí)這一說?!
再提個(gè)問題:如果ssh默認(rèn)設(shè)置都沒有限制,那「為什么ssh會(huì)斷開連接?」
本以為是ssh自動(dòng)斷開超時(shí)連接的,但通過配置看到,默認(rèn)值中并沒有做任何限制,那么理論上,ssh的連接是不會(huì)斷開的。那到底是誰,干了這件「壞事」?
2、再問
實(shí)在沒什么頭緒,跑到QQ群問了一番,結(jié)果真有大神回應(yīng),并且順利找到了線索!
最后通過各種摸索,終于知道了問題的主要原因,因?yàn)檫B接是可以的,只是會(huì)超時(shí)斷開,根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)來看,問題就可能出現(xiàn)在一下這幾個(gè)部分[1] :
1. 服務(wù)器存在防火墻,會(huì)關(guān)閉超時(shí)空閑連接,或設(shè)置了關(guān)閉超時(shí)空閑連接。
2. 客服端和服務(wù)器之間存在路由器,路由器也可能帶有防火墻,會(huì)關(guān)閉超時(shí)空閑連接。
3. 客服端存在防火墻,會(huì)關(guān)閉超時(shí)空閑連接。
原來,問題出在防火墻!!
3、追問
為什么會(huì)是防火墻呢?根據(jù)大神指點(diǎn):在iptables的一些NAT配置說明里有提到——
4.3.6 State match 狀態(tài)匹配擴(kuò)展要有內(nèi)核里的連接跟蹤代碼的協(xié)助,因?yàn)樗菑倪B接跟蹤機(jī)制中得到包的狀態(tài)的。這樣我們就可以了解連接所處的狀態(tài)。它幾乎適用于所有的協(xié)議,包括那些無狀態(tài)的協(xié)議,如ICMP和UDP。針對(duì)每個(gè)連接都有一個(gè)缺省的超時(shí)值,如果連接的時(shí)間超過了這個(gè)值,那么這個(gè)連接的記錄就被會(huì)從連接跟蹤的記錄數(shù)據(jù)庫中刪除,也就是說連接就不再存在了。這個(gè)match必須有-m state作為前提才能使用。狀態(tài)機(jī)制的詳細(xì)內(nèi)容在章節(jié)狀態(tài)機(jī)制中。[2]
NAT firewalls like to time out idle sessions to keep their state tables clean and their memory footprint low.
NAT防火墻喜歡對(duì)空閑的會(huì)話進(jìn)行超時(shí)處理,以確保它們狀態(tài)表的干凈和內(nèi)存的低占用率。
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.
一些防火墻比較友好,允許你的空閑會(huì)話時(shí)間為一天甚至超過一天;另一些卻如蓋世太保,5分鐘空閑就終止你的會(huì)話。[3]
通過這段描述(好吧,其實(shí)這段我沒看得太透徹-0-。看來平時(shí)缺少些TCP等的知識(shí)細(xì)節(jié)的積累,對(duì)處理問題時(shí)的一些方向,線索,還是會(huì)有不少的障礙的。),我們就比較能大致想到斷開的原因了——
通過ssh連接后,客戶端和服務(wù)端長時(shí)間沒響應(yīng)時(shí),在兩方機(jī)器設(shè)置中均沒任何限制,但在各自的防火墻,或是中轉(zhuǎn)網(wǎng)絡(luò)連接路由的防火墻中,出現(xiàn)了「閑置超時(shí)斷開」的缺省機(jī)制!
三、填坑
總算知道了問題所在。既然如此,那就可以「對(duì)癥下藥」了:讓連接「忙」起來,別「閑」著!
方法有幾種,選其一即可。
1、修改服務(wù)端配置
TCPKeepAlive yes #表示TCP保持連接不斷開
ClientAliveInterval 300 #指定服務(wù)端向客戶端請(qǐng)求消息的時(shí)間間隔,單位是秒,默認(rèn)是0,不發(fā)送。設(shè)置個(gè)300表示5分鐘發(fā)送一次(注意,這里是服務(wù)端主動(dòng)發(fā)起),然后等待客戶端響應(yīng),成功,則保持連接。
ClientAliveCountMax 3 #指服務(wù)端發(fā)出請(qǐng)求后客戶端無響應(yīng)則自動(dòng)斷開的最大次數(shù)。使用默認(rèn)給的3即可。
(注意:TCPKeepAlive必須打開,否則直接影響后面的設(shè)置。ClientAliveInterval設(shè)置的值要小于各層防火墻的最小值,不然,也就沒用了。)
注意:最后要重啟sshd服務(wù)才生效
sudo /etc/init.d/ssh restart
修改服務(wù)端的配置往往會(huì)比較麻煩,也涉及到權(quán)限問題,以及安全問題。還是比較推薦下面的方法。
2、修改客戶端配置
vim ~/.ssh/config
Host *
ServerAliveInterval 60
這個(gè)在上一個(gè)問題「iTerm2中ssh保持連接不斷開」中有說到的方案。
Host * #表示需要啟用該規(guī)則的服務(wù)端(域名或ip)
ServerAliveInterval 60 #表示沒60秒去給服務(wù)端發(fā)起一次請(qǐng)求消息(這個(gè)設(shè)置好就行了)
ServerAliveCountMax 3 #表示最大連續(xù)嘗試連接次數(shù)(這個(gè)基本不用設(shè)置)
3、修改連接工具的配置
通過改變連接工具的一些默認(rèn)配置,把keepalive的配置打開起來即可:
secureCRT:會(huì)話選項(xiàng) - 終端 - 反空閑 - 發(fā)送NO-OP每xxx秒,設(shè)置一個(gè)非0值。
putty:Connection - Seconds between keepalive(0 to turn off),設(shè)置一個(gè)非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.
當(dāng)然,用這個(gè)辦法的副作用也是有的,比如iTerm2會(huì)出現(xiàn)一些并不想輸入的字符、vim會(huì)有些多余字符插入等等,這些情況就按個(gè)人的需要酌情取舍了。
4、連接參數(shù)-o
ssh -o ServerAliveInterval=30 user@host
四、坑不停
上面基本就把現(xiàn)象,原因,處理方法都說得差不多了,不過,這里還要多說兩句。
一般來說,不建議修改服務(wù)端。會(huì)涉及到權(quán)限問題,以及安全問題。還是比較推薦修改客服端或工具等的方法。查的過程有看到過說關(guān)于抓包看到服務(wù)器發(fā)包時(shí)握手問題的,具體原因……
還有,細(xì)心的讀者可能還會(huì)發(fā)現(xiàn),「三、1」中提到的TCPKeepAlive,其實(shí)還有更深一層的意思和相關(guān)作用。但這里涉及的TCP心跳包,保活,探測(cè)報(bào)文等等……
與上面搭配的還有系統(tǒng)變量echo $TMOUT……
對(duì)上面提到的防火墻問題,前文提到的QQ群大神又幫忙往下查一查,告知還可以看到一個(gè)關(guān)于防火墻配置時(shí)的參數(shù)ip_conntrack_tcp_timeout_established[4],要研究下這個(gè)參數(shù)以及其所在文件的設(shè)置詳情……
好吧……總結(jié)一下就是,有時(shí)從一個(gè)比較「小」的坑,可能就這樣不知不覺的牽扯到了一堆底層的知識(shí),一不留神就蒙逼了……
不過,這種能夠不斷的挖掘深坑,坑中有坑,坑復(fù)一坑,坑坑向上的感覺,總的來說還是非常有意思的。以后要繼續(xù)發(fā)掘……
對(duì)于開頭提到的問題,至少目前是可以「見好就收」了。對(duì)于期間遇到的一些「既有深度又有廣度」的問題,本文無法一一兼顧。一口吃不下一個(gè)廣西粽,一鏟填不平全部的坑,暫時(shí)不能一下子研究到位的,還可以保持關(guān)注,記錄下來。后面有興趣的話,讓我們?cè)俾议_它們的面紗吧。:)
五、參考文檔
Linux系統(tǒng)下的ssh使用(依據(jù)個(gè)人經(jīng)驗(yàn)總結(jié)) (有alive相關(guān)的ssh服務(wù)端和客服端的配置)
ssh配置講解大全(里面有詳細(xì)的debug過程,tcpdump抓包信息)
客戶端連接linux經(jīng)常間隔性斷開鏈接 (點(diǎn)出根源是防火墻問題)
ssh 設(shè)置超時(shí)時(shí)間(文中有一段英文以及翻譯,很有價(jià)值)
linux 配置防火墻 配置nat轉(zhuǎn)發(fā)服務(wù)(提到ip_conntrack_tcp_timeout_established,還有防火墻iptables,NAT等配置,值得研究學(xué)習(xí))
注釋:
http://www.cnblogs.com/whatlonelytear/p/5532433.html??
http://www.360doc.com/content/16/0627/16/1157518_571159455.shtml??
http://blog.chinaunix.net/uid-10697776-id-3341317.html??
http://lilinji.blog.51cto.com/5441000/1129350??
(完)
分類:「 blog 」
發(fā)表時(shí)間:2017-01-24 14:01:52
最后更新:2017-01-28 20:39:23
轉(zhuǎn)載請(qǐng)注明原作者及出處:「 biubiu - http://bluebiu.com/blog/linux-ssh-session-alive.html 」