SSH连接自动断开问题探究
自己关于SSH连接断开问题的一些探究。
更新2018-03-12
修改sshd_config的keep alive配置没有生效。之前确认的问题原因非真正导致连接断开的原因。使用ssh连接断开的提示信息“timed out waiting for input: auto-logout。”搜索,一篇英文文档说明了TMOUT环境变量作用,该变量是系统检测session空闲时间,如果TMOUT未赋值,则auto-logout功能关闭,即session不会空闲超时关闭;如果设置TMOUT的值,比如TMOUT=300,auto-logout检测session输入,若300s内无输入关闭session自动退出。
TMOUT变量在以下几个文件中会有定义:/etc/profile(全局)或./profile或./bash_profile,其中全局定义的TMOUT会被局部定义的TMOUT覆盖。
echo $TMOUT显示环境变量查看当前超时时间为300s,定义在/etc/profile中,将TMOUT设置为86400(24h),source重新读取配置文件,新建的session 30min内无输入也没有关闭,至此问题解决。
新安装的OS,SSH配置遇到若干问题,第一个问题:root登录失败,用web登录正常,ssh登录提示denied,上网搜寻ssh配置项“PermitRootLogin”默认是no,修改为yes后重启SSH服务,解决。
第二个问题相当棘手,SSH连接几分钟未操作,会自动断开,上网搜索连篇累牍关于keep alive的说明,全部都是配置“ClientAliveInterval”和“ClientAliveCountMax”,修改后重启SSH,没有任何用处,一段时间不操作,连接该断还是断,怀疑网上的配置有误。仔细想想这么多的文章都提到keep alive,问题应该是这里,keep alive选项没有生效,可能不是SSH保活机制问题,而是网络连接机制问题。把sshd_config的配置从头到尾看了一遍,发现有一个“TCPKeepAlive”的选项,搜索了该选项的说明,ClientAlive是SSH发出是加密选项,TCP Alive是协议栈发出,非加密信息,安全性降低。
同时搜索了网上ssh tcp keep alive,有个博文提到,linux的防火墙会检测网络连接,如果没有流量,触发规则防火墙会断开TCP连接,TCP连接终止后,SSH客户端检测连接异常自然无法运行,这才是client keep alive无法生效的根本原因。
从安全角度来说,SSH连接空闲后自动断开,是合理的,对于开发者此行为不方便调试,探究到根本原因,我们需要做的就是适应场景。
手上有几台服务器,CENTOS的服务器没有类似问题,当前这个小众的服务器才有,对比了两个OS的SSH默认配置,CENTOS没有配置keep alive但不会空闲断开。防火墙相关的配置网上没找到,后续碰到再研究。