本人对SSH连接断开问题的研究。2018-03-12更新修改sshd_config的keepalive配置没有生效。先前确定的问题原因并不是连接丢失的实际原因。使用ssh连接断开时的提示信息“等待输入超时:自动注销”进行搜索。英文文档解释了TMOUT环境变量的功能。系统使用此变量来检测会话的空闲时间。关闭注销功能,即会话不会空闲超时;如果设置了TMOUT的值,比如TMOUT=300,自动注销会检测会话输入,如果300s内没有输入,会话会自动退出。TMOUT变量将在以下文件中定义:/etc/profile(全局)或./profile或./bash_profile,其中全局定义的TMOUT将被本地定义的TMOUT覆盖。echo$TMOUT显示环境变量查看当前超时时间为300s,在/etc/profile中定义,设置TMOUT为86400(24h),source重新读取配置文件,新建的session在30内没有输入或close分钟,至此问题解决。新安装的操作系统在SSH配置方面遇到了几个问题。第一个问题:root登录失败,web登录正常,ssh登录提示被拒绝,网上搜索ssh配置项“PermitRootLogin”,默认是no,改成yes然后重启SSH服务,解决。第二个问题相当棘手。如果几分钟内没有任何操作,SSH连接将自动断开。在网上搜索了关于keepalive的说明,都是配置了“ClientAliveInterval”和“ClientAliveCountMax”。如果时间不操作,则应断开连接或断开连接。怀疑是网上的配置有误。仔细想想那么多文章提到keepalive。问题应该出在这里。keepalive选项不生效。可能不是SSH保活机制的问题,而是网络连接机制的问题。把sshd_config的配置从头到尾看了一遍,发现有一个“TCPKeepAlive”的选项。我搜索了这个选项的描述。ClientAlive是SSH发送的加密选项,TCPAlive是协议栈发送的。它是非加密信息,安全性降低。同时在网上搜索sshtcpkeepalive。一篇博文提到Linux的防火墙会检测网络连接。如果没有流量,防火墙会触发断开TCP连接的规则。TCP连接终止后,如果连接不正常,SSH客户端自然无法运行,这就是clientkeepalive无法生效的根本原因。从安全的角度来看,空闲后自动断开SSH连接是合理的。开发人员调试此行为很不方便。追根溯源,顺应场景。我手上有几台服务器。CENTOS服务器没有类似问题。当前的利基服务器可以。对比两个OS的SSH默认配置,CENTOS没有配置keepalive,但空闲时不会断开连接。在网上没有找到防火墙相关的配置,以后遇到再研究。
