文章目录

  • 说明
  • 配置本地源
  • 配置telnet【可以不做】
  • 说明
  • 允许root登陆
  • 终端登陆配置
  • Login incorrect报错说明
  • 登陆慢原因
  • 登陆很慢
  • 服务安装
  • telnet登录虚拟机
  • 安装依赖包
  • 准备openssh包和openssl的包
  • 将openssl和openssh包上传到服务器
  • 开始安装openssl
  • 升级前版本查看
  • 文件备份
  • 解压tar包
  • 编译安装新版本的openssl
  • 目录做软链接
  • 加载新配置
  • 查看确认版本
  • 报错实例和解决方案
  • 安装openssh
  • 升级前版本查看
  • 文件备份删除
  • 解压tar包
  • 编译安装新版本的openssh
  • 配置root可登录
  • 新文件拷贝
  • 新增sshd服务并设置开机启动
  • 查看确认版本
  • sshd -v和ssh -V版本不一致解决办法
  • 升级到8.6必须操作【否则工具无法连接】
  • 升级完登录测试【重要】
  • 说明
  • 工具测试
  • 别的服务器ssh该台服务器【很重要】
  • ssh别的服务器测试
  • telnet关闭 【未配置telnet忽略】


说明

  • 虚机网络说明
    所有升级操作的机器均无外网,与生产环境内网一致,所以无需担心根据此文档操作自己虚机无外网操作会出问题。
  • 环境说明
    当前服务器使用的版本是7.6,openssh的版本为7.4p1,openssl的版本为1.0.2k
    注:如果openssh版本低于7.4,可以使用镜像升级到yum仓库默认的openssh7.4p1版本【方法为挂载镜像以后,执行:yum update openssh -y 即可】
[root@controll ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@controll ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
[root@controll ~]# sshd -v
unknown option -- v
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]
[root@controll ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@controll ~]#
  • 整个过程不需要卸载原先的openssl包和openssh的rpm包。
  • 本文的环境都是系统自带的openssh,没有经历过手动编译安装方式,如果之前有手动编译安装过openssh【需要修改路径位置】,请参照本文自行测试是否能成功。
  • 如果严格参照本文操作,我保证你升级没问题。
  • 下面命令我均会放完整代码,建议复制粘贴代码,确保升级过程无误。

配置本地源

  • 这个还是需要配置的,后面安装依赖包需要用到。
  • 找一个和系统版本相同的镜像配置本地源,如果不懂的,看下面这篇博客学习一下:

yum源本地配置和网络源配置——超级完整详细

  • 下面是我配置的一个过程,只放命令过程代码,就不对命令做说明了【不懂的看上面连接中博客进行配置】:
[root@controll ~]# scp 192.168.59.129:/home/CentOS-7.6-x86_64-DVD-1810.iso /home
The authenticity of host '192.168.59.129 (192.168.59.129)' can't be established.
ECDSA key fingerprint is SHA256:uvQ2aSyqt5ve6OP4KsUmGPb2P3Gua26u6ggKCAs9RlU.
ECDSA key fingerprint is MD5:c6:cc:20:c3:71:cf:69:90:aa:f3:8a:ec:f5:5c:55:cd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.59.129' (ECDSA) to the list of known hosts.
root@192.168.59.129's password: 
CentOS-7.6-x86_64-DVD-1810.iso                                                                                                                                                100% 4376MB  56.6MB/s   01:17    
[root@controll ~]# ls /home
ccx  CentOS-7.6-x86_64-DVD-1810.iso
[root@controll yum.repos.d]# mkdir /home/centos
[root@controll yum.repos.d]# mount /home/CentOS-7.6-x86_64-DVD-1810.iso /home/centos/
mount: /dev/loop0 is write-protected, mounting read-only
[root@controll yum.repos.d]# df -Th |grep /home/centos
/dev/loop0              iso9660   4.3G  4.3G     0 100% /home/centos
[root@controll yum.repos.d]# 
[root@controll ~]# cd /etc/yum.repos.d/
[root@controll yum.repos.d]# ls
CentOS-Base.repo  CentOS-CR.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Sources.repo  CentOS-Vault.repo
[root@controll yum.repos.d]# mkdir bak
[root@controll yum.repos.d]# mv * bak
mv: cannot move ‘bak’ to a subdirectory of itself, ‘bak/bak’
[root@controll yum.repos.d]# ls
bak
[root@controll yum.repos.d]# scp 192.168.59.129:/etc/yum.repos.d/centos.repo .
root@192.168.59.129's password: 
centos.repo                                                                                                                                                                   100%   76    51.6KB/s   00:00    
[root@controll yum.repos.d]# ls
bak  centos.repo
[root@controll yum.repos.d]# cat centos.repo 
[7.6-bendi]
name=ccx_settin
baseurl=file:///home/centos
gpgcheck=0
enable=1
[root@controll yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
7.6-bendi                                                                                                                                                                                | 3.6 kB  00:00:00     
(1/2): 7.6-bendi/group_gz                                                                                                                                                                | 166 kB  00:00:00     
(2/2): 7.6-bendi/primary_db                                                                                                                                                              | 3.1 MB  00:00:00     
repo id                                                                                             repo name                                                                                             status
7.6-bendi                                                                                           ccx_settin                                                                                            4,021
repolist: 4,021
[root@controll yum.repos.d]#

配置telnet【可以不做】

说明

  • 这个可以不用配置的,生产服务器上也不建议配置开启telnet,这只是简单说明telnet的配置开启方法。
  • 配置telnet的意义就是防止升级ssh过程中远程工具连接中断,但我试了4台机子,全程使用secureCRT工具远程连接,中间没有任何中断,所以可以直接操作【实在中断了再去后台操作就好了】

允许root登陆

  • 现在很多centos7版本安装telnet-server以及xinetd之后没有一个叫telnet的配置文件了。
    如果下面telnet文件不存在的话,可以跳过这部分的更改【默认可以使用root登录】
[root@controll ~]# ll /etc/xinetd.d/telnet
ls: cannot access /etc/xinetd.d/telnet: No such file or directory
[root@controll ~]#
  • 如果下面文件存在,请更改配置telnet可以root登录,把disable = no改成disable = yes
[root@rhel yum.repos.d]# vim /etc/xinetd.d/telnet
[root@rhel yum.repos.d]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#   unencrypted username/password pairs for authentication.
service telnet
{
    disable = yes
    flags       = REUSE
    socket_type = stream       
    wait        = no
    user        = root
    server      = /usr/sbin/in.telnetd
    log_on_failure  += USERID
}

终端登陆配置

配置telnet登录的终端类型,在/etc/securetty文件末尾增加一些pts终端,如下

[root@controll ~]# vim /etc/securetty 
[root@controll ~]# tail -n 4 /etc/securetty 
pts/0
pts/1
pts/2
pts/3
[root@controll ~]#

Login incorrect报错说明

  • 我之前输入正确的密码登陆也提示下面这个内容
    telnet:Login incorrect
  • 查看原因
    cat /var/log/secure
  • openssl安装后python仍然为旧版本 openssh升级后版本没变_linux


  • 解决方法
    我特么/etc/securetty 这个文件中的pts我输错成pst了,害我搞很久拍错,艹。

登陆慢原因

  • 就是出现下面这个密码界面需要挺长时间。
  • 清空/etc/resolv.conf文件或者将/etc/resolv.conf中的nameserver地址改为网卡本身的地址。
    【因为我这不常用telnet,我也没去验证,我是去网上了解原因发现都是这么说的,所以我这也放下原因而已】

登陆很慢

服务安装

  • 安装如下2个服务
[root@controll ~]# yum -y install telnet*
[root@controll ~]# yum -y install xinetd*
  • 启动这2个服务
[root@centos76_2 ~]# systemctl enable telnet.socket
Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.
[root@centos76_2 ~]# systemctl enable xinetd
[root@controll ~]# systemctl start telnet.socket
[root@controll ~]# systemctl start xinetd
[root@controll ~]# systemctl is-active telnet.socket
active
[root@controll ~]# systemctl is-active xinetd
active
[root@controll ~]# 
systemctl enable xinetd
systemctl enable telnet.socket
  • 查看23端口是否被监听
[root@controll ~]# netstat -ntlp | grep 23
tcp6       0      0 :::23                   :::*                    LISTEN      1/systemd           
[root@controll ~]#

telnet登录虚拟机

  • 直接在当前虚拟机输入:telnet ip 回车能登录成功即可【因为没有/etc/xinetd.d/telnet这个文件夹,所以默认是可以用root直接登录的】
[root@controll ~]# telnet 192.168.59.133
Trying 192.168.59.133...
Connected to 192.168.59.133.
Escape character is '^]'.

Kernel 3.10.0-957.el7.x86_64 on an x86_64
controll login: root
Password: 
Last login: Thu May 20 00:25:35 from ::ffff:192.168.59.133
[root@controll ~]# logout
Connection closed by foreign host.
[root@controll ~]#
  • 使用工具的话就是【建议使用xshell连接telnet,如果secureCRT版本过低,会导致连接失败】
    新建一个会话,协议选择为Telnet telnet的端口是23

安装依赖包

  • 注:依赖包只需要镜像中的本地源就足矣了;
  • 升级需要几个组件,有些是和编译相关的等
[root@controll ~]# yum install  -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel
# 我这安装了20个包,如下
Installed:
  autoconf.noarch 0:2.69-11.el7    gcc.x86_64 0:4.8.5-36.el7  gcc-c++.x86_64 0:4.8.5-36.el7  openssl-devel.x86_64 1:1.0.2k-16.el7  pam-devel.x86_64 0:1.1.8-22.el7 
  pcre-devel.x86_64 0:8.32-17.el7 

Dependency Installed:
  cpp.x86_64 0:4.8.5-36.el7                  glibc-devel.x86_64 0:2.17-260.el7    glibc-headers.x86_64 0:2.17-260.el7       kernel-headers.x86_64 0:3.10.0-957.el7  
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7   krb5-devel.x86_64 0:1.15.1-34.el7    libcom_err-devel.x86_64 0:1.42.9-13.el7   libkadm5.x86_64 0:1.15.1-34.el7         
  libselinux-devel.x86_64 0:2.5-14.1.el7     libsepol-devel.x86_64 0:2.5-10.el7   libstdc++-devel.x86_64 0:4.8.5-36.el7     libverto-devel.x86_64 0:0.2.5-4.el7     
  m4.x86_64 0:1.4.16-10.el7                  zlib-devel.x86_64 0:1.2.7-18.el7    

Complete!
[root@controll ~]# yum install  -y pam* zlib*
# 我这安装了3个包,如下
Installed:
  pam_krb5.x86_64 0:2.4.8-6.el7                                                   pam_pkcs11.x86_64 0:0.6.2-30.el7                                                  

Dependency Installed:
  pcsc-lite-libs.x86_64 0:1.8.8-8.el7                                                                                                                               

Complete!

准备openssh包和openssl的包

  • 自行去下载openssh和openssl的tar包
  • 如果不想去找的,可以直接下载我下载好的,链接如下:
  • openssh和openssl_tar包下载
  • 这里面一共有4个文件,分别是:openssh-8.0p1.taropenssh-8.6p1.taropenssl-1.1.1j.taropenssl-1.0.2s.tar
  • 注意:上面的4个包中,openssl如果你当前是1.0的,就只能用openssl-1.0.2s.tar编译【openssl-1.1.1j.tar编译出来会各种出错【因为没有1.1的依赖库】 ,openssh2个版本都可以正常使用。
    如果当前是1.0的,建议不要安装1.1,否则降回去有可能会失败。
  • 这儿需要对这个包做些简单的说明,网上很多帖子说openssh和openssl的包有兼容性这个意思,但我找了很多资料,均没有看到一个正式介绍openssh和openssl使用版本对应。
    所以我做了几个版本测试,发现openssl只要是和自己当前版本一致就不会有问题【当前是1.0的,就安装为1.0的最新版本就不会有问题】,而openssh,安装任何版本都行】

将openssl和openssh包上传到服务器

  • 上传文件有个linux自带命令,很骚,可以直接在secureCRT工具中调用的:
    rz -E ,回车以后会弹出文件选择,选择好点击添加就可以直接上传了。
  • openssl安装后python仍然为旧版本 openssh升级后版本没变_openssh-8.0p1_02

  • 因为我其他服务器有这些包,所以我之间考过来。
    个人习惯喜欢将工具包统一放到 /software里面【根据个人喜好随便放,不影响安装】,不过为了后面可以复制粘贴我的代码,建议你也放到/software里面
[root@controll ~]# mkdir /software
[root@controll ~]# scp 192.168.59.129:/software/* /software/
root@192.168.59.129's password: 
openssh-8.0p1.tar.gz                                                                                                              100% 1560KB  37.2MB/s   00:00    
scp: /software/openssh-8.6p1: not a regular file
openssh-8.6p1.tar.gz                                                                                                              100% 1744KB  38.7MB/s   00:00    
scp: /software/openssl-1.0.2s: not a regular file
openssl-1.0.2s.tar.gz                                                                                                             100% 5224KB  45.0MB/s   00:00    
scp: /software/openssl-1.1.1j: not a regular file
openssl-1.1.1j.tar.gz                                                                                                             100% 9593KB  29.6MB/s   00:00    
[root@controll ~]# cd /software/
[root@controll software]# ls
openssh-8.0p1.tar.gz  openssh-8.6p1.tar.gz  openssl-1.0.2s.tar.gz  openssl-1.1.1j.tar.gz
[root@controll software]#

开始安装openssl

升级前版本查看

主要就是用来对比后面是否升级成功

[root@controll openssl-1.0.2s]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@controll openssl-1.0.2s]#

文件备份

[root@controll software]# ll /usr/bin/openssl 
-rwxr-xr-x. 1 root root 555248 Oct 31  2018 /usr/bin/openssl
[root@controll software]# mv /usr/bin/openssl /usr/bin/openssl_bak
[root@controll software]# ll /usr/include/openssl
total 1864
-rw-r--r--. 1 root root   6146 Oct 31  2018 aes.h
# 还有很多,但为了简洁,我给删了,只保留了上面一个
[root@controll software]# mv /usr/include/openssl /usr/include/openssl_bak
[root@controll software]#

解压tar包

[root@controll software]# ls
openssh-8.0p1.tar.gz  openssh-8.6p1.tar.gz  openssl-1.0.2s.tar.gz  openssl-1.1.1j.tar.gz
[root@controll software]# 
[root@controll software]# tar xfz openssl-1.0.2s.tar.gz

编译安装新版本的openssl

  • 配置、编译、安装3个命令一起执行
    &&符号表示前面的执行成功才会执行后面的
[root@controll software]# cd openssl-1.0.2s/
[root@controll openssl-1.0.2s]# ./config shared && make && make install  
# 这个过程耗费时间挺长的,需要耐心等待
  • 中间一直在闪下面这种内容
  • 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
    成功界面如下

目录做软链接

下面2个文件或者目录做软链接 【刚才前面的步骤mv备份过原来的】

[root@controll openssl-1.0.2s]# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
[root@controll openssl-1.0.2s]# ln -s /usr/local/ssl/include/openssl /usr/include/openssl
[root@controll openssl-1.0.2s]# 
[root@controll openssl-1.0.2s]# ll /usr/bin/openssl
lrwxrwxrwx. 1 root root 26 May 20 01:13 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
[root@controll openssl-1.0.2s]# ll /usr/include/openssl
lrwxrwxrwx. 1 root root 30 May 20 01:13 /usr/include/openssl -> /usr/local/ssl/include/openssl
[root@controll openssl-1.0.2s]#

加载新配置

如果多次重复上面步骤【下面echo内容不要重复做,只做一次即可】,/sbin/ldconfig每次执行都无所谓的。

[root@controll openssl-1.0.2s]# echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
[root@controll openssl-1.0.2s]# /sbin/ldconfig

查看确认版本

  • 不能有报错,报错就完犊子【报错了看下面的解决方案】
  • 见证奇迹的时刻到了
    未报错,成功。
[root@controll openssl-1.0.2s]# openssl version
# 升级前为OpenSSL 1.0.2k-fips  26 Jan 2017
OpenSSL 1.0.2s  28 May 2019
[root@controll openssl-1.0.2s]#

报错实例和解决方案

  • 如果执行openssl version查看版本报错了,大概率是当前openssl包和当前系统不兼容导致的,解决方法,换一个openssl的版本即可
  • 报错查看
[root@centos76_1 openssl-1.1.1j]# openssl version
-bash: /usr/bin/openssl: 没有那个文件或目录
#实际上这个文件肯定是存在的
# 这就是不兼容导致的,直接重装其他版本
[root@centos76_1 openssl-1.1.1j]# ll /usr/bin/openssl 
lrwxrwxrwx. 1 root root 26 5月  19 17:34 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
[root@centos76_1 openssl-1.1.1j]#
  • 重装步骤,重复上面方法,不同的是,上面文件备份换成删除即可
[root@centos76_1 software]# rm -rf /usr/bin/openssl
[root@centos76_1 software]# rm -rf /usr/include/openssl

安装openssh

  • 我这升级的是8.6

升级前版本查看

主要就是用来对比后面是否升级成功

[root@controll software]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
[root@controll software]# sshd -v
unknown option -- v
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]
[root@controll software]#

文件备份删除

  • 如果ssh里面配置的东西比较多,可以备份,升级完成以后把这个文件拷贝回来【如果没有配置过什么东西,直接跳过备份这部,根据下面操作给删掉】
    注:下面编译安装操作成功以后,把这个备份的文件恢复【建议不要恢复,直接参照之前的配置重新配置一遍,极端情况下会因为版本不一致,直接用原来配置会导致ssh出现不可预期的问题】
[root@controll software]# mkdir /etc/ssh.bak
[root@controll software]# cp -r /etc/ssh /etc/ssh.bak/
  • 因为我的服务器是没有对ssh做过什么配置修改的,所以我不用考虑配置问题就直接删掉了
[root@controll software]# rm -rf /etc/ssh/*

解压tar包

[root@controll software]# tar xfz openssh-8.6p1.tar.gz 
[root@controll software]# cd openssh-8.6p1/

编译安装新版本的openssh

  • 配置、编译、安装一起执行
    命令有点长,注意复制完
[root@controll openssh-8.6p1]# pwd
/software/openssh-8.6p1
[root@controll openssh-8.6p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh  --with-openssl-includes=/usr/local/ssl/include  --with-ssl-dir=/usr/local/ssl   --with-zlib   --with-md5-passwords   --with-pam  && make && make install
# 这个过程耗费时间挺长的,需要耐心等待
  • 中间一直在闪下面这种内容
  • 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
    成功界面如下

配置root可登录

  • 上面文件备份步骤说过如果/etc/ssh里面配置太多的话,备份以后就在这恢复就行【重复一次,不建议恢复,直接参照备份的文件,重新配置一次】
  • 这儿只对新文件中的一个地方做修改,就是设置允许root登录【升级完毕以后默认是不允许root登录的】
    在文件/etc/ssh/sshd_config中将PermitRootLogin改为yes即可。
[root@controll openssh-8.6p1]# cat /etc/ssh/sshd_config | egrep -nC 1 PermitRootLogin
31-#LoginGraceTime 2m
32:#PermitRootLogin prohibit-password
33:PermitRootLogin yes
34-#StrictModes yes

新文件拷贝

  • 从原先的解压的包中拷贝一些文件到目标位置【如果目标目录存在就覆盖】
    可能下面的ssh.pam文件没用到,因为sshd_config配置文件貌似没使用它,请自行测试【我这边是拷贝了,反正拷贝也没坏处】
[root@controll openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd
[root@controll openssh-8.6p1]# cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
[root@controll openssh-8.6p1]# chmod +x /etc/init.d/sshd

新增sshd服务并设置开机启动

  • 让chkconfig管理sshd服务并把sshd加入开机自启动
# --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
[root@controll openssh-8.6p1]# chkconfig --add sshd
[root@controll openssh-8.6p1]# systemctl enable sshd
[root@controll openssh-8.6p1]#
  • 把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
    可以移动到任何地方,但建议记住移动的目的位置,便于后续如果需要的话能找到源文件。
[root@controll openssh-8.6p1]# mkdir /data
[root@controll openssh-8.6p1]# mv  /usr/lib/systemd/system/sshd.service  /data/
  • 因为改为chkconfig管理了,所以需要设置sshd服务开机启动
[root@controll openssh-8.6p1]# chkconfig sshd on
Note: Forwarding request to 'systemctl enable sshd.socket'.
Created symlink from /etc/systemd/system/sockets.target.wants/sshd.socket to /usr/lib/systemd/system/sshd.socket.
[root@controll openssh-8.6p1]#
  • 最后重启sshd服务并查看端口是否正常监听
[root@controll openssh-8.6p1]# systemctl restart sshd
[root@controll openssh-8.6p1]# systemctl is-active sshd
active
[root@controll openssh-8.6p1]# 
[root@controll openssh-8.6p1]# netstat -ntlp | grep 22
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      12737/dnsmasq       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      10403/sshd: /usr/sb 
tcp6       0      0 :::22                   :::*                    LISTEN      10403/sshd: /usr/sb 
[root@controll openssh-8.6p1]#

到此 openssh就升级完成了

查看确认版本

  • 上面编译没出错,每一个步骤都做完了,肯定不会有问题的。
    注:ssh -V 【查看SSH版本】和 sshd -v【查看启动文件版本】, 2个都需要执行,并且2个都需要保持一致才算真正的升级成功【如果不一致,解决方法往下看】。
[root@controll openssh-8.6p1]# openssl version
OpenSSL 1.0.2s  28 May 2019
[root@controll openssh-8.6p1]#
[root@controll openssh-8.6p1]# ssh -V
OpenSSH_8.6p1, OpenSSL 1.0.2s  28 May 2019
[root@controll openssh-8.6p1]# sshd -v
unknown option -- v
OpenSSH_8.6p1, OpenSSL 1.0.2s  28 May 2019
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]
[root@controll openssh-8.6p1]#
  • 下面是我升级的8.0结果展示
[root@centos76_3 ~]# openssl version
OpenSSL 1.0.2s  28 May 2019
[root@centos76_3 ~]# 
[root@centos76_3 ~]# ssh -V
OpenSSH_8.0p1, OpenSSL 1.0.2s  28 May 2019
[root@centos76_3 ~]# sshd -v
unknown option -- v
OpenSSH_8.0p1, OpenSSL 1.0.2s  28 May 2019
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]
[root@centos76_3 ~]#

sshd -v和ssh -V版本不一致解决办法

  • 只要按着上班操作步骤做完,不会出现这种问题,只是把这种情况的处理方法放这。
  • -sshd -v和ssh -V不一个版本,需要拷贝下列sshd (ssh -V是正确的)
    cp /usr/local/openssh/sbin/sshd /usr/local/sbin/sshd 【 如果拷贝不成功先删除/usr/local/sbin/的sshd文件。命令如下
    rm -rf /usr/local/sbin/sshd

升级到8.6必须操作【否则工具无法连接】

  • 如果升级的是openssh8.0,忽略这步
  • 升级到8.6以后,如果不做下面操作,会导致crt工具无法连接【但可以从服务器ssh过去】,报错信息如下:
    密钥交换失败。
    没有兼容的加密程序。服务器支持这些加密程序:
    chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
  • openssl安装后python仍然为旧版本 openssh升级后版本没变_linux_03

  • 原因
    SSH和SSL升级后,取消了原先一些不太安全的加密算法,Clinet不支持新的算法所以无法交换密钥;
  • 处理方法
  • 1、要求客户升级SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具,即可正常登录【建议如果这种方法能解决就不要用下面方法】
  • 2、修改ssh配置,添加对原加密算法的支持:
    登录到无法登录的服务器【可以从正常的服务器ssh过去】修改/etc/ssh/sshd_config文件,在文件的末尾添加如下内容,然后重启ssh服务
[root@controll openssh-8.6p1]# tail -n 2 /etc/ssh/sshd_config 
# 下面这行信息很长,注意复制完
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
[root@controll openssh-8.6p1]#
[root@controll openssh-8.6p1]# systemctl restart sshd

升级完登录测试【重要】

说明

openssh升级完毕以后,下面3项必须测试,而且每一项都必须正常才算升级成功,如果有任何一项测试失败,都不行!

工具测试

  • 如果升级了较新版本的openssh,SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具。
  • 升级完毕以后,如果是工具连接的,断开连接,重新连接看是否正常【8.6的版本一定要看上面一步,否则工具无法连接啊,当时我以为升级8.6不行,翻了挺多资料才搞定】

别的服务器ssh该台服务器【很重要】

  • 找一个以前能正常ssh到升级服务器的机器
    发现,报错了【上面升级openssh的主机名为controll,现在是用centos76_2的服务器连接升级服务器测试】
[root@centos76_2 ~]# ssh 192.168.59.133
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:0uTcB4pn/p0X72gZrtG4b7MrgLJJL9Q8Gr1TrDNFThA.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:7
Host key for 192.168.59.133 has changed and you have requested strict checking.
Host key verification failed.
[root@centos76_2 ~]#
  • 原因
    是因为ssh升级过后,服务器的公钥信息改变了,所以导致无法连接的。
  • 解决方法
    在连接服务器vi编辑配置文件~/.ssh/known_hosts,删掉现有升级过ssh的服务器ip信息即可
  • openssl安装后python仍然为旧版本 openssh升级后版本没变_openssl-1.0.2s_04

[root@centos76_2 ~]#  # 已经删了之前记录的信息
[root@centos76_2 ~]# cat  ~/.ssh/known_hosts | grep 133
[root@centos76_2 ~]# ssh 192.168.59.133 # 再次连接已经正常了
The authenticity of host '192.168.59.133 (192.168.59.133)' can't be established.
ED25519 key fingerprint is SHA256:0uTcB4pn/p0X72gZrtG4b7MrgLJJL9Q8Gr1TrDNFThA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.59.133' (ED25519) to the list of known hosts.
root@192.168.59.133's password: 
Last login: Thu May 20 00:28:27 2021 from ::ffff:192.168.59.133
[root@controll ~]#

ssh别的服务器测试

不用修改任何信息,连接任意一台服务器均可正常连接

[root@controll ~]# ssh 192.168.59.129
root@192.168.59.129's password: 
Last login: Wed May 19 22:25:35 2021 from 192.168.59.1
[root@centos76_2 ~]#

telnet关闭 【未配置telnet忽略】

如果配置了telnet并开启了服务,openssh升级完毕测试没问题后可以把telnet服务关闭了【特别是生产服务器】

[root@controll ~]# systemctl stop xinetd
[root@controll ~]# systemctl disable xinetd
Removed symlink /etc/systemd/system/multi-user.target.wants/xinetd.service.
[root@controll ~]# systemctl stop telnet.socket 
[root@controll ~]# systemctl disable xinetd
[root@controll ~]# 
[root@controll ~]# netstat -lntp | grep 23
[root@controll ~]# 
[root@controll ~]# netstat -lntp | grep 22
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      12737/dnsmasq       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      13277/sshd: /usr/sb 
tcp6       0      0 :::22                   :::*                    LISTEN      13277/sshd: /usr/sb 
[root@controll ~]#