Linux中: "通过编译安装的方式升级 OpenSSH 服务"

OpenSSH 升级背景:

因为当前操作系统上的 OpenSSH 是通过包管理工具进行安装,因为低版本存在漏洞问题,但是官方仓库中没有最新的 OpenSSH 版本,所以此时只能手动编译源码的方式来实现 OpenSSH 的升级。

因为服务器不是部署到本地,是通过 SSH 远程连接到服务器进行操作,所以还需要考虑,如果编译安装失败,不能影响旧版本的SSH服务,否则就要去机房接显示器操作了。

OpenSSH 刚开始是做为 OpenBSD 操作系统项目的一部分开发而来,后面因为其强大的功能和安全性,所以后面在标准 OpenSSH 的基础上进行了适配和移植,使得能够在其他类 Unix 系统上运行(portable 版本)

OpenSSH 编译流程:

步骤1:首先检查操作系统的OpenSSL 版本,需要保证 OpenSSL ≥ 1.1.1

OpenSSH的正常运行依赖 OpenSSL 或 LibreSSL,所以要编译安装,需要保证版本满足要求:

  • 若系统使用的是 OpenSSL,需要保证 OpenSSL ≥ 1.1.1(常见Linux系统用的都是OpenSSL)
  • 若系统使用的是 LibreSSL ,需要保证 LibreSSL ≥ 3.1.0(OpenBSD 默认就是 LibreSSL)

步骤2:下载 OpenSSH 的源码并上传到服务器解压

下载OpenSSH 源码的时候要注意,OpenSSH 有两个源码版本:

  • OpenBSD 版本:只能 OpenBSD 系统使用,特征就是源码包不携带p后缀。
  • 可移植版本:增加了平台兼容性代码,可以在非OpenBSD系统上运行,特征就是源码包会携带p后缀

OpenSSH 源码包的下载地址:


步骤3:生成 Makefile 文件

./configure --prefix=/usr/local/ssh_10.2  --sysconfdir=/etc/ssh_10.2

OpenSSH 常用的参数如下:

  • --prefix:指定openssh的程序存放路径,不指定默认就是 /usr/local;
  • --exec-prefix:指定可执行程序的存放位置,不指定默认就是 --prefix 指定路径下的bin 和 sbin 目录;
  • --sysconfdir:指定配置文件存放路径,如果该目录下有文件,不会覆盖;不指定默认在 PREFIX/etc
  • --sbindir:指定需要管理员权限才能执行的二进制文件路径,也就是sshd的位置,默认在EPREFIX/sbin
  • --bindir:指定普通用户都有权限执行的二进制文件路径,也就是ssh、scp等的位置,默认在EPREFIX/bin
  • --with-pid-dir:指定pid文件的路径,不指定默认是 /var/run/sshd.pid

步骤4:编译源码和安装

make -j$(nproc) && sudo make install

步骤5:修改 ssh 服务的配置文件

因为需要和当前系统上旧版本的 OpenSSH 服务并行运行,所以新版本的配置文件中,一般需要修改以下几个字段:

  • Port 2222 # 指定ssh服务使用的端口号,不要和现有的ssh服务监听的端口冲突。
  • PidFile /var/run/sshd.pid # 指定主进程pid文件的路径
  • UseDNS no # 禁用DNS反向查找,优化连接速度
  • GSSAPIAuthentication no # 禁用GSSAPI认证,优化连接速度

步骤6:准备 service 服务的配置文件

# /etc/systemd/system/ssh_10.2.service
[Unit]
Description=OpenSSH Server 10.2
After=network.target
Wants=network.target

[Service] 
Type=notify
ExecStartPre=/usr/local/ssh_10.2/sbin/sshd -t -f /etc/ssh_10.2/sshd_config
ExecStart=/usr/local/ssh_10.2/sbin/sshd -D -f /etc/ssh_10.2/sshd_config
ExecReload=/usr/local/ssh_10.2/sbin/sshd -t -f /etc/ssh_10.2/sshd_config
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
RestartSec=3s

[Install]
WantedBy=multi-user.target

因为编译源码的时候使用 --sysconfdir 指定了配置文件默认路径,所以这里不使用 -f 指定路径也可以,加了更直观而已。

sshd -t :检查配置文件的语法是否正确

sshd -D:sshd默认是以守护进程的模式运行,sshd -D 是用于 systemd 管理模式,让 sshd 不要 fork,而是在前台运行,便于 systemd 追踪

/bin/kill -HUP $MAINPID:用来支持 systemctl reload ssh 操作,修改配置文件后,执行这个命令可以让配置生效。

KillMode=process:就是重启或停止ssh服务的时候,已经创建的ssh连接不会受到影响。


步骤7:检查新版本 OpenSSH 服务正常后,停止旧版本OpenSSH

新版本 OpenSSH 服务正常运行后,旧版本不要删除,只要禁止旧服务自动启动即可,等完全稳定后再考虑清楚旧版本OpenSSH的相关文件。

防止 SSH 一旦坏了后无法登录服务器,这样还要跑到机房里面去插显示器操作。

posted on 2025-11-22 16:39  背对背依靠  阅读(2)  评论(0)    收藏  举报