VPS 到手后的第一个小时:从裸机到安全可用的完整初始化指南(让你的OpenClaw更安全)
新买的 VPS 就像一扇没上锁的门,全世界的脚本小子都在敲。这篇文章带你把门锁好。让你的小龙虾(openclaw)不会乱跑乱动。
0、写在前面
刚买了一台 VPS,兴冲冲地拿到 IP 和 root 密码,然后呢?
很多人的做法是:直接开始装软件、部署项目。
这是个危险的习惯。
你的 VPS 有一个公网 IP,意味着全世界任何人都可以尝试连接它。而默认配置下:
- 端口是公开的 22
- 用户名是众所周知的 root
- 只剩一个密码在保护你
每天有无数自动化脚本在扫描 IP 段,尝试用常见密码暴力破解。你的服务器从上线那一刻起,就已经在被攻击了。
所以,拿到 VPS 后的第一件事,不是装软件,而是做安全初始化。
1、期望目标
这篇文章的目标是:
- ✅ 建立安全的远程访问:SSH 密钥登录 + 非默认端口
- ✅ 创建普通用户:避免直接使用 root
- ✅ 配置防火墙:只开放必要端口
- ✅ 启用网络加速:BBR 让网络起飞
- ✅ 防止暴力破解:fail2ban 自动封禁恶意 IP
做完这些,你的 VPS 就有了一个坚实的基础,可以安心部署各种服务了。
2、计划思考
为什么要做这些配置?
刚买的 VPS 就像一间刚交付的毛坯房:
| 默认状态 | 风险 | 我们的解决方案 |
|---|---|---|
| root 用户直接登录 | 权限过大,误操作后果严重 | 创建普通用户 + sudo |
| 密码登录 | 可被暴力破解 | SSH 密钥登录 |
| 默认 22 端口 | 被扫描器重点照顾 | 改为非标准端口 |
| 防火墙关闭 | 所有端口对外暴露 | UFW 只放行必要端口 |
| 原生网络 | 丢包率高、延迟大 | BBR 拥塞控制算法 |
整体流程

我们按照这个顺序来操作,每一步都会解释为什么这么做。
3、操作步骤
3.1 首次登录与系统更新
获取服务器 IP
购买 VPS 后,服务商会给你:
- IP 地址:如
192.168.1.100 - 端口:通常是
22(有些服务商会改成其他端口) - 用户名:通常是
root - 密码:随机生成的一串字符

SSH 连接
Mac / Linux 用户:打开终端,直接输入:
1 | ssh root@你的服务器IP |
Windows 用户:
首次连接会看到指纹确认提示:
1 | The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established. |
这是在问你:「我不认识这台机器,你确定要连接吗?」
输入 yes 然后回车。接着输入密码(注意:输入时不会显示任何字符,这是正常的安全设计),回车。

看到类似这样的提示,说明登录成功:
1 | Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64) |
💡 为什么要确认指纹?
这是为了防止"中间人攻击"。首次连接时记录服务器指纹,以后连接时如果指纹变了,说明可能有人在冒充你的服务器。

初识你的服务器
登录后,先了解一下这台机器的基本情况:
1 | # 查看系统版本 |

记住这些信息,后续排查问题时会用到。
系统更新
了解完服务器信息,第一件正事是更新系统。新服务器的系统镜像可能是几个月前的,期间可能已经有安全补丁发布:
1 | # 更新软件包列表 + 升级所有软件 + 清理 |
参数解释:
apt update:更新软件包索引apt full-upgrade:升级所有软件,包括内核-y:自动确认,不用手动输入 yesapt autoremove:删除不再需要的依赖apt autoclean:清理下载的安装包缓存

⏱️ 这一步可能需要几分钟,取决于有多少更新。中间偶尔需要确认的,基本上按它的逻辑来就好了。
检查是否需要重启
内核更新后通常需要重启才能生效:
1 | # 检查是否需要重启 |

如果提示需要重启:
1 | reboot |
重启后需要重新 SSH 连接。
安装常用工具
1 | apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch |
这些工具是干嘛的:
| 工具 | 用途 | |
|---|---|---|
sudo |
让普通用户执行管理员命令 | |
curl / wget |
下载文件 | |
git |
版本控制 | |
vim |
文本编辑器 | |
htop |
更好看的进程监控 | |
tree |
树形显示目录结构 | |
net-tools |
网络工具(ifconfig、netstat 等) | |
ufw |
简单好用的防火墙 | |
fail2ban |
防暴力破解 | |
neofetch |
漂亮地显示系统信息 | |
![]() |
3.2 创建非root用户
为什么不直接用 root?
root 用户权限太大了,一个手滑 rm -rf / 就全没了。日常操作应该用普通用户,需要管理员权限时再用 sudo。
龙虾(openclaw)可是怪兽呀,咋敢把 root 给它用呢?
创建用户
1 | # 创建用户(把 ittinker 换成你想要的用户名) |
系统会提示你设置密码和一些信息:
1 | New password: # 输入密码(不会显示) |

授予 sudo 权限
1 | # 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户 |
验证一下:
1 | # 切换到新用户 ittinker 换成你自己上面创建的那个用户 |
如果输出 root,说明 sudo 配置成功。

💡 小技巧
输入
exit可以退回 root 用户。后面的操作我们继续用 root 来配置,配置完成后再切换到普通用户。
3.3 配置SSH密钥登录
密钥认证 vs 密码认证

密钥认证比密码安全得多:
- 密码可以被暴力破解,密钥几乎不可能
- 不用每次输密码,更方便
- 即使密码泄露,没有私钥也登不上
步骤一:本地生成密钥对
在你的电脑(不是服务器)上执行:
1 | # 生成 ED25519 密钥(推荐,更安全更快) |
会提示:
1 | Enter file in which to save the key (/Users/你/.ssh/id_ed25519): |
直接回车使用默认路径。我们这里用了 ./ittinker ,就是表示存在当前路径下,文件名叫 ittinker
1 | Enter passphrase (empty for no passphrase): |
可以设置密钥密码(多一层保护),也可以直接回车留空。

生成完成后,你会在 ~/.ssh/ 目录下看到两个文件(下面是默认文件名,如果前面回车就会这样):
id_ed25519:私钥,绝对不能泄露!id_ed25519.pub:公钥,要上传到服务器
💡 ed25519 vs RSA
ed25519是目前推荐的算法,比传统的 RSA 更安全、密钥更短。如果你的系统太旧不支持,可以用ssh-keygen -t rsa -b 4096。
一个小细节,ed 25519 生成的 key 是比较小的,rsa 的文件很大,问了 AI 才知道,大小没关系,和算法有关系。
步骤二:上传公钥到服务器
方法 A:使用 ssh-copy-id(推荐)
1 | # 在你的电脑上执行 |
输入密码后,公钥会自动复制到服务器。

方法 B:手动复制
如果 ssh-copy-id 不可用,可以手动操作:
1 | # 1. 在你的电脑上,查看公钥内容 |
复制输出的内容(一长串以 ssh-ed25519 开头的文本)。
1 | # 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名 |
⚠️ 权限很重要!
SSH 对文件权限有严格要求:
.ssh目录:700(只有用户自己能访问)authorized_keys文件:600(只有用户自己能读写)权限不对的话,SSH 会拒绝使用密钥登录。
步骤三:测试密钥登录
新开一个终端窗口(保持原窗口不要关,万一配置错了还能补救),测试密钥登录:
1 | ssh ittinker@你的服务器IP |
如果不需要输入密码就能登录,说明密钥配置成功!🎉
(如果你给私钥设置了 passphrase,会提示输入私钥密码,这是正常的)

这里我们加了一个 -i 参数,是因为这个 key,我们不是默认路径,而是放在当前路径下,如果不指定,系统会使用默认 key。
3.4 SSH安全加固
现在密钥登录已经可以用了,我们来加固 SSH:
- 修改默认端口(避免被扫描)
- 禁用密码登录
- 禁止 root 直接登录
编辑 SSH 配置文件
1 | # 备份原配置 |

找到并修改以下配置(有些可能被注释了,去掉前面的 #):
1 | # 修改端口(选一个 1024-65535 之间的数字) |

保存并退出(ctrl + o)。
Nano 保存是 ctrl + o,它会给文件名,直接回车,退出就是 ctrl + x
重启 SSH 服务
1 | systemctl restart sshd.service |
⚠️ 重要提醒!
不要关闭当前终端! 先在新窗口测试新配置能否正常登录:
1 ssh -p 22000 yourname@你的服务器IP如果能登录,再关闭旧窗口。如果登不上,还可以在旧窗口里修复配置。
如果你买的是轻量服务器,大概率这个端口改不了,传统的 ECS 是可以修改的,要注意。
3.5 配置UFW防火墙

UFW(Uncomplicated Firewall)是 Ubuntu 默认的防火墙工具,配置简单但功能强大。
基本配置
1 | # 设置默认策略:拒绝所有入站,允许所有出站 |
启用防火墙
1 | ufw enable |
会提示:
1 | Command may disrupt existing ssh connections. Proceed with operation (y|n)? |
输入 y 确认。
检查状态
1 | ufw status verbose |

23022 是我敲错了,大家按自己的实际情况来就好了
输出类似:
1 | Status: active |
常用命令速查
1 | # 查看状态 |
3.6 开启BBR加速
BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 开发的 TCP 拥塞控制算法,可以显著提升网络性能。
一键开启
1 | # 添加 BBR 配置 |
验证是否开启
1 | # 查看当前拥塞控制算法 |
输出应该是:
1 | net.ipv4.tcp_congestion_control = bbr |
1 | # 确认 BBR 模块已加载 |
输出类似:
1 | tcp_bbr 20480 3 |
💡 BBR 的效果
开启 BBR 后,特别是在网络不稳定或高延迟的环境下,你会明显感觉到:
- 下载速度更快
- SSH 操作更流畅
- 网页加载更快

3.7 配置fail2ban防暴力破解
fail2ban 会监控日志,发现多次登录失败的 IP 后自动封禁。
基本配置
1 | # 复制默认配置(不要直接修改 jail.conf) |
找到 [sshd] 部分,确保以下配置:
1 | [sshd] |

启动服务
1 | # 重启 fail2ban |
查看状态
1 | # 查看 fail2ban 状态 |

输出类似:
1 | Status for the jail: sshd |
常用命令
1 | # 手动封禁 IP |
3.8 [可选] SSH Config 多服务器管理
如果你有多台服务器,每次输入 ssh -p 22000 user@ip 很麻烦。可以用 SSH Config 来简化。
配置文件
在你的本地电脑上编辑 ~/.ssh/config:
1 | vim ~/.ssh/config |
添加配置:
1 | # 第一台服务器 |
使用方法
现在可以直接用别名连接:
1 | # 连接第一台服务器 |
省去了记 IP、端口、用户名的麻烦!
3.9 [可选] 仅允许Cloudflare访问
如果你的网站完全在 Cloudflare 后面,可以设置只允许 Cloudflare 的 IP 访问 80/443 端口,增加安全性。
⚠️ 注意:这个配置需要你的域名已经接入 Cloudflare CDN。
自动配置脚本
1 | # 下载脚本 |
这个脚本会:
- 从 Cloudflare 官方获取最新的 IP 段
- 添加 UFW 规则,只允许这些 IP 访问 80/443
- 重新加载 UFW
设置定时更新
Cloudflare 的 IP 段可能会变化,设置每周自动更新:
1 | # 添加 cron 任务(每周一凌晨执行) |
3.10 设置时区
默认时区可能是 UTC,改成你所在的时区方便看日志:
1 | # 查看当前时区 |

3.11 [可选] 配置自动安全更新
让系统自动安装安全补丁,省得每次手动操作:
1 | # 安装自动更新工具 |
选择「Yes」启用自动更新。
💡 这个功能会自动安装安全更新,不会自动升级到新的大版本,相对安全。
4、总结
初始化检查清单
完成以上配置后,用这个清单检查一遍:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 系统已更新 | apt update && apt list --upgradable |
没有可升级的包 |
| 普通用户可 sudo | sudo whoami |
输出 root |
| 密钥登录正常 | ssh yourname@ip -p port |
无需密码登录 |
| 密码登录已禁用 | grep PasswordAuth /etc/ssh/sshd_config |
PasswordAuthentication no |
| SSH 端口已修改 | grep Port /etc/ssh/sshd_config |
你设置的端口 |
| 防火墙已启用 | ufw status |
Status: active |
| BBR 已开启 | sysctl net.ipv4.tcp_congestion_control |
= bbr |
| fail2ban 运行中 | systemctl status fail2ban |
active (running) |
| 时区已设置 | timedatectl |
Asia/Shanghai 或你的时区 |
| 本地 SSH Config | cat ~/.ssh/config |
已配置服务器别名 |
关键文件位置
1 | /etc/ssh/sshd_config # SSH 服务端配置 |
安全最佳实践
- 定期更新系统:
apt update && apt upgrade - 定期检查登录日志:
lastb(失败登录)、last(成功登录) - 及时关注 fail2ban 封禁情况
- 重要配置文件修改前先备份
5、异常记录
Q1:密钥登录失败,还是要输密码?
可能原因:
-
权限问题(最常见)
1
2
3# 检查并修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys -
公钥没有正确复制
1
2
3# 检查 authorized_keys 内容
cat ~/.ssh/authorized_keys
# 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头 -
SELinux 干扰(CentOS/RHEL 系统)
1
restorecon -Rv ~/.ssh
Q2:改端口后连不上了?
排查步骤:
-
确认新端口在防火墙中已开放:
1
ufw status | grep 你的端口
-
确认 SSH 配置正确:
1
grep Port /etc/ssh/sshd_config
-
确认 SSH 服务正在运行:
1
systemctl status sshd
-
如果完全连不上,用服务商的 VNC/控制台 登录修复。
Q2.5:修改端口根本不生效?(云厂商轻量服务器)
现象:改了 /etc/ssh/sshd_config,重启服务后 22 端口还在,新端口没生效。
诊断方法:
bash
1 | # 查看是谁在监听 22 端口 |
如果输出类似:
1 | tcp 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/init |
说明 22 端口是由 init(PID 1)监听的,而不是 sshd 进程。
原因:部分云厂商的「轻量应用服务器」或「容器实例」的 SSH 是由平台层代理的,你服务器内部的 sshd 配置不起作用。
解决方案:
| 实例类型 | SSH 端口修改方式 |
|---|---|
| 传统 ECS | 修改 sshd_config ✅ |
| 轻量服务器 | 可能需要在云控制台修改,或根本不支持 |
| 容器实例 | 通常不支持修改 |
如果你的实例不支持改端口,其他安全措施更重要:
- ✅ 创建普通用户 + 禁用 root 登录
- ✅ SSH 密钥登录 + 禁用密码登录
- ✅ fail2ban 防暴力破解
这些措施做到位,安全性依然很高。
Q3:fail2ban 把我自己封了?
1 | # 用 VNC 登录后解封 |
Q4:UFW 启用后网站访问不了?
1 | # 检查 80/443 是否开放 |
Q5:执行命令提示找不到 sudo?
Debian 最小化安装可能没有 sudo,用 root 安装:
1 | apt install sudo |
6、一键初始化脚本(熟练后使用)
如果你已经熟悉了上面的步骤,可以用这个脚本快速初始化。
⚠️ 注意:运行脚本前,先确保你已经准备好了 SSH 公钥。
1 |
|
7、做完这些,安全性提升了多少?
| 步骤 | 做了什么 | 为什么重要 |
|---|---|---|
| 更新系统 | 安装最新补丁 | 修复已知漏洞 |
| 创建新用户 | 不再直接用 root | 减少误操作风险 |
| SSH 密钥 | 用密钥替代密码 | 无法被暴力破解 |
| 修改端口 | 躲开默认的 22 | 减少被扫描到的概率 |
| 禁用密码 | 只允许密钥登录 | 彻底杜绝密码攻击 |
| 禁用 root | root 不能直接登录 | 增加攻击难度 |
| UFW 防火墙 | 只开放必要端口 | 减少攻击面 |
| BBR 加速 | 优化网络性能 | 提升访问速度 |
| fail2ban | 自动封禁恶意 IP | 防止持续攻击 |
做完这些,你的服务器安全性已经超过了 90% 的 VPS。
下一篇预告
下一篇我们来讲 SSH密钥登录配置速查,会更详细地介绍:
- 不同系统生成密钥的方法
- 多密钥管理
- SSH Agent 配置
- 常见 SSH 客户端设置
本文最后更新:2026年1月
独立开发者工具箱系列,欢迎关注!



