Ubuntu 升级 OpenSSH 10.2p1 与 OpenSSL 3.5.4 避坑实践
当前服务器系统版本:
root@csb134:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
一、准备工作
1. 配置国内镜像源
Ubuntu 20.04 LTS (focal) 配置如下
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
Ubuntu 22.04 LTS (jammy) 配置如下
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
2. 安装 Telnet 服务
注意:Telnet 以明文传输数据(包括密码),易被窃听。仅建议在内网测试环境中使用,生产环境务必改用 SSH(端口 22)。
在线安装方案
sudo apt update
sudo apt install telnetd xinetd -y
配置 Telnet 服务
写入以下内容(确保 disable = no)
sudo vim /etc/xinetd.d/telnet
service telnet {
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
配置项详细解析
| 配置参数 | 说明与意义 | 必要性/用途 |
|---|---|---|
disable = no | 核心开关:设置为 no 表示启用该服务(yes 表示禁用)。 | ✅ 若不设为 no,则 Telnet 服务无法响应连接请求,如同未安装。 |
flags = REUSE | 允许多个连接复用同一端口,提升端口资源使用率。 | ⚙️ TCP 协议优化选项,对于高并发场景有实际意义,默认配置即可。 |
socket_type = stream | 基于流式 TCP 协议(区别于 UDP 数据报),保障数据的可靠传输。 | ✅ Telnet 基于 TCP,必须设为 stream。 |
wait = no | 并行处理多个客户端连接(若设为 yes 则每次只接受一个连接)。 | ✅ 避免因单用户占用导致其他用户无法登录,需设成 no 实现并发处理。 |
user = root | Telnet 服务进程在系统内以 root 权限运行。 | ⚠️ 高安全风险!即使连接用户非 root,运行服务的进程权限为 root 可能导致权限漏洞。建议改为低权限用户(如 nobody),但需注意部分功能受限。 |
server = /usr/sbin/in.telnetd | 服务程序路径:指定执行 Telnet 服务的守护程序(in.telnetd)。 | ✅ 关键路径设置,程序缺失需安装 telnetd。 |
log_on_failure += USERID | 登录失败时在系统日志中记录发起失败尝试的用户名(若可获取)。 | 🔍 增强安全审计能力,辅助排查攻击源。 |
创建 opi 账号,此账号用于通过 Telnet 登录到服务器
useradd -m -s /bin/bash opi
echo 'opi:!QAZ@WSX' | chpasswd
给予 opi 账号权限
echo "opi ALL=(ALL:ALL) ALL" | sudo tee /etc/sudoers.d/opi-perms
sudo chmod 0440 /etc/sudoers.d/opi-perms
启动服务
/etc/init.d/openbsd-inetd restart
开放防火墙端口(如果 firewalld 正在运行)
# 允许 TCP 流量通过 23 端口
sudo ufw allow 23/tcp
# 重新加载配置使规则生效
sudo ufw reload
# 查看 telnet 服务的默认端口是否启动;netstat -anpt|grep 23
netstat -anpt | grep 23
登陆后切换到 root 账号
opi@csb136:~$ sudo -i
[sudo] password for opi:
root@csb136:~#
离线安装方案
下载离线包
从 https://packages.ubuntu.com/ 或 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/ 下载以下包:
(需根据系统架构选择
amd64或arm64版本)
telnetd_0.17+2.5-5ubuntu1_all.deb
inetutils-telnetd_1.9.4-11ubuntu0.2_amd64.deb
xinetd_2.3.15.3-1_amd64.deb
安装依赖包
将下载的 .deb 文件上传到目标机器,按顺序安装:
sudo dpkg -i telnetd_*.deb
sudo dpkg -i inetutils-telnetd_*.deb
sudo dpkg -i xinetd_*.deb
若提示依赖缺失,用 sudo apt --fix-broken install 修复
配置并启动服务
同在线安装的步骤
连接测试
本地测试:
telnet localhost 23
# 输入用户名/密码尝试登录
远程测试:
telnet <服务器 IP> 23
# 若显示 Connected to... 即成功
补充:Telnet 认证方式
本地系统账号登录
Linux/Unix 系统(如 Ubuntu)允许通过本地系统账号登录,例如 root 或普通用户。Telnet 将用户名/密码提交至系统认证模块(如 PAM),验证是否存在该账户。
专用账户登录
网络设备,如华为交换机/路由器采取 AAA 模式,必须提前创建专用于 Telnet 的账户,通过以下命令配置
aaa local-user admin password cipher *****
local-user admin service-type telnet
local-user admin privilege level 15
企业交换机/路由器通常不开放系统账户(如 root),需管理员手动创建独立账户并通过 VTY 线路绑定认证方式(如 authentication-mode aaa)
密码模式 (无需用户名)
authentication-mode password,登录时只需输入预设密码(无需用户名)
所有用户共享同一密码,权限单一,适合低风险环境临时使用。
3. 编译环境准备
# 1. 卸载原 openssh
sudo apt-get remove openssh-server openssh-client openssl -y
# 2. 更新系统
sudo apt update && sudo apt upgrade -y
# 3. 安装编译依赖
sudo apt install -y build-essential libedit-dev zlib1g-dev libssl-dev \
libpam0g-dev libselinux1-dev libcap-dev wget tar gcc make autoconf automake \
libtool pkg-config checkinstall
二、编译安装 OpenSSL
注意:Ubuntu 20.04 依赖 OpenSSL 1.1.1,升级到 3.5.4 后需确保兼容性(大多数软件支持 OpenSSL 3)。
下载源码
cd /usr/local/src
wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz
# 内网环境
# sudo wget http://10.1.0.67/softs/openssl-3.5.4.tar.gz
tar -xzf openssl-3.5.4.tar.gz
cd openssl-3.5.4
备份原有库
sudo mv /usr/bin/openssl /usr/bin/openssl-$(date +%Y-%m-%d-%H).bak
sudo mv /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1-$(date +%Y-%m-%d-%H).bak
sudo mv /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1-$(date +%Y-%m-%d-%H).bak
编译安装
定义 openssl 安装到 /usr/local/ssl 避免覆盖系统
sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
sudo make -j$(nproc)
sudo make test
sudo make install
配置动态链接
怎么做的原因是让系统优先使用新版,且不覆盖原本的文件
# 创建符号链接
sudo ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
# 可选
# sudo ln -sf /usr/local/ssl/lib64/libssl.so.3 /lib64/libssl.so.3
# sudo ln -sf /usr/local/ssl/lib64/libcrypto.so.3 /lib64/libcrypto.so.3
# 更新 ld.so 缓存
echo "/usr/local/ssl/lib64" | sudo tee /etc/ld.so.conf.d/openssl-3.5.4.conf
sudo ldconfig
验证 OpenSSL 版本
openssl version
# 输出:OpenSSL 3.5.4 xx xxx xxxx 则证明安装成功
三、编译安装 OpenSSH
下载源码
cd /usr/local/src
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
# 内网环境
# sudo wget http://10.1.0.67/softs/openssh-10.2p1.tar.gz
tar -xzf openssh-10.2p1.tar.gz
cd openssh-10.2p1
停止 OpenSSH 服务
注意:以下操作使用 telnet 进行,否则会中断与服务器的连接
systemctl stop sshd
pkill -9 sshd
备份原配置
mkdir -p /root/ssh_backup_$(date +%Y%m%d)
rsync -av /etc/ssh /etc/pam.d /usr/sbin/sshd /usr/bin/ssh /root/ssh_backup_$(date +%Y%m%d)/
配置编译
指定 OpenSSL 路径
sudo ./configure \
--prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-ssl-dir=/usr/local/ssl \
--with-pam \
--with-zlib \
--with-libedit \
--without-hardening \
--with-privsep-path=/var/lib/sshd
--with-ssl-dir=/usr/local/ssl确保使用我们编译的 OpenSSL 3.5.4
应出现以下内容
PAM is enabled. You may need to install a PAM control file for sshd, otherwise password authentication may fail. Example PAM control files can be found in the contrib/ subdirectory
清理旧版本目录
rm -rf /etc/ssh/
rm -rf /usr/bin/sshd
rm -rf /usr/sbin/sshd
编译并安装
sudo make -j$(nproc)
sudo make install
注意:make install 会覆盖:/usr/sbin/sshd /usr/bin/ssh, scp, sftp 等 /etc/ssh/sshd_config(会备份为 sshd_config.install)
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
过程
root@csb136:/usr/local/src/openssh-10.2p1# sudo make install
(cd openbsd-compat && make)
make[1]: Entering directory '/usr/local/src/openssh-10.2p1/openbsd-compat'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/usr/local/src/openssh-10.2p1/openbsd-compat'
/usr/bin/mkdir -p /usr/local/openssh/bin
...
新版本目录
root@csb136:/usr/local/src/openssh-10.2p1# ls /etc/ssh/
total 616K
drwxr-xr-x 2 root root 4.0K Oct 30 14:47 .
drwxr-xr-x 126 root root 12K Oct 30 14:47 ..
-rw-r--r-- 1 root root 568K Oct 30 14:47 moduli
-rw-r--r-- 1 root root 1.5K Oct 30 14:47 ssh_config
-rw------- 1 root root 505 Oct 30 14:47 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 173 Oct 30 14:47 ssh_host_ecdsa_key.pub
-rw------- 1 root root 399 Oct 30 14:47 ssh_host_ed25519_key
-rw-r--r-- 1 root root 93 Oct 30 14:47 ssh_host_ed25519_key.pub
-rw------- 1 root root 2.6K Oct 30 14:47 ssh_host_rsa_key
-rw-r--r-- 1 root root 565 Oct 30 14:47 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 3.3K Oct 30 14:47 sshd_config
备份的旧版本目录
root@csb136:/usr/local/src/openssh-10.2p1# ls /root/ssh_backup_20251030/ssh
total 556K
drwxr-xr-x 3 root root 4.0K Sep 19 10:47 .
drwxr-xr-x 4 root root 4.0K Oct 30 14:31 ..
-rw-r--r-- 1 root root 494K Sep 23 2022 moduli
-rw-r--r-- 1 root root 1.5K Sep 23 2022 ssh_config
drwxr-xr-x 2 root root 4.0K Apr 11 2025 ssh_config.d
-rw------- 1 root root 1.4K Sep 23 2022 ssh_host_dsa_key
-rw-r--r-- 1 root root 601 Sep 23 2022 ssh_host_dsa_key.pub
-rw------- 1 root root 505 Sep 23 2022 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 173 Sep 23 2022 ssh_host_ecdsa_key.pub
-rw------- 1 root root 399 Sep 23 2022 ssh_host_ed25519_key
-rw-r--r-- 1 root root 93 Sep 23 2022 ssh_host_ed25519_key.pub
-rw------- 1 root root 2.6K Sep 23 2022 ssh_host_rsa_key
-rw-r--r-- 1 root root 565 Sep 23 2022 ssh_host_rsa_key.pub
-rw------- 1 root root 3.3K May 7 10:22 sshd_config
-rw-r--r-- 1 root root 3.2K Oct 20 2023 sshd_config.bak.2023-10-20
-rw-r--r-- 1 root root 3.2K Jan 25 2024 sshd_config.bak.20250507-102203
还原关键文件
我们已经将 OpenSSH 10.2p1 采用'隔离安装'方式(避免覆盖系统自带的 OpenSSH),成功编译安装到了自定义前缀 /usr/local/openssh/ 目录,但这样会导致二进制、man 页、配置文件路径都不在标准位置。
要使用新编译的 OpenSSH,就需要把关键文件'还原'到默认路径,否则 ssh, sshd, systemctl restart sshd 等命令还是走旧版本。
| 新安装路径 | 标准系统路径 | 操作建议 |
|---|---|---|
/usr/local/openssh/bin/ssh | /usr/bin/ssh | 备份旧的 → 链接或复制 |
/usr/local/openssh/bin/scp | /usr/bin/scp | 同上 |
/usr/local/openssh/bin/ssh-keygen | /usr/bin/ssh-keygen | 同上 |
/usr/local/openssh/bin/sftp | /usr/bin/sftp | 同上 |
/usr/local/openssh/sbin/sshd | /usr/sbin/sshd | 重点! |
/usr/local/openssh/libexec/* | /usr/libexec/ 或 /usr/lib/openssh/ | 视系统而定 |
/usr/local/openssh/share/man/ | /usr/share/man/ | 可选,man 页 |
mkdir -p /root/ssh_backup_$(date +%Y%m%d)
rsync -av /etc/ssh /etc/pam.d /usr/sbin/sshd /usr/bin/ssh /root/ssh_backup_$(date +%Y%m%d)/
# 1. 备份系统原有文件(非常重要!)
sudo mv /usr/bin/ssh /usr/bin/ssh.$(date +%Y%m%d)
sudo mv /usr/bin/scp /usr/bin/scp.$(date +%Y%m%d)
sudo mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.$(date +%Y%m%d)
sudo mv /usr/bin/sftp /usr/bin/sftp.$(date +%Y%m%d)
sudo mv /usr/sbin/sshd /usr/sbin/sshd.$(date +%Y%m%d)
# 重点
# 2. 创建符号链接(推荐,节省空间,便于切换)
sudo ln -sf /usr/local/openssh/bin/ssh /usr/bin/ssh
sudo ln -sf /usr/local/openssh/bin/scp /usr/bin/scp
sudo ln -sf /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
sudo ln -sf /usr/local/openssh/bin/sftp /usr/bin/sftp
sudo ln -sf /usr/local/openssh/sbin/sshd /usr/sbin/sshd
# 3. 处理 libexec 目录(不同系统路径不同)
# CentOS/RHEL 通常是 /usr/libexec/# Ubuntu/Debian 通常是 /usr/lib/openssh/
sudo mkdir -p /usr/libexec/openssh
sudo ln -sf /usr/local/openssh/libexec/* /usr/libexec/openssh/ 2>/dev/null || true
# Ubuntu/Debian 额外处理
sudo mkdir -p /usr/lib/openssh
sudo ln -sf /usr/local/openssh/libexec/* /usr/lib/openssh/ 2>/dev/null ||
恢复或编辑配置
sudo cp /root/ssh_backup_20251030/ssh/sshd_config /etc/ssh/sshd_config
# 测试配置文件语法(用新版 sshd)
sudo /usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
确保权限正确
sudo chown root:root /etc/ssh/sshd_config
sudo chmod 600 /etc/ssh/sshd_config
重启 SSH 服务
sudo systemctl restart ssh
sudo systemctl status ssh
验证升级结果
# 1. 查看 SSH 版本
ssh -V
# OpenSSH_10.2p1, OpenSSL 3.5.4 30 Sep 2025
# 2. 查看动态链接库
ldd /usr/sbin/sshd | grep -E "ssl|crypto"
# 应指向 /usr/local/ssl/lib/libcrypto.so.3
libcrypto.so.3 => /usr/local/ssl/lib64/libcrypto.so.3 (0x00007f315c2cc000)
回滚方法
如果服务启动时出现问题,通过以下方法进行回滚恢复原版
# 恢复系统原版
sudo rm /usr/bin/ssh /usr/bin/scp /usr/bin/ssh-keygen /usr/bin/sftp /usr/sbin/sshd
sudo mv /usr/bin/ssh.$(date +%Y%m%d) /usr/bin/ssh
sudo mv /usr/bin/scp.$(date +%Y%m%d) /usr/bin/scp
sudo mv /usr/bin/ssh-keygen.$(date +%Y%m%d) /usr/bin/ssh-keygen
sudo mv /usr/bin/sftp.$(date +%Y%m%d) /usr/bin/sftp
sudo mv /usr/sbin/sshd.$(date +%Y%m%d) /usr/sbin/sshd
sudo systemctl restart sshd
常见问题与解决
root@csb134:/usr/local/ssl# sudo ldconfig -v | grep ssl
/sbin/ldconfig.real: 无法对 /usr/local/lib/x86_64-linux-gnu 进行 stat 操作:没有那个文件或目录
/sbin/ldconfig.real: 多次给出路径'/usr/lib/x86_64-linux-gnu'
/sbin/ldconfig.real: 多次给出路径'/lib/x86_64-linux-gnu'
/sbin/ldconfig.real: 多次给出路径'/usr/lib/x86_64-linux-gnu'
/sbin/ldconfig.real: 多次给出路径'/usr/lib'
/usr/local/ssl/lib64: libssl.so.3 -> libssl.so.3
libevent_openssl-2.1.so.7 -> libevent_openssl.so
/sbin/ldconfig.real: /lib/x86_64-linux-gnu/ld-2.31.so is the dynamic linker, ignoring
libssl.so.1.1 -> libssl.so.1.1-2025-10-30-11:21.bak
libssl3.so -> libssl3.so
/sbin/ldconfig.real: 无法对 libpng.so 进行 stat 操作:没有那个文件或目录
libxmlsec1openssl.so. -> libxmlsec1openssl.so..
问题 1:
libssl.so.3: cannot open shared object file: No such file or directory
root@csb134:/etc/ld.so.conf.d# openssl version
openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
确认库文件是否存在
首先确认库文件 libssl.so.3 是否存在
find /usr/local/ssl/ -name "libssl.so.3*"
/usr/local/ssl/lib64/libssl.so.3
- 若有输出路径:(例如
/usr/local/ssl/lib64/libssl.so.3),继续下一步。 - 若无输出:重新检查 OpenSSL 安装过程,确保
make install成功执行。若安装路径错误,需修正路径后重新编译安装
检查动态库路径配置
确保配置文件中路径与实际库路径一致
# 确认配置文件内容
cat /etc/ld.so.conf.d/openssl-3.5.4.conf
# 输出应为:/usr/local/ssl/lib 或 /usr/local/ssl/lib64
# 更新链接库缓存
sudo ldconfig -v | grep ssl
# 检查是否包含你的路径
验证修复结果
# 检查库是否可加载
ldd /usr/bin/openssl | grep libssl
# 检查 OpenSSL 版本
openssl version
# 正常应输出:OpenSSL 3.5.4 11 Oct 2024(Library: OpenSSL 3.5.4 11 Oct 2024)
问题 2:
/sbin/ldconfig.real: 无法对 /lib/libpng.so 进行 stat 操作:没有那个文件或目录
问题原因
某个软件包(比如 libpng-dev、imagemagick、php 等)曾创建软链接 /lib/libpng.so 某个真实文件,但真实文件被删除或升级后,软链接变成'死链'。
解决方法
# 1. 找出所有指向不存在文件的 libpng.so 软链接
sudo find /lib /usr/lib -type l -name "libpng.so*" ! -exec test -e {} \; -ls
# 2. 删除它们
sudo find /lib /usr/lib -type l -name "libpng.so*" ! -exec test -e {} \; -delete
# 3. 如果确实需要 libpng,重新安装系统包(可选)
sudo apt install --reinstall libpng16-16 -y
问题 3:
无法对 /usr/local/lib/x86_64-linux-gnu 进行 stat 操作
排查所有 ld.so 配置文件
ls /etc/ld.so.conf.d/
-rw-r--r-- 1 root root 38 9 月 7 2019 fakeroot-x86_64-linux-gnu.conf
-rw-r--r-- 1 root root 21 10 月 30 11:57 openssl-3.5.4.conf
-rw-r--r-- 1 root root 100 4 月 15 2020 x86_64-linux-gnu.conf
查看哪些 .conf 文件都包含 /usr/lib/x86_64-linux-gnu 路径
解决方法
通过排查发现 x86_64-linux-gnu.conf 文件,第 1 行路径不存在导致 stat 错误
Ubuntu 20.04 默认没有 /usr/local/lib/x86_64-linux-gnu 目录,这个路径是 multiarch 支持的标准路径,但只有在手动创建或安装了对应架构库时才存在
它被写进系统配置文件 ldconfig 每次都尝试扫描发生报错
注释或删除不存在的路径
vim /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
# /usr/local/lib/x86_64-linux-gnu ← 注释掉这行
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
保存退出。
问题 4:
清理旧 OpenSSL 的路径,导致 ldconfig 扫描到一个指向备份文件的软链接。libssl.so.1.1 -> libssl.so.1.1-2025-10-30-11:21.bak
查找所有指向 .bak 的软链接
sudo find /usr/lib /lib /usr/local -name "libssl.so.1.1*" -type l
root@csb134:/etc/ld.so.conf.d# ls /usr/lib/x86_64-linux-gnu/libssl.
libssl.a
libssl.so.1.1-2025-10-30-11:21.bak
libssl.so.1.1
libssl.so.3
删除软连接
sudo rm -f /usr/lib/x86_64-linux-gnu/libssl.so.1.1
清理缓存
# 清理缓存重建
sudo rm -rf /var/cache/ldconfig/*
sudo ldconfig
验证
sudo ldconfig -v 2>/dev/null | grep libssl


