A. 原因排查
遇到这个错误通常意味着 SSH 服务可能在目标主机上没有正常运行,或有防火墙/网络配置问题。以下是一些排查步骤:
-
检查 SSH 服务状态:
确认 SSH 服务是否正在目标主机上运行。sudo systemctl status sshd
-
重启 SSH 服务:
如果 SSH 服务没有运行,可以尝试重启它。sudo systemctl restart sshd
-
检查 SSH 配置文件:
确保/etc/ssh/sshd_config
文件配置正确。特别是检查以下配置:Port 22 PermitRootLogin no PasswordAuthentication yes
-
检查防火墙设置:
确保防火墙允许 SSH 连接。可以使用firewalld
或iptables
管理防火墙设置。sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
或者对于
iptables
:sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo service iptables save sudo service iptables restart
-
检查 SELinux 设置:
如果 SELinux 启用,它也可能阻止 SSH 连接。可以暂时将其设为宽松模式以排除问题。sudo setenforce 0
-
查看 SSH 日志:
检查/var/log/secure
或/var/log/auth.log
文件中的日志,以获取更多错误信息。sudo tail -f /var/log/secure
-
检查网络连接:
确认本地主机到远程主机的网络连接正常。使用ping
命令验证连接:ping ip_address
-
端口是否被占用:
确认端口 22 没有被其他进程占用:sudo lsof -i :22
如果以上步骤仍未解决问题,请提供更多相关错误信息,以便进一步诊断。
B. 端口注释
如果 Port 22
在 /etc/ssh/sshd_config
文件中被注释了,这可能导致 SSH 服务无法正确绑定到端口 22,从而无法接受连接。你可以按照以下步骤操作:
-
编辑 sshd_config 文件:
打开/etc/ssh/sshd_config
文件进行编辑。sudo nano /etc/ssh/sshd_config
-
取消注释 Port 22:
找到Port 22
行并取消注释(去掉行首的#
)。#Port 22
改为:
Port 22
-
保存并关闭文件:
保存编辑并退出编辑器。如果使用nano
,可以按Ctrl + X
,然后按Y
再按Enter
。 -
重启 SSH 服务:
重新启动 SSH 服务以应用更改。sudo systemctl restart sshd
-
验证 SSH 服务状态:
确认 SSH 服务已启动并绑定到端口 22。sudo systemctl status sshd
-
尝试再次连接:
尝试从客户端使用 SSH 连接到服务器。ssh username@ip
如果上述步骤未解决问题,请检查其他配置项是否正确,并确保没有防火墙或 SELinux 阻止 SSH 连接。
C. 状态显示
既然 sudo systemctl status sshd
显示 SSH 服务一切正常,但你仍然无法通过 SSH 连接远程服务器,这可能还有其他原因。请继续进行以下检查:
-
检查防火墙配置:
确认防火墙允许端口 22 的流量。你可以使用以下命令检查和修改防火墙规则。使用
firewalld
:sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
使用
iptables
:sudo iptables -L -n sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo service iptables save sudo service iptables restart
-
检查 SELinux 配置:
如果 SELinux 已启用,它可能会阻止 SSH 连接。可以暂时将 SELinux 设置为宽松模式以进行排除:sudo setenforce 0
确认这是否解决了问题。如果解决了问题,说明 SELinux 配置需要调整。你可以将
SELINUX
设置为permissive
或调整 SELinux 规则以允许 SSH 连接。 -
检查服务器的网络连接:
确认服务器的网络连接正常,且可以从你的客户端访问端口 22。ping ip_address telnet ip_address 22 nc -zv ip_address 22
-
查看 SSH 日志:
查看 SSH 日志以获取更多错误信息。日志文件通常位于/var/log/secure
或/var/log/auth.log
。sudo tail -f /var/log/secure sudo tail -f /var/log/auth.log
-
检查 SSH 客户端配置:
确保客户端的 SSH 配置正确,并尝试使用详细模式连接以获得更多调试信息。ssh -v username@ip_address ssh -vv username@ip_address ssh -vvv username@ip_address
-
确保 SSH 端口没有被其他进程占用:
确认端口 22 没有被其他进程占用:sudo lsof -i :22
如果这些步骤仍未解决问题,请提供更多具体的错误消息和环境信息,以便进一步诊断。