我在这里阅读了许多 SSH 连接被拒绝的帖子,并将在写完后继续阅读它们,但我不是盲目地尝试每个解决方案,希望它适用于我的计算机,而是想写出我的故障排除解决过程。
目标:使用 ssh root 登录我的服务器
问题:
$ ssh [email protected]
ssh: connect to host 123.456.78.911 port 22: Connection refused
上下文服务器:Digital Ocean(虚拟机 - 每月 5 美元)
操作系统:Windows 10、Linux 子系统、Ubuntu Bash、Linux 子系统
OpenSSH - 客户端和服务器均安装
防火墙 - SSHD 添加到配额(进出)
故障排除流程
编辑:添加详细模式输出
ssh -v [email protected]
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to xxx.xxx.xx.xxx [xxx.xxx.xx.xxx] port 22.
debug1: connect to address xxx.xxx.xx.xxx port 22: Connection refused
ssh: connect to host xxx.xxx.xx.xxx port 22: Connection refused
我以前曾
在这台计算机上连接过我的服务器,但不得不在本月初恢复出厂设置。第一次遇到麻烦,我不记得我是如何解决的(这是一年前)。我很确定 DO 服务器端启用了 ssh,所以我的猜测是私钥和公钥放错了地方,我必须在某处更改文件路径。我记得在 Windows 中使用 Ubuntu 时存在文件位置问题。
我是否必须将公钥和私钥添加到其他授权文件中?或者关键位置?
答案1
第一:了解应该发生的事情的基本原理。
Windows 桌面上的 SSH 客户端进程应该连接到 DigitalOcean VM 上的 TCP 端口 22。建立连接后,应root
使用 SSH 密钥对用户进行身份验证。
这意味着你不需要sshd
(或“ssh 服务”):仅当您想要允许时才需要它入境与桌面的 SSH 连接。
您收到“连接被拒绝”。这意味着以下其中一项:
- 您可能没有云 VM 的正确 IP 地址(对于云 VM,VM 在内部看到的本地 IP 地址可能与云基础设施向 Internet 提供的地址不同)
- 您的本地网络可能需要使用代理来访问本地网络之外的服务(常见于工作场所网络)
- Digital Ocean VM 可能根本没有运行
- 在指定允许的源 IP 地址之前,云中虚拟机的防火墙可能不允许传入 SSH 连接
- 您可能需要使用 Digital Ocean 的 Web UI/API 在云虚拟机上启用 SSH 服务。
一旦可以建立到虚拟机 SSH 端口的基本 TCP 连接,您就可以继续对身份验证进行故障排除。
允许在云虚拟机上进行密码验证登录是非常糟糕的主意如果对 SSH 端口的访问不仅限于已知的 IP 地址:存在被黑客攻击的服务器和自动恶意软件,它们将花费所有时间扫描互联网上启用 SSH 的主机,并尝试暴力破解任何已知的用户帐户,包括root
.
sshd
(SSH 服务)甚至有一个特殊的设置,可以强制直接登录始终root
被拒绝,或者仅接受密钥身份验证,即使可以为其他用户启用密码身份验证。强烈建议云服务使用该设置。
如果虚拟机由多人维护,则使用个人用户帐户登录然后使用sudo
可以更轻松地使用日志来找出谁做了什么(如果有必要)。云提供商可能会要求您使用非root
初始登录的特定用户帐户;一旦您首次成功连接并获得 root 访问权限,您显然可以根据需要配置虚拟机。
通常,云提供商会提供预先生成的 SSH 私钥,用于对虚拟机进行初始 SSH 访问。有几种可能的密钥文件格式:*.ppk
文件用于 PuTTY,这是一种常见的免费 Windows SSH 客户端(现在也可用于 Linux),而id_*
没有特定后缀的文件用于 OpenSSH。通常,可以使用相应的密钥生成器工具将密钥从一种格式转换为另一种格式(例如将文件PuTTYgen keyfile.ppk -O private-openssh -o id_openssh
转换*.ppk
为 OpenSSH 格式)。
如果您使用 WSL 的命令行 SSH 客户端,那么这是 OpenSSH 的一种形式。通常,OpenSSH 在.ssh
本地用户主目录的子目录(根据使用的算法命名为id_rsa
、id_dsa
、id_ecdsa
等)中查找默认私钥。id_ed25519
如果任何这些私钥文件存在,并且允许基于密钥的身份验证,客户端将自动将它们提供给远程服务器。
在 WSL 上,Unix 风格的主目录的位置可能不是那么明显,因此您可能需要使用该-i
选项来显式指定要使用的私钥文件。
使用密钥身份验证时,您仍必须指定正确的用户名,因此 SSH 命令可能如下所示:
ssh -i /some/where/id_digitalocean_privatekey [email protected]
答案2
嗯,首先。请勿使用此设置。事实上你根本不想使用那些 MAC!
您是否尝试启用密码验证?只是为了看看这是否有效?您还检查了/var/log/auth.log 吗?您是否增加了 /etc/sshd/sshd_config 中 sshd 日志记录的详细程度?
对我来说,它更关注的是 sshd 守护进程没有正确侦听端口 22。这就是为什么连接被拒绝的原因。您可以使用 nmap 检查该端口是否确实打开。
sudo nmap -sSV -O -p 22 -v9 destination_IP