Linux服务器升级openssh9.9最新版全过程
Linux服务器升级openssh9.9最新版全过程
openssh-9.9p1.tar.gz OpenSSH下载网站
1. openssl
卸载openssl
yum remove openssl -y下载源码,上传到服务器上
tar -xzvf openssl-1.1.1w.tar.gz安装openssl
如果提示插件没有 最好执行
yum -y groupinstall "Development Tools"或者sudo yum updatecd openssl-1.1.1w/ # sudo yum install perl ./config --prefix=/usr make && make install查询安装是否成功
openssl version和ssh -V如果
openssl version查询出来的版本不对 可能是环境vi /etc/profile # 添加 export PATH=/usr/local/openssl/bin:$PATH export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATHsource /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 -V 和 sshd -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远程或者密码登录,设置
PasswordAuthentication和PermitRootLogin
# 查询端口
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.so和libcrypto.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- 解决方法:检查端口占用或权限问题。