# 别再让VPS裸奔！保姆级Linux安全加固教程，彻底告别SSH暴力破解

**URL:** <https://2hkj2s.loc.rr.kg/t/topic/76009>\
**Category:** VPS\
**Tags:** 精华, vps\
**Created:** [2026 年1 月 24 日 13:24 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009 "2026-01-24T13:24:22Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![mfrx](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/mfrx/32/33932_2.png) [@mfrx](https://2hkj2s.loc.rr.kg/u/mfrx)\
**Post date:** [2026 年1 月 24 日 13:24 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/1 "2026-01-24T13:24:22Z")

</div>

#### ▎ 前言：为什么要折腾这个？

我们先做一个测试：

在你的Linux控制台执行：`grep "Failed password" /var/log/auth.log`

你应该能看到一大片的 `Failed password`的错误

> 不同发行版可能命令不一样，这里通过`Debian12` 做演示，这条命令可能刷屏，谨慎执行。

 ![image](https://2hkj2s.loc.rr.kg/uploads/default/original/3X/c/6/c6aef2d61cb9ae1af4effcb6c80eb33264521d98.jpeg)

- **问题描述** ：刚买的 VPS 日志里全是 `Failed password`？这是全网脚本在扫描默认 22 端口。因为你的服务器默认是有公网IP的，在公网的环境下无时无刻不能其他人访问或者恶意攻击，所以你的SSH端口无时无刻都有人尝试去登入扫描。

> 风险提示：如果你的SSH是弱密码请尽快更改，或者往下看跟着教程走。不然被不明人员攻破你的服务器，，服务器变“肉鸡”（挖矿、DDoS），商家删机/关机都是小事，如果做非法业务受牵连就得不偿失了。

#### ▎ 前期准备工作

- **环境** ：一台刚开通的 VPS（Debian/Ubuntu/CentOS），我这里演示的操作系统以`Debian12`，虽然Debian13也出来了，但是还是习惯使用Debian12，作为我的主力使用的操作系统。
- **链接SSH的工具** ：SSH 客户端（Xshell, XTerminal, FinalShell），三选其一就可以，我这里放上了[XTerminal](https://www.xterminal.cn/)的下载链接。

> 注意！：在所有设置确认成功前， **绝对不要关闭当前的 SSH 连接窗口** ！，否则使用商家的VNC链接或者只能重装系统了。

#### ▎ 第一步 更新软件源和同步时间

1. 为什么需要更新软件源呢？只是为了下载最新的软件，不然软件是旧版本可能存在一直漏洞，这样就有一点本末倒置了，所以第一步先更新软件源和系统软件，升级到最新版本。

- Debian/Ubuntu: `apt update && apt upgrade -y`

> 有的时候会无法安装软件，也可以先更新软件源。

1. 同步服务器时间（因为是国内时间，我习惯同步到上海时间，这一步不是必须的）

- **校准时间** ：将服务器时间设置为上海时间，方便后续看日志排查问题。
  - 命令：`timedatectl set-timezone Asia/Shanghai`

#### ▎ 第二步：创建普通管理员账号（避免 Root 裸奔，这里是强烈建议的，如果觉得麻烦可以不做）

Root用户权限最高，也是最方便的，所以很多人喜欢直接使用Root用户执行命令和运行程序。但是风险也是最高的，如果弱密码被破解或者秘钥被泄露，导致的结果也是最原则的，因为人家已经拥有了Root权限（进你的服务器如无人之境）。

1. **新建用户** ：`adduser myadmin` (名字自定义)。
2. **赋予权限** ：`usermod -aG sudo myadmin`。

- **验证** ：退出 Root，用新用户登录并测试 `sudo apt update`，确保权限生效。

> sudo命令就是把普通用户的权限提权成root权限执行，在平时权限不够的时候可以使用。

#### ▎ 第三步：配置 SSH 密钥登录（给大门换把锁）

- **生成密钥对** ：
  - _推荐算法_：使用 Ed25519 算法（比 RSA 更安全高效）。
  - 命令：`ssh-keygen -t ed25519 -C "your_email"`。

- **上传公钥到服务器** ：
  - _方法A（推荐）_：使用 `ssh-copy-id myadmin@ip_address` 自动部署。
  - _方法B（手动）_：`mkdir -p ~/.ssh && echo "公钥内容" >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`。

- **测试连接** ：新开窗口，使用私钥登录成功后再继续。

这里聊个题外话，在秘钥安全这方面，默认使用秘钥，禁止Root账户使用密码登入的商家还是比较少的，无接触最多的也就是`DMIT`，它家默认创建的服务器是使用秘钥登入的。

参考教程：[DMIT 新机无法连接？手把手教你配置 SSH 密钥登录 (图文版)](https://www.legacyvps.com/archives/dmit-vps-ssh-key-login-tutorial-putty-guide)

#### ▎ 第四步：修改 SSH 端口与防火墙设置

- **修改配置文件，开放其他端口** ：`nano /etc/ssh/sshd_config`
  - 策略：保留 `Port 22`，新增一行 `Port 10086`（双端口并行，防止配置错误失联）。

> 很多厂商其实在重装系统的时候，就可以指定其他端口作为SSH连接端口，这样可以防止很多默认扫描行为，因为SSH在22端口是默认的，导致很多恶意扫描只针对SSH，如果其他高位端口，它还需要扫描你服务器的所有端口才能确定。

 ![image](https://2hkj2s.loc.rr.kg/uploads/default/original/3X/c/d/cd8522c1e6a3cfaf8d8b5f613f2d8a0a517c43af.jpeg)

- **配置防火墙（UFW/Firewalld）** ：
  - **重点** ：必须先放行新端口，再启用防火墙！，这一点至关重要，如果没搞定就退出SSH，容易整个服务器都失联，那就有意思了。
  - Debian/Ubuntu (UFW)：

```bash
ufw allow 10086/tcp # 放行新SSH端口
ufw allow 80/tcp # 预留Web端口
ufw allow 443/tcp
ufw enable # 启用防火墙

```

- **验证** ：尝试通过新端口 10086 连接。成功后，回到配置文件删除 `Port 22` 并重启 SSH 服务。

> 80和443是网站搭建必备的端口，如果你是有其他的端口需要使用，修改上面的命令后面的端口号就好了，这一步是为了安全不暴露端口，如果懒得弄也可以不做，不是必须的。

#### ▎ 第五步：禁止密码与 Root 登录 完成漏洞封堵

- **修改配置** ：`nano /etc/ssh/sshd_config`
  - `PermitRootLogin no`：彻底禁止 Root 登录（因为我们已经有了 sudo 用户）所以不必要担心。
  - `PasswordAuthentication no`：彻底关闭密码验证，这样只能通过秘钥登入了。

- **重启服务** ：`systemctl restart sshd` 完成新配置的加载。

> 完成这一步之后只能通过秘钥登入，root账户无法使用普通密码登入，密码登入方式作废。如果秘钥要使用穷举法暴力破解，那基本上是痴心妄想了。你只要不主动泄露基本上密码无忧。

 ![image](https://2hkj2s.loc.rr.kg/uploads/default/original/3X/5/f/5f27c932a50c6d84300dee22b272477093613684.jpeg)

#### ▎ 第五步：安装 Fail2Ban 这里是加强工具（非必要）

- **痛点** ：即使改了端口，可能还有人扫；Fail2Ban 可以自动拉黑多次试错的 IP，就跟一开始一样很烦，日志里面都是尝试登入的日志，有时候会你的日志会变得很大，很大原因就是因为尝试SSH登入惹得锅。
- **安装** ：`apt install fail2ban -y`。
- **配置** ：复制配置文件 `cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local`，设置 `bantime` (封禁时间) 和 `maxretry` (最大尝试次数)。

> fail2ban的配置文件位于/etc/fail2ban目录中。主要的配置文件是jail.conf，你可以在这个文件中定义全局设置，或者为不同的服务创建特定的规则。

- **配置文件介绍：** ：
- **bantime** ：在检测到攻击后，攻击者被禁止的秒数。
- **unbantime** ：定期检查和解除禁止的时间，以秒为单位。
- **maxretry** ：在执行ban之前允许的最大失败尝试次数。
- **findtime** ：在maxretry次数内允许的时间窗口，以秒为单位。

#### ▎ 最后救援大法

如果真的在执行过程中出现意外，或者防火墙忘了开放端口，或者秘钥丢失找不到了，也不要着急下面提供一个解决思路。

- **VNC 直连大法** ：
  - 场景：防火墙没开就重启了？密钥丢了？
  - 操作：登录 VPS 商家后台（基本上所有的商家都有），打开 VNC 控制台。VNC 相当于直连显示器，不受 SSH 限制，可直接登录修改配置，配置好新的秘钥或者开启SSH密码登入更换新的密码，在重新开始。

> 实在没救了，那就只能挂壁了，如果是新的服务器也就无所谓去商家后台重装系统就好了。

#### ▎ 总结

总结下来就这几个步骤，基本上能让你的VPS高枕无忧，不用担心恶意的扫描和暴力破解。防火墙也能有效的防护端口，把不必要暴露外部的应用端口给好好保护起来。比如MYSQL的`3306`、Redis的`6379`很多人都是使用的纯数字简单密码或者根本就没密码，这也是十分危险的行为。

- 系统已更新且时间已校准
- 新建 Sudo 用户，且 Root 远程登录已禁用
- SSH 密钥登录测试通过，密码登录已关闭
- SSH 端口已修改，且防火墙 (UFW) 已正确放行
- Fail2Ban 已开启监控

如果觉得有用，可以关注传家宝VPS

> 原文地址：[别再让VPS裸奔！保姆级Linux安全加固教程，彻底告别SSH暴力破解-传家宝VPS - 深度VPS测评 | 高性价比VPS推荐 | 2025海外云服务器排行榜](https://www.legacyvps.com/archives/linux-vps-security-hardening-guide-protect-ssh-from-brute-force)

- 🌐 VPS监控：[传家宝VPS监控 - 实时库存补货与优惠码 | 搬瓦工/DMIT/RackNerd/NetCup](https://legacyvps.com/scanidc)
- 💬 TG交流群：[Telegram: View @legacyvps](https://t.me/legacyvps)
- 📢 TG频道：[Telegram: View @legacyvps\_group](https://t.me/legacyvps_group)

---

<div class="post-metadata">

**Author:** ![sdcfre](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/sdcfre/32/30620_2.png) [@sdcfre](https://2hkj2s.loc.rr.kg/u/sdcfre)\
**Post date:** [2026 年1 月 24 日 13:32 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/2 "2026-01-24T13:32:31Z")

</div>

感谢分享

---

<div class="post-metadata">

**Author:** ![RodickYu](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/rodickyu/32/653_2.png) [@RodickYu](https://2hkj2s.loc.rr.kg/u/RodickYu)\
**Post date:** [2026 年1 月 24 日 13:32 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/3 "2026-01-24T13:32:39Z")

</div>

感谢分享~ 已经习惯第一时间改端口，禁止密码登录，使用密钥登录了~ 在用ssh工具做个onekey登录，安逸

当然如果要经常折腾的人，这些通常防的都是自己 🤡

---

<div class="post-metadata">

**Author:** ![mfrx](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/mfrx/32/33932_2.png) [@mfrx](https://2hkj2s.loc.rr.kg/u/mfrx)\
**Post date:** [2026 年1 月 24 日 13:34 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/4 "2026-01-24T13:34:57Z")

</div>

哈哈哈 你这个很真实 如果是建站服务器还是很有必要的

---

<div class="post-metadata">

**Author:** ![w-d](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/w-d/32/35088_2.png) [@w-d](https://2hkj2s.loc.rr.kg/u/w-d)\
**Post date:** [2026 年1 月 24 日 13:35 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/5 "2026-01-24T13:35:47Z")

</div>

感谢分享

---

<div class="post-metadata">

**Author:** ![RodickYu](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/rodickyu/32/653_2.png) [@RodickYu](https://2hkj2s.loc.rr.kg/u/RodickYu)\
**Post date:** [2026 年1 月 24 日 13:37 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/6 "2026-01-24T13:37:57Z")

</div>

哈哈 因为我刚开始玩的时候，都是先折腾这一大套，然后发现自己失联了~~ 😂

* * *

再补充个一点，可以用fail2ban 加个登录IP白名单~ 防自己也防的死死的

---

<div class="post-metadata">

**Author:** ![mfrx](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/mfrx/32/33932_2.png) [@mfrx](https://2hkj2s.loc.rr.kg/u/mfrx)\
**Post date:** [2026 年1 月 24 日 13:39 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/7 "2026-01-24T13:39:43Z")

</div>

我想过加白名单 但是不是主流做法 如果跳板机或者IP变化 那就真废了

---

<div class="post-metadata">

**Author:** ![lw1133](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/lw1133/32/28951_2.png) [@lw1133](https://2hkj2s.loc.rr.kg/u/lw1133)\
**Post date:** [2026 年1 月 24 日 13:40 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/8 "2026-01-24T13:40:27Z")

</div>

收藏，学习，多谢

---

<div class="post-metadata">

**Author:** ![lbj](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/lbj/32/13655_2.png) [@lbj](https://2hkj2s.loc.rr.kg/u/lbj)\
**Post date:** [2026 年1 月 24 日 13:44 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/9 "2026-01-24T13:44:20Z")

</div>

我记得有fail2ban脚本挺不错的

---

<div class="post-metadata">

**Author:** ![lovoup](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/lovoup/32/19024_2.png) [@lovoup](https://2hkj2s.loc.rr.kg/u/lovoup)\
**Post date:** [2026 年1 月 24 日 13:44 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/10 "2026-01-24T13:44:22Z")

</div>

学习了

---

<div class="post-metadata">

**Author:** ![mfrx](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/mfrx/32/33932_2.png) [@mfrx](https://2hkj2s.loc.rr.kg/u/mfrx)\
**Post date:** [2026 年1 月 24 日 13:46 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/11 "2026-01-24T13:46:35Z")

</div>

这东西很多的 但是搞清楚原理更重要

---

<div class="post-metadata">

**Author:** ![azhaoyihao](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/azhaoyihao/32/14_2.png) [@azhaoyihao](https://2hkj2s.loc.rr.kg/u/azhaoyihao)\
**Post date:** [2026 年1 月 24 日 14:18 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/12 "2026-01-24T14:18:20Z")

</div>

感谢大佬的教程

---

<div class="post-metadata">

**Author:** ![wowati](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/w/9fc348/32.png) [@wowati](https://2hkj2s.loc.rr.kg/u/wowati)\
**Post date:** [2026 年1 月 24 日 15:25 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/13 "2026-01-24T15:25:42Z")

</div>

感谢分享

---

<div class="post-metadata">

**Author:** ![kof97zip](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/k/d6d6ee/32.png) [@kof97zip](https://2hkj2s.loc.rr.kg/u/kof97zip)\
**Post date:** [2026 年1 月 24 日 15:57 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/14 "2026-01-24T15:57:50Z")

</div>

谢谢分享

---

<div class="post-metadata">

**Author:** ![xuehua](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/x/b9bd4f/32.png) [@xuehua](https://2hkj2s.loc.rr.kg/u/xuehua)\
**Post date:** [2026 年1 月 24 日 23:45 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/15 "2026-01-24T23:45:26Z")

</div>

Mac系统也是一样适用的吗？

---

<div class="post-metadata">

**Author:** ![Vtomir](https://2hkj2s.loc.rr.kg/user_avatar/2hkj2s.loc.rr.kg/vtomir/32/26201_2.png) [@Vtomir](https://2hkj2s.loc.rr.kg/u/Vtomir)\
**Post date:** [2026 年1 月 25 日 01:14 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/16 "2026-01-25T01:14:27Z")

</div>

很全面的方法

---

<div class="post-metadata">

**Author:** ![Undertook](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/u/2acd7d/32.png) [@Undertook](https://2hkj2s.loc.rr.kg/u/Undertook)\
**Post date:** [2026 年1 月 25 日 01:19 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/17 "2026-01-25T01:19:43Z")

</div>

学习

---

<div class="post-metadata">

**Author:** ![creminjess](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/c/e9a140/32.png) [@creminjess](https://2hkj2s.loc.rr.kg/u/creminjess)\
**Post date:** [2026 年1 月 25 日 03:23 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/18 "2026-01-25T03:23:20Z")

</div>

感谢分享 :xhj003:

---

<div class="post-metadata">

**Author:** ![M2026](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@M2026](https://2hkj2s.loc.rr.kg/u/M2026)\
**Post date:** [2026 年1 月 25 日 03:35 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/19 "2026-01-25T03:35:28Z")

</div>

感谢分享！学习一下！

---

<div class="post-metadata">

**Author:** ![Cfsv](https://2hkj2s.loc.rr.kg/letter_avatar_proxy/v4/letter/c/96bed5/32.png) [@Cfsv](https://2hkj2s.loc.rr.kg/u/Cfsv)\
**Post date:** [2026 年1 月 25 日 05:10 UTC](https://2hkj2s.loc.rr.kg/t/topic/76009/20 "2026-01-25T05:10:27Z")

</div>

要不就用专业的脚本，要不就在本地离线模拟练习，熟悉了之后再实战

[下一页](https://2hkj2s.loc.rr.kg/t/topic/76009.md?page=2)
