0%

使用ssh连接被拒

SSH 连接被拒问题排查与解决全指南

在使用 SSH 连接 Linux 虚拟机或服务器时,“连接被拒” 是常见问题。本文将以 “sshd 服务未启动” 为切入点,详细介绍排查思路、解决方法及预防措施,帮助你快速恢复 SSH 连接。

核心原因:sshd 服务状态异常

SSH 连接依赖 sshd 服务(SSH 服务器进程),若服务未启动或异常,会直接导致连接被拒。以下是针对性的排查与解决步骤:

检查 sshd 服务状态

登录 Linux 系统(如通过虚拟机控制台),执行以下命令查看 sshd 状态:

1
2
3
4
5
# 方法 1:通过 init.d 脚本查看
/etc/init.d/sshd status

# 方法 2:通过 service 命令查看(推荐)
service sshd status
状态解读:
  • active (running):服务正常运行,排除服务未启动的问题。
  • inactive (dead)stopped:服务未启动,需手动启动。

启动或重启 sshd 服务

若服务未启动,执行以下命令恢复:

1
2
3
4
5
6
7
8
# 启动服务
service sshd start

# 重启服务(适用于服务运行异常的情况)
service sshd restart

# 或使用 init.d 脚本
/etc/init.d/sshd start

验证:再次执行 service sshd status,确认状态为 running

设置 sshd 开机自启

为避免系统重启后 sshd 服务未自动启动,需配置开机自启:

1
2
3
4
5
6
7
8
9
# 方法 1:使用 chkconfig(CentOS 6 及以下)
# 查看自启状态
chkconfig --list | grep sshd

# 设置 3、5 级别(命令行/图形界面)自启
chkconfig --level 35 sshd on

# 方法 2:使用 systemctl(CentOS 7+、Ubuntu 16+)
systemctl enable sshd

说明:运行级别 3 为命令行模式,5 为图形界面模式,覆盖这两个级别可确保不同场景下服务均能自启。

扩展排查:其他导致 SSH 连接被拒的原因

sshd 服务正常运行但仍连接被拒,需排查以下常见问题:

防火墙阻止 SSH 端口(默认 22)

Linux 防火墙(如 iptables)可能未开放 22 端口,导致连接被拦截:

1
2
3
4
5
6
7
8
# 查看防火墙规则(检查 22 端口是否允许)
iptables -nvL INPUT | grep 22

# 若未开放,添加允许规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 保存规则(永久生效)
service iptables save

CentOS 7+ 防火墙(firewalld)

1
2
3
4
5
6
7
8
9
10
11
# 查看开放端口
firewall-cmd --list-ports

# 临时开放 22 端口
firewall-cmd --add-port=22/tcp

# 永久开放(重启防火墙后生效)
firewall-cmd --add-port=22/tcp --permanent

# 重启防火墙
firewall-cmd --reload

SSH 配置文件限制连接

/etc/ssh/sshd_configsshd 的核心配置文件,若存在以下限制会导致连接被拒:

1
2
# 编辑配置文件
vim /etc/ssh/sshd_config

需检查的关键配置:

  • Port 22:确认端口是否为 22(若修改过端口,连接时需指定 -p 端口号)。
  • PermitRootLogin yes:是否允许 root 用户登录(默认可能为 prohibit-passwordno)。
  • AllowUsers 用户名:若配置了此选项,仅列出的用户可登录,需确保你的用户名在列。
  • PasswordAuthentication yes:是否允许密码认证(若为 no,需使用密钥认证)。

生效配置:修改后需重启 sshd 服务:

1
service sshd restart

网络连接问题

  • IP 地址错误:确认目标主机 IP 正确(通过 ifconfigip addr 查看)。

  • 网络不通:通过 ping 目标IP 检查网络连通性,若不通需排查虚拟机网络配置(如桥接 / NAT 模式是否正确)。

  • 端口占用:其他服务可能占用 22 端口,导致sshd启动失败:

    1
    2
    # 查看 22 端口占用情况
    netstat -tlnp | grep 22

连接测试与验证

解决上述问题后,通过以下方式验证 SSH 连接:

1
2
3
4
5
# 从客户端连接(替换为目标 IP)
ssh 用户名@目标IP

# 若端口非默认 22,需指定端口
ssh -p 端口号 用户名@目标IP

成功标志:提示输入密码(或直接登录,若配置了密钥认证),无 “Connection refused” 错误。

预防措施:避免 SSH 连接问题复发

  1. 定期检查服务状态:通过脚本监控 sshd 运行状态,异常时自动重启。
  2. 备份配置文件:修改 sshd_config 或防火墙规则前,备份原始文件(如 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak)。
  3. 使用非默认端口:修改 SSH 端口(如 2222)可减少恶意扫描,需同步更新防火墙规则。
  4. 启用密钥认证:相比密码认证更安全,且可避免密码错误导致的连接失败

欢迎关注我的其它发布渠道