暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

麒麟 Linux|Linux 远程登录(SSH)失败全解析:99% 的坑都在这里!

安呀智数据坊 2025-09-02
175

注: 本文为安丫科技刘峰的原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

Linux 远程登录(SSH)几乎是所有运维人员的“第一关”。

但你是否遇到过这样的情况:

  • 能 ping 通,就是连不上?

  • 服务跑得好好的,客户端却提示“连接被拒绝”?

  • 密码输入正确,却反复被打回?

  • 用户没问题,登录后却直接断开?

这些场景其实都很常见。

本文带你 从网络层 → 服务层 → 认证层 → 用户层 全链路拆解 SSH 登录失败的所有可能原因,给出 检查参数 → 实验复现 → 解决方案,手把手教你定位问题。

无论是运维新人,还是一线 DBA,照着这篇走,你能解决 99% 的 SSH 登录失败问题。

Linux 远程登录(以 SSH 为例)是系统管理的核心操作,但实际使用中常因网络、服务配置、认证机制等问题导致登录失败,如图1-1所示。

图1-1


所有实验基于Kylin Server V10 环境,客户端为 Windows 10(使用 PuTTY/Xshell)或 Linux 主机(使用ssh命令)。


01

 网络层故障:远程主机不可达  

网络是远程登录的基础,若客户端与目标主机无法建立网络连接,后续认证环节无从谈起。


1

 可能原因 

  • 目标主机 IP 地址错误或主机名解析失败;

  • 客户端与目标主机不在同一网段,且无路由可达;

  • 目标主机网卡未启用或 IP 配置错误;

  • 客户端 目标主机防火墙(firewalld/iptables)拦截 SSH 端口(默认 22);

  • 物理网络故障(网线松动、交换机故障等)。


2

关键检查参数


3

 实验过程:模拟 “防火墙拦截 SSH 端口” 场景 

实验目标


验证 “目标主机防火墙未开放 SSH 端口” 导致的登录失败,并解决问题。


实验步骤


1)目标主机(192.168.2.46)配置:关闭 SSH 服务放行

1. 查看当前防火墙开放端口(默认未开放22端口时,无22/tcp记录)
firewall-cmd --list-ports
--输出如下
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens224
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks

2. 若已开放,手动移除ssh服务(模拟故障场景)
firewall-cmd --permanent --remove-service=ssh 
firewall-cmd --reload  # 重载配置生效


2)客户端测试登录:验证失败

# Linux客户端执行(Windows客户端用CRT连接192.168.2.46:22
ssh root@192.168.2.46



失败现象

长时间无响应,最终提示ssh: connect to host 192.168.2.46 port 22: No route to host。

验证端口连接

telnet 192.168.2.46 22
--输出如下
Trying 192.168.2.46...
telnet: connect to address 192.168.2.46: No route to host


3)定位故障:检查防火墙规则

# 目标主机执行,确认ssh未开放
firewall-cmd --list-all | grep service
  services: cockpit dhcpv6-client


4)解决问题:开放 SSH服务

# 目标主机执行,永久开放22端口并重载
firewall-cmd --permanent --add-service=ssh 
firewall-cmd --reload

# 再次验证端口开放状态
firewall-cmd --list-all | grep service 
  services: cockpit dhcpv6-client ssh # 输出包含“ssh”即为成功


5)重新测试登录:验证成功

ssh root@192.168.2.46  
root@192.168.2.46's password:    # 可正常提示输入密码


02

 SSH 服务层故障:服务未启动

 或配置错误  


SSH 服务(sshd)是远程登录的 “服务器端程序”,若服务未运行或核心配置错误,会直接拒绝客户端连接。


1

可能原因 

  • sshd服务未启动或未设置开机自启;

  • SSH 服务配置文件(/etc/ssh/sshd_config)关键参数错误(如端口、允许登录用户、认证方式);

  • sshd服务异常崩溃(如内存不足、配置文件语法错误);

  • 系统中存在与sshd冲突的进程(占用 SSH 端口)。


2

 关键检查参数 


3

 实验过程:模拟 “sshd 服务未启动” 场景 

实验目标


验证 “sshd服务未启动” 导致的登录失败,并恢复服务。


实验步骤


1)目标主机(192.168.2.46)配置:停止 sshd 服务

# 停止sshd服务并禁止开机自启(模拟故障)
systemctl stop sshd
systemctl disable sshd

# 验证服务状态(应为inactive)
systemctl status sshd
# 输出示例:
# ● sshd.service - OpenSSH server daemon
#    Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
#    Active: inactive (dead) since ...


2)客户端测试登录:验证失败

ssh root@192.168.2.46


失败现象

长时间无响应,最终提示ssh: connect to host 192.168.2.46 port 22: No route to host。


3)定位故障:检查 sshd 服务与端口

# 目标主机执行,确认sshd未运行
systemctl status sshd  # 状态inactive
netstat -tulnp | grep 22  # 无sshd进程监听22端口


4)解决问题:启动 sshd 服务

# 启动sshd并设置开机自启
systemctl start sshd
systemctl enable sshd

# 验证服务状态(应为active)
systemctl status sshd
# 输出示例:
sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
     Active: active (running) since Mon 2025-09-01 23:08:26 CST; 10s ago


5)重新测试登录:验证成功

ssh root@192.168.2.46  # 可正常提示输入密码


03

 认证层故障:密码 密钥认证失败  

网络与服务正常后,认证是登录的核心环节,分为 “密码认证” 和 “密钥认证” 两类故障。

1

 密码认证失败 

1. 可能原因


  • 用户名错误(如输入 “root” 误写为 “roo”);

  • 用户密码错误(包括大小写错误、特殊字符遗漏);

  • sshd_config禁用密码认证(PasswordAuthentication no);

  • 用户被锁定(/etc/shadow中密码字段前有 “!” 或 “*”);

  • 用户过期(/etc/shadow中过期时间字段超期)。


2. 关键检查参数



3. 实验过程:模拟 “密码认证被禁用” 场景


1) 实验目标

验证 “sshd_config设置PasswordAuthentication no” 导致密码登录失败,并恢复配置。


2) 实验步骤

① 目标主机(192.168.2.46)配置:禁用密码认证

# 编辑sshd_config文件
vi etc/ssh/sshd_config

# 修改以下配置(若注释则取消注释)
PasswordAuthentication no

# 重启sshd服务生效
systemctl restart sshd


② 客户端测试密码登录:验证失败

ssh root@192.168.2.46


失败现象

客户端提示root@192.168.2.46: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).(即使输入正确密码也反复提示错误);目标主机日志显示:

tail -f var/log/secure
#输出示例
Sep  1 22:19:37 db1 sshd[928]: Received signal 15; terminating.
Sep  1 22:19:37 db1 sshd[3467]: Server listening on 0.0.0.0 port 22.
Sep  1 22:19:37 db1 sshd[3467]: Server listening on :: port 22.
Sep  1 22:19:41 db1 sshd[3468]: Connection closed by authenticating user root 192.168.2.45 port 53160 [preauth]
Sep  1 22:20:50 db1 sshd[3472]: Connection closed by authenticating user root 192.168.2.45 port 53162 [preauth]


3)定位故障:检查密码认证配置

# 目标主机执行,确认配置禁用密码认证
grep "PasswordAuthentication" /etc/ssh/sshd_config
# 输出:PasswordAuthentication no


4)解决问题:启用密码认证

# 编辑sshd_config,恢复密码认证
vi etc/ssh/sshd_config
PasswordAuthentication yes  # 修改为yes

# 重启sshd服务
systemctl restart sshd


5)重新测试密码登录:验证成功

ssh root@192.168.2.46  # 输入正确密码后成功登录


04

 用户层故障:用户本身不可登录  

即使网络、服务、认证均正常,若用户本身被系统限制登录,仍会导致远程登录失败。

这类故障的核心是 “用户属性配置不符合登录要求”,需从 Shell、账号状态、家目录权限等维度排查。


1

 可能原因 

  • 用户 Shell 设置为 “不可交互 Shell”(如/sbin/nologin、/bin/false),无法建立登录会话;

  • 用户家目录(~)权限过宽(如其他用户可写),SSH 为安全拒绝登录;

  • 用户账号被设置 “不可登录” 标记(/etc/passwd中用户 ID 小于 1000 且无登录权限);

  • 临时文件目录(如/tmp)权限异常或磁盘满,导致登录时无法创建临时文件。


2

 关键检查参数 


3

 实验过程 1:模拟 “用户 Shell 为 

 /sbin/nologin” 场景

实验目标


验证 “用户 Shell 设置为/sbin/nologin” 导致远程登录失败,并修改为可交互 Shell。


实验步骤


1)目标主机(192.168.2.46)配置:修改用户 Shell

# 创建测试用户test,并设置Shell为/sbin/nologin
useradd -s sbin/nologin test
echo "test123" | passwd --stdin test  # 设置密码(确保密码正确)

# 验证Shell配置(最后一列为/sbin/nologin)
grep "test" /etc/passwd
# 输出示例:test:x:1001:1001::/home/test:/sbin/nologin


2)客户端测试登录:验证失败

ssh test@192.168.2.46
test@192.168.2.46's password: 
Last failed login: Mon Sep  1 22:40:37 CST 2025 from 192.168.2.45 on ssh:notty
There was 1 failed login attempt since the last successful login.
This account is currently not available.
Connection to 192.168.2.46 closed.


失败现象

输入密码后提示This account is currently not available.(账号当前不可用),直接断开连接;目标主机日志显示:

tail -f var/log/secure
# 输出示例:
Sep  1 22:41:39 db1 sshd[3717]: pam_unix(sshd:session): session opened for user test(uid=54322) by test(uid=0)
Sep  1 22:41:39 db1 sshd[3738]: Received disconnect from 192.168.74.45 port 50390:11: disconnected by user
Sep  1 22:41:39 db1 sshd[3738]: Disconnected from user test 192.168.74.45 port 50390
Sep  1 22:41:39 db1 sshd[3717]: pam_unix(sshd:session): session closed for user test


3)定位故障:确认 Shell 类型

# 目标主机执行,确认Shell为不可交互类型
cat etc/shells  # 查看系统支持的可交互Shell(如/bin/bash、/bin/sh)
grep "test" /etc/passwd  # 确认test用户Shell为/sbin/nologin(不在/etc/shells列表中)
test:x:54322:54331::/home/test:/sbin/nologin


4)解决问题:修改为可交互 Shell

# 将test用户的Shell修改为/bin/bash(系统支持的可交互Shell)
usermod -s bin/bash test

# 验证修改结果(最后一列为/bin/bash)
grep "test" /etc/passwd
test:x:54322:54331::/home/test:/bin/bash


5)重新测试登录:验证成功

ssh test@192.168.2.46  # 输入密码后成功登录,显示test用户的命令行提示符


05

 Linux 远程登录失败场景总表

(全场景梳理)

为方便快速排查,将所有场景按 “故障层级” 整理为总表,包含 “场景分类→可能原因→核心检查命令→解决方案关键词”


06

 故障排查方法论(通用流程) 

遇到 Linux 远程登录失败时,建议按以下 “从底层到上层” 的流程逐步排查,避免盲目操作:

1)先查网络:用ping验证主机可达性,telnet 目标IP 端口(如telnet 192.168.2.46 22)验证端口是否开放;

2)再查服务:登录目标主机(本地或 KVM),用systemctl status sshd确认服务状态,sshd -t检查配置语法;

3)后查认证:查看/var/log/secure日志(核心日志文件),根据 “Failed password”“bad ownership” 等关键词定位认证问题;

4)最后查用户 / 特殊策略:确认用户 Shell、家目录权限,检查 SELinux 状态和连接数上限。

通过以上流程,可覆盖 99% 以上的 Linux 远程登录失败场景,结合本文的实验步骤和参数检查方法,能高效解决问题。


写在最后


SSH 登录失败,看似千奇百怪,其实都能归纳到 网络 → 服务 → 认证 → 用户 四个层级。
运维高手不是没遇到过问题,而是能在第一时间想到 从哪一层切入,快速定位。

👉 记住:

  • 先验证“能不能连上”;

  • 再确认“服务跑没跑”;

  • 接着排查“认证机制”;

  • 最后才是“用户属性”。

只要掌握了这套方法论,Linux 远程登录再难搞的故障,你都能迎刃而解。

💡 下期,我们会继续带来 SSH 安全加固 & 高可用场景配置 的实战分享,敬请期待!

作者介绍

大家好,我是刘峰,安丫科技创始人 & 数据库技术高级讲师,专注于 PostgreSQL、国产数据库运维与迁移、数据库性能优化 等方向。

作为 PG中国分会官方授权讲师、PostgreSQL ACE 讲师认证专家,我长期活跃在一线项目实战中,拥有 10年以上大型数据库管理与优化经验,曾深度参与电信、金融、政务等多个行业的数据库性能调优与迁移项目。

欢迎关注我,一起深入探索数据库的无限可能,技术交流不设限!

📌 觉得有收获的话,记得点赞、收藏、转发支持一下哦,别忘了关注我获取更多数据库干货~


END

关键词回复(可见相应文章):

oracle、mysql、pg、postgresql、sql、性能优化、故障处理、数据迁移、备份恢复、版本升级、补丁管理、深度巡检、解决方案、架构设计......

小助手

有任何问题或疑问,欢迎加V进群探讨哦~


\ | /

动动你的手指

【安呀智数据坊】加个星标吧~

这样你就不会丢下我啦~

记得加星标呀!

文章转载自安呀智数据坊,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论