SSH 连接被拒问题排查与解决全指南
在使用 SSH 连接 Linux 虚拟机或服务器时,“连接被拒” 是常见问题。本文将以 “sshd 服务未启动” 为切入点,详细介绍排查思路、解决方法及预防措施,帮助你快速恢复 SSH 连接。
核心原因:sshd 服务状态异常
SSH 连接依赖 sshd 服务(SSH 服务器进程),若服务未启动或异常,会直接导致连接被拒。以下是针对性的排查与解决步骤:
检查 sshd 服务状态
登录 Linux 系统(如通过虚拟机控制台),执行以下命令查看 sshd 状态:
1 | # 方法 1:通过 init.d 脚本查看 |
状态解读:
- active (running):服务正常运行,排除服务未启动的问题。
- inactive (dead) 或 stopped:服务未启动,需手动启动。
启动或重启 sshd 服务
若服务未启动,执行以下命令恢复:
1 | # 启动服务 |
验证:再次执行 service sshd status,确认状态为 running。
设置 sshd 开机自启
为避免系统重启后 sshd 服务未自动启动,需配置开机自启:
1 | # 方法 1:使用 chkconfig(CentOS 6 及以下) |
说明:运行级别 3 为命令行模式,5 为图形界面模式,覆盖这两个级别可确保不同场景下服务均能自启。
扩展排查:其他导致 SSH 连接被拒的原因
若 sshd 服务正常运行但仍连接被拒,需排查以下常见问题:
防火墙阻止 SSH 端口(默认 22)
Linux 防火墙(如 iptables)可能未开放 22 端口,导致连接被拦截:
1 | # 查看防火墙规则(检查 22 端口是否允许) |
CentOS 7+ 防火墙(firewalld):
1 | # 查看开放端口 |
SSH 配置文件限制连接
/etc/ssh/sshd_config 是 sshd 的核心配置文件,若存在以下限制会导致连接被拒:
1 | # 编辑配置文件 |
需检查的关键配置:
Port 22:确认端口是否为 22(若修改过端口,连接时需指定-p 端口号)。PermitRootLogin yes:是否允许 root 用户登录(默认可能为prohibit-password或no)。AllowUsers 用户名:若配置了此选项,仅列出的用户可登录,需确保你的用户名在列。PasswordAuthentication yes:是否允许密码认证(若为no,需使用密钥认证)。
生效配置:修改后需重启 sshd 服务:
1 | service sshd restart |
网络连接问题
IP 地址错误:确认目标主机 IP 正确(通过
ifconfig或ip addr查看)。网络不通:通过
ping 目标IP检查网络连通性,若不通需排查虚拟机网络配置(如桥接 / NAT 模式是否正确)。端口占用:其他服务可能占用 22 端口,导致sshd启动失败:
1
2# 查看 22 端口占用情况
netstat -tlnp | grep 22
连接测试与验证
解决上述问题后,通过以下方式验证 SSH 连接:
1 | # 从客户端连接(替换为目标 IP) |
成功标志:提示输入密码(或直接登录,若配置了密钥认证),无 “Connection refused” 错误。
预防措施:避免 SSH 连接问题复发
- 定期检查服务状态:通过脚本监控
sshd运行状态,异常时自动重启。 - 备份配置文件:修改
sshd_config或防火墙规则前,备份原始文件(如cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak)。 - 使用非默认端口:修改 SSH 端口(如 2222)可减少恶意扫描,需同步更新防火墙规则。
- 启用密钥认证:相比密码认证更安全,且可避免密码错误导致的连接失败