VPS
VPSWOW - 精品VPS良心测评

SSH 安全登录 VPS 完全指南:从密码登录到密钥认证,再到 Fail2ban 防护

我在本文将会讲述如何用root登录,再改成公认最安全的密钥登录加fail2ban封禁异常IP。我会讲清楚每一个路径、每一条报错、每一个操作细节。全流程:初始密码登录 → 理解密钥文件在哪里 → 配置公私钥登录 → 解决 Windows 权限报错 → 关闭 root 密码登录 → 安装 Fail2ban自动封禁恶意 IP。

SSH 安全登录 VPS 完全指南:从密码登录到密钥认证,再到 Fail2ban 防护

我在本文将会讲述如何用root登录,再改成公认最安全的密钥登录加fail2ban封禁异常IP。我会讲清楚每一个路径、每一条报错、每一个操作细节。全流程:初始密码登录 → 理解密钥文件在哪里 → 配置公私钥登录 → 解决 Windows 权限报错 → 关闭 root 密码登录 → 安装 Fail2ban自动封禁恶意 IP。


前言

拥有一台 VPS(云服务器)之后,SSH 是你与它沟通的主要方式。默认的 root + 密码登录方式虽然方便,但暴露在公网上的服务器每天都会遭受大量自动化脚本的暴力破解尝试,如果你暴露了你的IP地址,那更是一天得遭受几百次暴力破解尝试,都是少的。

因此,本文将教你一步步将服务器的登录方式升级为密钥唯一认证,也就是连暴力破解都无从下手,因为等于你根本没有密码,并配合 Fail2ban 防火墙,让那些试图暴力破解的 IP 自动被封禁。


重要知识:理解路径符号 ~/ 是什么意思

在正式操作之前,有一个概念必须先搞清楚,否则后面的命令你会看得一头雾水。

~(波浪号)代表"当前用户的家目录"

在 Linux/macOS 系统中,每个用户都有一个专属的"家目录"(home directory),用来存放该用户的个人文件和配置。~ 符号就是这个目录的快捷写法。

具体路径因用户而异:

登录用户 ~ 实际对应的路径
root 用户 /root
普通用户(如 ubuntu) /home/ubuntu
普通用户(如 john) /home/john

所以,当你看到 ~/.ssh/id_rsa.pub 这个路径时,它的完整含义是:

  • 如果你是 root 用户/root/.ssh/id_rsa.pub
  • 如果你是 ubuntu 用户/home/ubuntu/.ssh/id_rsa.pub

/ 是路径分隔符(相当于 Windows 里的 \),.ssh 是一个以点开头的隐藏文件夹(Linux 中以 . 开头的文件/文件夹默认隐藏),id_rsa.pub 就是公钥文件名。

Windows 上的"家目录"在哪里?

在 Windows 上,~ 对应的是你的用户文件夹,完整路径是:

C:\Users\你的用户名\

所以 ~/.ssh/ 在 Windows 上的真实路径是:

C:\Users\你的用户名\.ssh\

例如,你的 Windows 用户名是 Alice,那么私钥文件的完整路径就是:

C:\Users\Alice\.ssh\id_rsa

💡 注意.ssh 这个文件夹在 Windows 资源管理器里默认是隐藏的(因为文件夹名以点开头)。你需要在资源管理器顶部勾选"显示隐藏的项目"才能看到它,或者直接在地址栏输入完整路径访问。


第一步:用 root 账户和密码通过 SSH 登录 VPS

准备 SSH 工具

Windows 用户 有以下几种选择:

  • PowerShell 或 命令提示符(CMD):Windows 10 版本 1809 及以上已内置 OpenSSH,直接打开即可使用 ssh 命令,无需安装任何软件。按 Win + R,输入 powershell 回车打开。
  • finalshell(推荐图形化工具):免费版功能已非常完整,自带文件传输功能,我认为最方便的登陆器,直接网页搜就能下载。
  • putty:另一款流行的 SSH 客户端,个人免费版可用,但是我觉得比较老旧了页面。

macOS 用户:系统自带 ssh 命令,直接打开"终端"(在"应用程序 → 实用工具 → 终端")即可。

Linux 用户:同 macOS,直接打开终端。

执行登录命令

打开 PowerShell 或终端,输入:

ssh root@你的VPS公网IP

例如,你的服务器 IP 是 103.12.34.56,则输入:

ssh root@103.12.34.56

首次连接:主机指纹确认

第一次连接某台服务器时,会出现这样的提示:

The authenticity of host '103.12.34.56 (103.12.34.56)' can't be established.
ED25519 key fingerprint is SHA256:aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890abcdef.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是 SSH 在问:"这台服务器我之前没见过,你确定要信任它吗?" 输入 yes 回车即可,系统会把这台服务器的指纹记录到本地,以后不会再问。

输入密码

接下来会提示输入密码:

root@103.12.34.56's password:

注意:输入密码时,光标不会移动,也不会显示任何字符(不是星号 *,是真的什么都不显示),这是 Linux 的安全设计,属于正常现象。输完密码直接按回车即可。

登录成功后,你会看到类似这样的欢迎界面:

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)
root@vps-server:~#

最后那个 # 说明你现在是 root 用户,已成功登录。

遇到连接超时? 检查 VPS 控制台的安全组/防火墙规则,确保 TCP 22 端口(SSH 默认端口)已开放入站流量。

如果端口不是 22? 使用 -p 参数指定端口: bash ssh root@103.12.34.56 -p 2222


第二步:理解生成的公私钥文件,并上传公钥

密钥对如何工作

密钥认证用一个生活中的类比来理解最直观:

  • 私钥id_rsa)= 钥匙,绝不能泄露
  • 公钥id_rsa.pub)= 你家的锁,可以公开,上传到云服务器上,可以与你的私钥配对。
  • 登录过程 = 用钥匙去开锁,匹配上了就放行,不需要输密码

所以规则是: - 私钥永远只存放在你的本地电脑上,绝不上传到任何服务器 - 公钥上传到服务器,放进服务器的"授权列表"文件里

你的密钥文件在哪里?

假设你已经有了一对公私钥(有些VPS提供商比如Dmit会给的,或者在我们网站在线生成,完全前端生成,你下载之后我们不保留,没了就没了),文件名通常是:

文件名 类型 本地路径(以 Windows 用户 Alice 为例)
id_rsa 私钥 C:\Users\Alice\.ssh\id_rsa
id_rsa.pub 公钥 C:\Users\Alice\.ssh\id_rsa.pub

有些服务商生成的密钥文件名不同,可能叫 my_vps_keymy_vps_key.pub,规律是:.pub 后缀的是公钥,没有的是私钥

在 Windows PowerShell 中确认文件存在:

dir C:\Users\你的用户名\.ssh\

在 macOS/Linux 终端中确认:

ls -la ~/.ssh/

你应该能看到私钥和公钥两个文件。如果你指定地址下载保存的,看比较后面的补充内容,会讲指定位置的密钥登录。

查看公钥内容

在 Windows PowerShell 中:

type C:\Users\你的用户名\.ssh\id_rsa.pub

在 macOS/Linux 终端中:

cat ~/.ssh/id_rsa.pub

输出内容类似这样(一行很长的字符串):

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajvH8dMKxITN... your_comment@hostname

这整行内容就是你的公钥,需要完整地复制到服务器上。


将公钥上传到服务器

方法一:ssh-copy-id 命令(macOS/Linux 用户推荐)

本地终端(注意:是你自己电脑的终端,不是 SSH 登录进去的那个)执行:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@103.12.34.56

这条命令会自动帮你把公钥追加到服务器的正确位置,并设置好权限。执行时需要输入一次服务器密码。

成功后会提示:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@103.12.34.56'"
and check to make sure that only the key(s) you wanted were added.

方法二:手动上传(Windows 用户必看)

Windows 的 PowerShell 没有 ssh-copy-id 命令,需要手动操作。

第 1 步:在本地 PowerShell 中查看并复制公钥内容:

type C:\Users\你的用户名\.ssh\id_rsa.pub

用鼠标选中输出的那一整行内容,右键复制(或 Ctrl+C)。

第 2 步:切换到已经登录进服务器的 SSH 窗口,依次执行:

# 创建 .ssh 目录(如果已存在,会报错说"File exists",忽略即可,不影响后续)
mkdir -p ~/.ssh

# 设置 .ssh 目录的权限为只有所有者可读写执行(SSH 有严格权限要求,后面会详细解释)
chmod 700 ~/.ssh

# 将公钥追加写入授权文件(注意是 >>,两个大于号,不是一个,一个大于号会覆盖原有内容)
echo "在这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keys

# 设置授权文件的权限为只有所有者可读写
chmod 600 ~/.ssh/authorized_keys

粘贴公钥时的注意事项:

  • echo "..." 引号里的内容要替换成你的公钥,完整的一行,从 ssh-rsa 开头到末尾
  • 在 PowerShell 或大多数 SSH 客户端中,粘贴快捷键是 Ctrl+Shift+V 或者直接右键单击
  • 粘贴完成后,整条命令应该类似这样:
echo "ssh-rsa AAAAB3NzaC1yc2EAAAA...(很长的内容)...your@email.com" >> ~/.ssh/authorized_keys

验证公钥已正确写入:

cat ~/.ssh/authorized_keys

确认能看到你的公钥内容就说明写入成功了。


第三步:测试密钥登录——以及解决 Windows 上的"权限过宽"报错

测试密钥登录

保持当前 SSH 窗口不关闭,重新打开一个新的 PowerShell 或终端窗口,执行:

Windows PowerShell:

ssh -i C:\Users\你的用户名\.ssh\id_rsa root@103.12.34.56

macOS/Linux:

ssh -i ~/.ssh/id_rsa root@103.12.34.56

⚠️ Windows 常见报错:私钥权限过宽

如果你在 Windows 上执行上面的命令,很可能会看到这样的报错:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\Users\Alice\.ssh\id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\Users\Alice\.ssh\id_rsa": bad permissions
root@103.12.34.56: Permission denied (publickey).

这个错误的意思是: 你的私钥文件权限太宽松了,其他用户也能读取它,SSH 出于安全考虑,拒绝使用这个权限设置不当的私钥。

为什么会出现这个问题?

私钥是非常敏感的文件,就像你家的门钥匙,SSH 要求这个文件必须只有你自己能读取,如果系统里其他用户也能读这个文件,SSH 会认为"这把钥匙不安全,拒绝使用"。

在 Linux/macOS 上,一条 chmod 600 就能解决。但 Windows 用的是不同的权限系统(ACL),需要专门处理。

解决方法(Windows)

方法一:用 PowerShell 命令修复(推荐)

打开 PowerShell(不需要管理员权限),依次执行以下命令。把路径替换成你的私钥实际路径:

# 第一步:去掉文件的继承权限(继承的权限往往导致权限过宽)
icacls "C:\Users\你的用户名\.ssh\id_rsa" /inheritance:r

# 第二步:删除其他所有用户的权限
icacls "C:\Users\你的用户名\.ssh\id_rsa" /remove "NT AUTHORITY\Authenticated Users"
icacls "C:\Users\你的用户名\.ssh\id_rsa" /remove "BUILTIN\Users"
icacls "C:\Users\你的用户名\.ssh\id_rsa" /remove "Everyone"

# 第三步:只保留你自己(当前用户)的读取权限
icacls "C:\Users\你的用户名\.ssh\id_rsa" /grant:r "%USERNAME%:R"

执行完后,再次尝试 SSH 登录,报错应该消失了。

方法二:通过文件属性界面修复(图形化操作)

  1. 在资源管理器中找到私钥文件(C:\Users\你的用户名\.ssh\id_rsa),右键 → 属性
  2. 切换到安全选项卡
  3. 点击高级
  4. 在"高级安全设置"窗口顶部,点击禁用继承,弹窗选择从此对象中删除所有已继承的权限
  5. 此时权限列表会清空,点击添加
  6. 点击选择主体,输入你的 Windows 用户名,点击确定
  7. 权限勾选"读取"即可,点击确定
  8. 一路确定保存

完成后重新测试 SSH 登录。

方法三:把私钥放到 WSL 里使用(适合长期使用 Linux 工具的用户)

如果你安装了 WSL(Windows 的 Linux 子系统),可以把私钥复制到 WSL 的家目录下使用,WSL 环境里的文件权限和 Linux 一样好管理:

# 在 WSL 里执行
cp /mnt/c/Users/你的用户名/.ssh/id_rsa ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh -i ~/.ssh/id_rsa root@103.12.34.56

密钥登录成功的样子

无论哪个系统,如果密钥登录成功,你会直接进入服务器的命令行,不需要输入任何密码:

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)
root@vps-server:~#

如果看到这个界面,恭喜你,密钥登录配置成功 ✅

⚠️ 再次强调:在确认密钥登录成功之前,不要关闭最初的那个密码登录 SSH 窗口!如果后续配置出错,你还可以用那个窗口来修复。一旦关了,密码又被禁用了,就只能通过 VPS 控制台的 VNC 紧急救援了。


第四步:关闭 root 密码登录,仅允许密钥登录

确认密钥登录成功后,在服务器上修改 SSH 配置文件,彻底关掉密码登录。

编辑 SSH 服务器配置文件

在服务器的 SSH 窗口中执行:

nano /etc/ssh/sshd_config

这会用 nano 编辑器打开 SSH 的主配置文件。

nano 编辑器基本操作: - 用方向键移动光标 - 按 Ctrl + W 可以搜索关键词(比如搜索 PasswordAuthentication) - 修改完成后按 Ctrl + X,再按 Y,再按回车,保存并退出

找到以下几项配置,根据说明修改(如果某行前面有 #,表示那行是注释、不生效,需要把 # 删掉并修改值):

# 允许 root 登录,但只能用密钥,不能用密码
# 把原来的 PermitRootLogin yes 改成这个
PermitRootLogin prohibit-password

# 禁用密码认证,改为 no
PasswordAuthentication no

# 启用公钥认证(一般默认就是 yes,确认一下)
PubkeyAuthentication yes

# 禁止空密码登录
PermitEmptyPasswords no

PermitRootLogin 的三个选项说明: - yes:允许 root 用密码或密钥登录(不安全,默认值) - prohibit-password:允许 root 用密钥登录,但禁止密码登录(推荐) - no:完全禁止 root 登录(最安全,但你需要先创建一个有 sudo 权限的普通用户)

重启 SSH 服务

保存配置文件后,执行以下命令让配置生效:

systemctl restart sshd

如果提示找不到 systemctl(某些老系统),尝试:

service ssh restart

重启 SSH 服务不会断开你当前的连接,已建立的 SSH 连接不受影响,只有新的连接才会使用新配置。

验证密码登录已被禁用

打开一个全新的终端窗口,尝试直接用密码登录(不指定密钥文件):

ssh root@103.12.34.56

应该会看到:

root@103.12.34.56: Permission denied (publickey).

这说明密码登录已成功关闭 ✅

再测试密钥登录还能正常工作:

ssh -i ~/.ssh/id_rsa root@103.12.34.56
# 或者 Windows:
ssh -i C:\Users\你的用户名\.ssh\id_rsa root@103.12.34.56

直接进入服务器,不需要密码 ✅


补充一:密钥文件不在默认位置怎么办?

很多人的密钥文件并不放在 ~/.ssh/ 目录下,而是放在自己指定的某个文件夹里,比如:

  • Windows:D:\MyKeys\vps_private_key
  • macOS/Linux:/Users/alice/Documents/keys/my_vps_key

这完全没问题,SSH 不强制要求你把密钥放在固定位置,只要在登录时-i 参数明确告诉 SSH "我的私钥在这里"就可以了。

使用 -i 参数指定私钥路径

-i 是英文 identity file(身份文件)的缩写,用法如下:

ssh -i 私钥文件的完整路径 用户名@服务器IP

Windows PowerShell 示例(私钥放在 D 盘):

ssh -i D:\MyKeys\vps_private_key root@103.12.34.56

macOS/Linux 示例(私钥放在文档文件夹):

ssh -i /Users/alice/Documents/keys/my_vps_key root@103.12.34.56

路径里有空格怎么办? 用引号把路径括起来: powershell ssh -i "D:\My Keys\vps private key" root@103.12.34.56

同理,ssh-copy-id 上传公钥时,-i 后面跟的是公钥.pub 文件)的路径:

# macOS/Linux
ssh-copy-id -i /Users/alice/Documents/keys/my_vps_key.pub root@103.12.34.56

Windows 上自定义路径的权限问题

还记得前面提到的"权限过宽"报错吗?密钥放在自定义路径下,同样要处理权限问题。用下面的 PowerShell 命令,把路径换成你的实际路径就行:

# 去掉继承权限
icacls "D:\MyKeys\vps_private_key" /inheritance:r

# 删除其他用户的权限
icacls "D:\MyKeys\vps_private_key" /remove "NT AUTHORITY\Authenticated Users"
icacls "D:\MyKeys\vps_private_key" /remove "BUILTIN\Users"
icacls "D:\MyKeys\vps_private_key" /remove "Everyone"

# 只保留自己的读取权限
icacls "D:\MyKeys\vps_private_key" /grant:r "%USERNAME%:R"

补充二:配置 SSH Config 文件,以后登录更方便

每次都要打一长串命令很麻烦,尤其是密钥还放在自定义路径时更是如此。可以在本地创建一个 SSH 配置文件,把所有参数都写进去,以后只需要输入 ssh myvps 就能登录,不管私钥放在哪里。

配置文件路径: - macOS/Linux:~/.ssh/config - Windows:C:\Users\你的用户名\.ssh\config(注意:这个文件没有扩展名,不是 config.txt

如果文件不存在,新建一个即可。在文件中写入:

Host myvps
    HostName 103.12.34.56
    User root
    Port 22
    IdentityFile D:\MyKeys\vps_private_key

字段说明:

字段 含义
Host myvps 给这台服务器起的别名,随便取,登录时用这个名字
HostName 服务器的真实 IP 或域名
User 登录用的用户名
Port SSH 端口,默认 22
IdentityFile 私钥文件的完整路径,放哪儿填哪儿

IdentityFile 这行填你私钥的实际路径,不管是默认位置还是自定义位置都可以:

# 默认位置的写法
IdentityFile ~/.ssh/id_rsa

# Windows 自定义位置
IdentityFile D:\MyKeys\vps_private_key

# macOS/Linux 自定义位置
IdentityFile /Users/alice/Documents/keys/my_vps_key

如果你有多台服务器,可以在同一个 config 文件里写多个 Host 块:

Host myvps
    HostName 103.12.34.56
    User root
    Port 22
    IdentityFile D:\MyKeys\vps_private_key

Host work-server
    HostName 202.55.66.77
    User ubuntu
    Port 2222
    IdentityFile D:\MyKeys\work_key

保存后,以后登录只需要:

ssh myvps
# 或者
ssh work-server

SSH 会自动找到对应的 IP、用户名和私钥,完全不需要手动输入。


第五步:安装 Fail2ban,自动封禁恶意 IP

即使关闭了密码登录,每天仍然会有大量扫描机器人尝试连接你的服务器(虽然它们进不来,但会产生大量日志、消耗资源)。Fail2ban 可以检测这些行为,并把对应 IP 拉黑。

安装 Fail2ban

Debian / Ubuntu 系统:

apt update && apt install fail2ban -y

CentOS / RHEL / AlmaLinux 系统:

yum install epel-release -y
yum install fail2ban -y

安装完成后,Fail2ban 会自动启动。

创建本地配置文件

Fail2ban 有两个主要配置文件:

  • /etc/fail2ban/jail.conf:软件自带的默认配置,不要直接修改,软件更新时会被覆盖
  • /etc/fail2ban/jail.local:你的自定义配置,会覆盖默认值,在这里修改

复制一份默认配置作为起点:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

然后编辑:

nano /etc/fail2ban/jail.local

配置 SSH 防护规则

在文件中找到 [sshd] 这一节(可以用 Ctrl+W 搜索 [sshd]),将其修改为:

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 5
findtime = 600
bantime  = 3600

参数逐项解释:

参数 含义 示例配置的效果
enabled = true 启用这条规则 开启 SSH 防护
port = ssh 监控的端口 SSH 默认 22 端口;若你改了端口,填具体数字如 2222
filter = sshd 使用哪个过滤规则来识别失败登录 使用内置的 SSH 识别规则
logpath 从哪个日志文件中读取记录 Ubuntu/Debian 用 /var/log/auth.log;CentOS 用 /var/log/secure
maxretry = 5 触发封禁前允许的最大失败次数 失败 5 次触发封禁
findtime = 600 统计失败次数的时间窗口(单位:秒) 10 分钟内失败 5 次才触发(不是累计总数)
bantime = 3600 封禁持续时间(单位:秒) 封禁 1 小时;设为 -1 表示永久封禁

推荐配置说明: "10 分钟内失败 5 次,封禁 1 小时"对于日常使用足够了。如果你的服务器面临高强度攻击,可以改为 bantime = 86400(封禁 24 小时)甚至 bantime = -1(永久封禁)。

将自己的 IP 加入白名单(强烈建议)

jail.local 文件靠近顶部找到 [DEFAULT] 部分,添加 ignoreip,将你自己的 IP 加入白名单,防止误封自己:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 你的本地公网IP

如何查看自己当前的公网 IP? 在浏览器中搜索"我的 IP"即可看到。

如果你的 IP 是动态的(每次连网都会变),可以跳过这步,记住后面的"手动解封"命令就行。

保存文件(Ctrl+XY → 回车)。

启动并设置 Fail2ban 开机自启

# 设置开机自启
systemctl enable fail2ban

# 启动服务
systemctl start fail2ban

# 查看运行状态(看到 active (running) 说明正常)
systemctl status fail2ban

查看 Fail2ban 工作情况

# 查看所有防护规则的整体状态
fail2ban-client status

# 查看 SSH 防护的详细信息
fail2ban-client status sshd

输出示例:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2        ← 目前正在尝试的失败连接数
|  |- Total failed:     158      ← 自启动以来累计失败次数(说明有多少人在尝试暴力破解)
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 4        ← 当前被封禁的 IP 数量
   |- Total banned:     23       ← 历史累计封禁次数
   `- Banned IP list:   192.168.1.100 10.0.0.5 ...   ← 被封禁的 IP 列表

手动解封被误封的 IP

如果你自己的 IP 被 Fail2ban 封了,登录 VPS 的其他方式(如 VPS 控制台的 Web 终端),执行:

fail2ban-client set sshd unbanip 你的IP地址

实时查看 Fail2ban 日志

tail -f /var/log/fail2ban.log

可以看到实时的封禁记录,类似:

2024-01-15 03:24:11 WARNING  [sshd] Ban 45.33.32.156
2024-01-15 03:24:11 WARNING  [sshd] Ban 172.104.25.105

这些就是被自动封禁的恶意 IP,按 Ctrl+C 退出实时日志。


完整安全配置总结

完成以上所有步骤,你的服务器已经具备以下安全防护:

安全措施 配置状态 效果
密钥唯一登录 ✅ 已启用 没有私钥文件无法登录,密码无效
禁止 root 密码登录 ✅ 已禁用 即使密码泄露也无法登录
Fail2ban SSH 防护 ✅ 已启用 10分钟内失败5次自动封禁1小时
自动开机启动 ✅ 已设置 服务器重启后防护自动恢复

常见问题解答

Q:私钥文件(id_rsa)如果丢失了怎么办?

A:私钥一旦丢失,且服务器已关闭密码登录,你将无法通过普通 SSH 登录。需要通过 VPS 服务商控制台提供的"Web 控制台"或"VNC 控制台"直接操作服务器,进入系统后重新生成密钥对并上传新公钥。因此,私钥文件一定要备份,可以存到 U 盘或密码管理器中。

Q:Windows PowerShell 没有 ssh-copy-id 命令怎么办?

A:这是正常现象,Windows 内置的 OpenSSH 没有包含这个工具。请使用本文"方法二"的手动上传方式,或者安装 Git for Windows 后使用其自带的 Git Bash,其中包含 ssh-copy-id

Q:执行 systemctl restart sshd 报错"Unit sshd.service not found"?

A:不同发行版的 SSH 服务名不同,尝试以下几种:

systemctl restart ssh          # Debian/Ubuntu 系列
systemctl restart sshd         # CentOS/RHEL 系列
service ssh restart            # 老版本系统

Q:nano 编辑器怎么用?我找不到要修改的那几行。

A:在 nano 中按 Ctrl + W 调出搜索框,输入要找的词(如 PasswordAuthentication)按回车即可跳转到对应位置。修改完成后按 Ctrl + X,按 Y 确认保存,按回车退出。

Q:CentOS 系统的日志路径和 Ubuntu 不一样怎么办?

A:CentOS/RHEL 的 SSH 日志在 /var/log/secure,而不是 /var/log/auth.log。在 jail.local 里把 logpath 改成对应路径:

logpath = /var/log/secure

结语

你可以定期运行 fail2ban-client status sshd 看看每天有多少次攻击尝试被拦截,很有意思我只能说,每次在VPS上都感觉是一块网络领土的绝对主宰,好吧有些中二了。

如有问题,欢迎联系我的telegram!