问题现象:
新购coreOS刚开始可以正常远程登陆,但是过一段时间后就无法远程登陆了,如果有留意会发现在登陆系统10分钟左右后窗口会弹出下列信息,通知了系统会在5分钟后重启,机器重启后再次远程连接就发现连接不上了,会直接提示 Connection reset by peer
Broadcast message from locksmithd at 2018-06-06 09:42:14.617503005 +0800 CST:
System reboot in 5 minutes!
root@BJ-CentOS7 ~ # ssh 182.254.xxx.xx
ssh_exchange_identification: read: Connection reset by peer
问题分析:
这里首先考虑到,是不是 SSH 配置发生变化导致无法连接的,于是通过 VNC 方式连接服务器查看 sshd_config 配置文件:
这里看起来也没什么异常的,唯独在centos、Ubuntu等系统的SSH配置中默认没有配置 ciphers 参数,会不会是这个原因,于是注释该行配置(这里发现 coreOS 中 sshd 配置在修改后会自动加载,不需要重启服务)
VM_132_222_coreos ssh # cat /etc/ssh/sshd_config
# Use most defaults for sshd configuration.
UsePrivilegeSeparation sandbox
Subsystem sftp internal-sftp
ClientAliveInterval 180
UseDNS no
ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
KexAlgorithms diffie-hellman-group1-sha1
PasswordAuthentication yes
再次远程连接,果然不再出现 reset 的错误,但是又发现另外一个问题,那就是默认使用 root 用户连接会提示权限拒绝
root@BJ-CentOS7 ~ # ssh 182.254.xxx.xx #IP没有写错哈,这里xxx是故意打码
root@182.254.xxx.xx's password:
Permission denied, please try again.
root@182.254.xxx.xx's password:
Permission denied, please try again.
root@182.254.xxx.xx's password:
Permission denied (publickey,password,keyboard-interactive).
这里找资料了解了下,原来在 CoreOS 中,和其他 Linux 发行版不一样,它的 ssh配置中 PermitRootLogin 默认是 no ,禁止了 Root 登陆,那么我们添加一行配置,再次连接,终于可以连接上了
VM_132_222_coreos ~ # grep Permit /etc/ssh/sshd_config
PermitRootLogin yes
那么再回头看一下,为什么系统会自动重启了,而且重启后机器就不能正常连接了呢?
查找资料,这个问题可能是系统自动更新了,于是我们对比看下初始镜像和重启后系统版本及 ssh 服务版本果然发生变化了,继续发掘才得知是
coreOS 的自动更新策略在搞鬼,ssh 服务更新至 7.6 版本后不再支持数据加密算法 arcfour,blowfish和CAST,可以阅读 openssh7.6 版本发布说明 :
#更新前
VM_132_222_coreos ~ # grep VERSION= /etc/os-release
VERSION=717.3.0
VM_132_222_coreos ~ # ssh -V
OpenSSH_6.7p1, OpenSSL 1.0.1p 9 Jul 2015
#更新后
VM_132_222_coreos ~ # grep VERSION= /etc/os-release
VERSION=1745.7.0
VM_132_222_coreos ~ # ssh -V
OpenSSH_7.6p1, OpenSSL 1.0.2n 7 Dec 2017
问题分析总结:
对 CoreOS 目前了解甚少,对于其一些系统默认策略不了解,着实尴尬
1. CoreOS 会在 启动后10分钟 以及之后的 每隔1个小时 自动检测系统版本,如果检查到新版本就会自动下载下来放到备用分区上,然后依据之前的那个升级策略决定是否自动重启系统
具体的升级检测记录可以通过 journalctl -f -u update-engine 命令查看到
2. CoreOS 每次更新都是一次整体升级,下载完整的系统镜像,然后做 MD5 校验,最后重启一下系统,把内核与外围依赖整个换掉,这就导致 openssh 服务同时被更新,openssh 的一些新特性也被应用
3. 腾讯云提供的默认 CoreOS 镜像版本是 717.3.0,更新频率不及时情况下机器会根据默认或自定义的升级通道检测新版本更新系统,更新通道定义在/etc/coreos/update.conf 文件中,各通道发布更新的频率依次为:
Alpha:每周星期四发布
Beta:每两周发布一次
Stable:每个月发布一次
VM_132_222_coreos ~ # cat /etc/coreos/update.conf
GROUP=stable
解决方案总结:
修改 /etc/ssh/sshd_config 文件:
- 注释 ciphers 参数配置或去掉 openssh 已经不支持的数据加密算法,openssh已不再支持 arcfour,blowfish和CAST 算法,如果有更新的版本发布需要注意 openssh 官网 中对于新版本发布说明中是否有新增不再支持的加密算法
- 添加 PermitRootLogin yes 配置行允许 root 用户 ssh 方式登陆服务器
VM_132_222_coreos ~ # egrep 'ciphers|PermitRootLogin' /etc/ssh/sshd_config
#ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
ciphers aes128-cbc,aes192-cbc,aes256-cbc #注释 ciphers 参数配置或去掉openssh已经不支持的数据加密算法
PermitRootLogin yes #定义允许 root 用户 ssh 方式登陆服务器,不添加此配置默认不允许 root ssh 方式登陆服务器
具体关于CoreOS的更新问题可参考下列地址了解和自定义配置:
https://www.linuxidc.com/Linux/2015-04/116081.htm
https://linux.cn/article-5262-2.html
https://coreos.com/blog