Linux服务器升级openssh9.9最新版全过程

lishihuan大约 7 分钟

Linux服务器升级openssh9.9最新版全过程

openssh-9.9p1.tar.gz OpenSSH下载网站

openssl-1.1.1w.tar.gz

1. openssl

  • 卸载openssl

    yum remove openssl -y
    
  • 下载源码,上传到服务器上

    tar -xzvf openssl-1.1.1w.tar.gz
    
  • 安装openssl

    如果提示插件没有 最好执行 yum -y groupinstall "Development Tools" 或者 sudo yum update

    cd openssl-1.1.1w/
    # sudo yum install perl
    ./config --prefix=/usr
    make && make install
    
  • 查询安装是否成功 openssl versionssh -V

  • 如果openssl version 查询出来的版本不对 可能是环境

    vi /etc/profile
    # 添加  
    export PATH=/usr/local/openssl/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
    
    

    source /etc/profile

    配置环境变量后可能出现(2个版本不一致)

    [root@localhost openssh-9.9p1]# openssl version
    OpenSSL 1.1.1w  11 Sep 2023
    [root@localhost openssh-9.9p1]# ssh -V
    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    

    解决

    
    

​ -- 待定

./config --prefix=/usr/local/openssl
make
sudo make install

2. openssh

  • 解压

    tar -xzvf openssh-9.9p1.tar.gz
    cd openssh-9.9p1
    
  • 执行编译

    ./configure 
    

    报错1:执行可能会报错

    configure: error: *** zlib.h missing - please install first or check config.log ***
    
    

    执行 sudo yum install zlib-devel 成功后再执行

    报错2:

    configure: error: Your OpenSSL headers do not match your
    	library. Check config.log for details.
    	If you are sure your installation is consistent, you can disable the check
    	by running "./configure --without-openssl-header-check".
    	Also see contrib/findssl.sh for help identifying header/library mismatches.
    
    ./configure --with-ssl-dir=/usr/local/openssl
    
    
  • 安装

    make && make install
    
  • 查询是否安装成功 ssh -V

3. 查询版本

ssh -Vsshd -V nmap -sV -p 22 192.168.1.2 或者用 telnet IP 远程端口

3. 可能存在的问题

可能存在无法xshell连接,所有修改的时候多开几个窗口,另外如果连接不上,可以去关闭SELinux

vi /etc/selinux/config

找到SELINUX=enforcing 将参数修改为SELINUX=disabled

重启示例:shutdown -r now

重启后,运行命令:getenforce,验证SELinux状态为disabled,表明SELinux已关闭

OpenSSH 服务异常

安装 OpenSSH 服务

# CentOS/RHEL
sudo yum install openssh-server

# 验证安装
rpm -qa | grep openssh-server
  • 关键步骤:安装后会自动生成 sshd.service 文件。

启动并启用服务

# 启动服务
sudo systemctl start sshd

# 设置开机自启
sudo systemctl enable sshd

# 验证服务状态
systemctl status sshd
  • 预期输出:显示服务为 active (running),并监听 22 端口。
[root@localhost ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2025-05-07 20:58:34 CST; 52s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 2480 (sshd)
   CGroup: /system.slice/sshd.service
           └─2480 /usr/sbin/sshd -D

May 07 20:58:34 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
May 07 20:58:34 localhost.localdomain sshd[2480]: Server listening on 0.0.0.0 port 22.
May 07 20:58:34 localhost.localdomain sshd[2480]: Server listening on :: port 22.
May 07 20:58:34 localhost.localdomain systemd[1]: Started OpenSSH server daemon.

验证版本

[root@localhost sbin]# ssh -V
OpenSSH_9.9p1, OpenSSL 1.1.1k  25 Mar 2021
[root@localhost sbin]# telnet 192.168.75.128 22
Trying 192.168.75.128...
Connected to 192.168.75.128.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4

如果版本不对,查询目前sshd 服务位置执行覆盖

[root@localhost ~]# whereis sshd 
sshd: /usr/sbin/sshd /usr/sbin/sshd.bak /usr/local/sbin/sshd /usr/share/man/man8/sshd.8.gz /usr/share/man/man8/sshd.8
# 分别查询新版本的版本号,这里明确那个是新版本哪个是老版本
/usr/local/sbin/sshd -V
/usr/sbin/sshd -V
  • 用新版本 覆盖老版本
# 备份
cp /usr/sbin/sshd{,.bak2}
# 覆盖 【如果提示 cp: cannot create regular file ‘/usr/sbin/sshd’: Text file busy  可以先删除 rm -rf /usr/sbin/sshd 】
cp /usr/local/sbin/sshd /usr/sbin/
# 重启
systemctl start sshd
  • 检查服务
ps aux | grep sshd | grep -v grep
  • 测试远程连接,如果失败,则查询端口

    这里需要注意,可能无法root远程或者密码登录,设置 PasswordAuthenticationPermitRootLogin

# 查询端口
sudo netstat -tulnp | grep sshd
# 查询连接  /   修改 /etc/ssh/sshd_config
PasswordAuthentication yes      # 启用密码认证
PubkeyAuthentication yes       # 启用公钥认证
PermitRootLogin yes            # 允许 Root 登录(生产环境建议关闭)
# 修改后重启
sudo systemctl restart sshd
  • 如果以上还是无法进行,先卸载旧版,然后重现升级,具体如下

停止旧版本服务并删除残留


# 强制终止所有旧版本进程
sudo pkill -f "/usr/sbin/sshd"

# 卸载旧版 OpenSSH(RPM 或 DEB 包)
sudo rpm -e openssh-server openssh-clients  # CentOS/RHEL
sudo apt remove openssh-server openssh-client  # Ubuntu/Debian

更新 Systemd 服务配置

# 编辑服务单元文件
sudo systemctl edit sshd.service

# 添加以下内容(假设新版本路径为 /usr/local/openssh/sbin/sshd)
[Service]
ExecStart=
ExecStart=/usr/local/openssh/sbin/sshd -D -f /usr/local/etc/sshd_config

# 重载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart sshd

3. 验证新服务状态

Bash# 检查进程路径
ps aux | grep sshd | grep -v grep | grep "/usr/local/openssh/sbin/sshd"

# 确认端口监听
sudo netstat -tulnp | grep :22
# 正确输出应包含新版本路径,如:
# tcp   0   0 0.0.0.0:22   0.0.0.0:*   LISTEN   1234/sshd

4. 检查 SELinux 和防火墙

Bash# 修复 SELinux 上下文(若启用)
sudo semanage fcontext -a -t sshd_exec_t "/usr/local/openssh/sbin/sshd"
sudo restorecon -v /usr/local/openssh/sbin/sshd

# 开放防火墙端口(若修改了端口)
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload

5. 日志排查

Bash# 查看实时日志验证服务启动
sudo journalctl -fu sshd

# 检查配置语法(避免错误)
sudo /usr/local/openssh/sbin/sshd -t -f /usr/local/etc/sshd_config
  • 无输出表示配置正确,否则按错误提示修复

sshd_config 可以开启日志

  • 具体步骤

    • 打开 sshd_config 文件,通常位于 /etc/ssh/ 目录下。
    • 找到 SyslogFacility 和 LogLevel 这两个配置项。如果没有,则手动添加。
    • 将 SyslogFacility 设置为 LOCAL6 或其他未被占用的本地日志设施,例如: SyslogFacility LOCAL6 。
    • 将 LogLevel 设置为 DEBUG3 ,以获取更详细的日志信息,例如: LogLevel DEBUG3 。
    • 保存文件并重启 sshd 服务后
  • 查看日志

    • 可通过以下命令查看日志: sudo tail -f /var/log/syslog
    • 如果之前将 SyslogFacility 设置为 LOCAL6 ,也可以使用以下命令查看特定日志:sudo tail -f /var/log/local6.log
    • 这样就能通过日志来分析 sshd 服务启动失败的原因了。不过,在查看完问题后,建议将 LogLevel 设置回较低的值,如 INFO ,以避免日志文件过大。

错误场景

1. 无法启动报下面的错误

[root@localhost openssh-9.9p1]# systemctl start sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.

1. 配置文件语法错误

问题分析

如果 sshd_config 文件存在语法错误(如不支持的参数或格式错误),服务启动时会直接退出并报错。

验证与修复步骤
# 检查配置文件语法
sudo /usr/sbin/sshd -t -f /etc/ssh/sshd_config
  • 无输出:表示语法正确。
  • 报错示例
    /etc/ssh/sshd_config line 15: Bad configuration option: PermitRootLogin
    
    • 修复方法:根据错误提示修改或注释掉无效行,确保参数与 OpenSSH 9.9 兼容。

2. 密钥文件权限问题

问题分析

SSH 服务对密钥文件(如 /etc/ssh/ssh_host_rsa_key)的权限要求严格,权限不当会导致服务拒绝启动。

验证与修复步骤
# 检查密钥文件权限
ls -l /etc/ssh/ssh_host_*_key

# 修复权限
sudo chmod 600 /etc/ssh/ssh_host_*_key
sudo chown root:root /etc/ssh/ssh_host_*_key
  • 预期权限-rw-------(600)。

3. 服务单元配置错误

问题分析

手动安装 OpenSSH 后,若未更新 Systemd 服务文件中的 ExecStart 路径,可能导致服务启动时加载旧版本或错误路径。

验证与修复步骤
# 查看服务文件中的启动命令
systemctl cat sshd.service | grep "ExecStart"

# 编辑服务文件(示例路径)
sudo systemctl edit sshd.service
  • 添加以下内容
    [Service]
    ExecStart=
    ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd_config
    
  • 重载服务
    sudo systemctl daemon-reload
    sudo systemctl restart sshd
    

4. 动态库依赖缺失

问题分析

手动编译安装 OpenSSH 时,若未正确配置依赖库(如 OpenSSL 或 zlib),可能导致 sshd 启动失败。

验证与修复步骤
# 检查动态库链接
ldd /usr/sbin/sshd | grep "not found"

# 更新库路径(假设新库在 /usr/local/openssl/lib)
echo "/usr/local/openssl/lib" | sudo tee -a /etc/ld.so.conf
sudo ldconfig
  • 关键点:确保 libssl.solibcrypto.so 版本与编译时一致。

5. 旧版本服务残留

问题分析

系统中可能存在旧版本 sshd 进程或 RPM 包残留,导致端口冲突或文件路径混乱。

验证与修复步骤
# 终止所有旧进程
sudo pkill -f "/usr/sbin/sshd"

# 卸载旧版 RPM 包(CentOS/RHEL)
sudo rpm -e openssh-server
  • 确认路径:通过 ps aux | grep sshd 检查新版本进程路径是否为 /usr/sbin/sshd

6. SELinux 或防火墙限制

问题分析

SELinux 上下文错误或防火墙规则可能阻止新版本服务正常运行。

验证与修复步骤
# 修复 SELinux 上下文
sudo restorecon -v /usr/sbin/sshd /etc/ssh/sshd_config

# 检查防火墙端口
sudo firewall-cmd --list-ports | grep 22
  • 若端口未开放
    sudo firewall-cmd --permanent --add-port=22/tcp
    sudo firewall-cmd --reload
    

7. 查看详细日志定位问题

通过 journalctl 查看启动失败的详细信息:

sudo journalctl -u sshd.service --since "2025-05-07 00:00" -xe
  • 关键日志示例
    sshd[1234]: error: Bind to port 22 on 0.0.0.0 failed: Permission denied
    
    • 解决方法:检查端口占用或权限问题。