VPS 到手后的第一个小时:从裸机到安全可用的完整初始化指南(让你的OpenClaw更安全)
VPS 到手后的第一个小时:从裸机到安全可用的完整初始化指南(让你的OpenClaw更安全)
VPS 到手后的第一个小时:从裸机到安全可用的完整初始化指南(让你的OpenClaw更安全) VPS 到手后的第一个小时:从裸机到安全可用的完整初始化指南(让你的OpenClaw更安全) Modified March 10 添加配置: Code block Bash Copy 第一台服务器 Host vps1 HostName 192.168.1.100 User yourname Port 22000 IdentityFile /.ssh/id ed25519 第二台服务器 Host vps2 HostName 192.168.1.101 User admin Port 22222 IdentityFile /.ssh/id ed25519 通用设置(应用于所有连接) Host ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes 使用方法 现在可以直接用别名连接: Code block Plain Text Copy 连接第一台服务器 ssh vps1 连接第二台服务器 ssh vps2 省去了记 IP、端口、用户名的麻烦! 3.9 [可选] 仅允许Cloudflare访问 如果你的网站完全在 Cloudflare 后面,可以设置只允许 Cloudflare 的 IP 访问 80/443 端口,增加安全性。 ⚠️ 注意:这个配置需要你的域名已经接入 Cloudflare CDN。 自动配置脚本 Code block Markdown Copy 下载脚本 wget O /.cloudflare ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare ufw.sh 添加执行权限 chmod +x /.cloudflare ufw.sh 执行脚本 /.cloudflare ufw.sh 这个脚本会: 1. 从 Cloudflare 官方获取最新的 IP 段 2. 添加 UFW 规则,只允许这些 IP 访问 80/443 3. 重新加载 UFW 设置定时更新 Cloudflare 的 IP 段可能会变化,设置每周自动更新: Code block Plain Text Copy 添加 cron 任务(每周一凌晨执行) (crontab l 2 /dev/null; echo "0 0 1 /root/.cloudflare ufw.sh /dev/null 2 &1") | crontab 3.10 设置时区 默认时区可能是 UTC,改成你所在的时区方便看日志: Code block Plain Text Copy 查看当前时区 timedatectl 设置为上海时区(中国用户) sudo timedatectl set timezone Asia/Shanghai 验证 date 3.11 [可选] 配置自动安全更新 让系统自动安装安全补丁,省得每次手动操作: Code block Plain Text Copy 安装自动更新工具 sudo apt install y unattended upgrades 配置 sudo dpkg reconfigure priority=low unattended upgrades 选择「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 已配置服务器别名 关键文件位置 Code block Bash Copy /etc/ssh/sshd config SSH 服务端配置 /.ssh/authorized keys 允许登录的公钥 /.ssh/config 本地 SSH 客户端配置(在你电脑上) /etc/fail2ban/jail.local fail2ban 配置 安全最佳实践 1. 定期更新系统 : apt update && apt upgrade 2. 定期检查登录日志 : lastb (失败登录)、 last (成功登录) 3. 及时关注 fail2ban 封禁情况 4. 重要配置文件修改前先备份 5、异常记录 Q1:密钥登录失败,还是要输密码? 可能原因: 1. 权限问题 (最常见) Code block Plain Text Copy 检查并修复权限 chmod 700 /.ssh chmod 600 /.ssh/authorized keys 2. 公钥没有正确复制 Code block Plain Text Copy 检查 authorized keys 内容 cat /.ssh/authorized keys 应该是一行完整的公钥,以 ssh ed25519 或 ssh rsa 开头 3. SELinux 干扰 (CentOS/RHEL 系统) Code block Plain Text Copy restorecon Rv /.ssh Q2:改端口后连不上了? 排查步骤: 1. 确认新端口在防火墙中已开放: Code block Plain Text Copy ufw status | grep 你的端口 2. 确认 SSH 配置正确: Code block Plain Text Copy grep Port /etc/ssh/sshd config 3. 确认 SSH 服务正在运行: Code block Plain Text Copy systemctl status sshd 4. 如果完全连不上,用服务商的 VNC/控制台 登录修复。 Q2.5:修改端口根本不生效?(云厂商轻量服务器) 现象 :改了 /etc/ssh/sshd config ,重启服务后 22 端口还在,新端口没生效。 诊断方法 : bash Code block Plain Text Copy 查看是谁在监听 22 端口 netstat lntp | grep :22 如果输出类似: Code block Plain Text Copy 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 ✅ 轻量服务器 可能需要在云控制台修改,或根本不支持 容器实例 通常不支持修改 添加配置: 使用方法 现在可以直接用别名连接: 省去了记 IP、端口、用户名的麻烦! 3.9 [可选] 仅允许Cloudflare访问 如果你的网站完全在 Cloudflare 后面,可以设置只允许 Cloudflare 的 IP 访问 80/443 端口,增加安全性。 ⚠️ 注意:这个配置需要你的域名已经接入 Cloudflare CDN。 自动配置脚本 这个脚本会: 1. 从 Cloudflare 官方获取最新的 IP 段 2. 添加 UFW 规则,只允许这些 IP 访问 80/443 3. 重新加载 UFW 设置定时更新 Cloudflare 的 IP 段可能会变化,设置每周自动更新: 3.10 设置时区 默认时区可能是 UTC,改成你所在的时区方便看日志: 3.11 [可选] 配置自动安全更新 让系统自动安装安全补丁,省得每次手动操作: 选择「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 已配置服务器别名 检查项 检查项 命令 命令 预期结果 预期结果 系统已更新 系统已更新 apt update && apt list upgradable apt update && apt list upgradable 没有可升级的包 没有可升级的包 普通用户可 sudo 普通用户可 sudo sudo whoami sudo whoami 输出 root 输出 root 密钥登录正常 密钥登录正常 ssh yourname@ip p port ssh yourname@ip p port 无需密码登录 无需密码登录 密码登录已禁用 密码登录已禁用 grep PasswordAuth /etc/ssh/sshd config grep PasswordAuth /etc/ssh/sshd config PasswordAuthentication no PasswordAuthentication no SSH 端口已修改 SSH 端口已修改 grep Port /etc/ssh/sshd config grep Port /etc/ssh/sshd config 你设置的端口 你设置的端口 防火墙已启用 防火墙已启用 ufw status ufw status Status: active Status: active BBR 已开启 BBR 已开启 sysctl net.ipv4.tcp congestion control sysctl net.ipv4.tcp congestion control = bbr = bbr fail2ban 运行中 fail2ban 运行中 systemctl status fail2ban systemctl status fail2ban active (running) active (running) 时区已设置 时区已设置 timedatectl timedatectl Asia/Shanghai 或你的时区 Asia/Shanghai 或你的时区 本地 SSH Config 本地 SSH Config cat /.ssh/config cat /.ssh/config 已配置服务器别名 已配置服务器别名 关键文件位置 安全最佳实践 1. 定期更新系统 : apt update && apt upgrade 2. 定期检查登录日志 : lastb (失败登录)、 last (成功登录) 3. 及时关注 fail2ban 封禁情况 4. 重要配置文件修改前先备份 5、异常记录 Q1:密钥登录失败,还是要输密码? 可能原因: 1. 权限问题 (最常见) 2. 公钥没有正确复制 3. SELinux 干扰 (CentOS/RHEL 系统) Q2:改端口后连不上了? 排查步骤: 1. 确认新端口在防火墙中已开放: 2. 确认 SSH 配置正确: 3. 确认 SSH 服务正在运行: 4. 如果完全连不上,用服务商的 VNC/控制台 登录修复。 Q2.5:修改端口根本不生效?(云厂商轻量服务器) 现象 :改了 /etc/ssh/sshd config ,重启服务后 22 端口还在,新端口没生效。 诊断方法 : bash 如果输出类似: 说明 22 端口是由 init (PID 1)监听的,而不是 sshd 进程。 原因 :部分云厂商的「轻量应用服务器」或「容器实例」的 SSH 是由 平台层代理 的,你服务器内部的 sshd 配置不起作用。 解决方案 : 实例类型 SSH 端口修改方式 传统 ECS 修改 sshd config ✅ 轻量服务器 可能需要在云控制台修改,或根本不支持 容器实例 通常不支持修改 实例类型 实例类型 SSH 端口修改方式 SSH 端口修改方式 传统 ECS 传统 ECS 修改 sshd config ✅ 修改 sshd config ✅ 轻量服务器 轻量服务器 可能需要在云控制台修改,或根本不支持 可能需要在云控制台修改,或根本不支持 容器实例 容器实例 通常不支持修改 通常不支持修改 如果你的实例不支持改端口, 其他安全措施更重要 : • ✅ 创建普通用户 + 禁用 root 登录 • ✅ SSH 密钥登录 + 禁用密码登录 • ✅ fail2ban 防暴力破解 这些措施做到位,安全性依然很高。 Q3:fail2ban 把我自己封了? Q4:UFW 启用后网站访问不了? Q5:执行命令提示找不到 sudo? Debian 最小化安装可能没有 sudo,用 root 安装: 6、一键初始化脚本(熟练后使用) 如果你已经熟悉了上面的步骤,可以用这个脚本快速初始化。 ⚠️ 注意 :运行脚本前,先确保你已经准备好了 SSH 公钥。 7、做完这些,安全性提升了多少? 步骤 做了什么 为什么重要 更新系统 安装最新补丁 修复已知漏洞 创建新用户 不再直接用 root 减少误操作风险 SSH 密钥 用密钥替代密码 无法被暴力破解 修改端口 躲开默认的 22 减少被扫描到的概率 禁用密码 只允许密钥登录 彻底杜绝密码攻击 禁用 root root 不能直接登录 增加攻击难度 UFW 防火墙 只开放必要端口 减少攻击面 BBR 加速 优化网络性能 提升访问速度 fail2ban 自动封禁恶意 IP 防止持续攻击 步骤 步骤 做了什么 做了什么 为什么重要 为什么重要 更新系统 更新系统 安装最新补丁 安装最新补丁 修复已知漏洞 修复已知漏洞 创建新用户 创建新用户 不再直接用 root 不再直接用 root 减少误操作风险 减少误操作风险 SSH 密钥 SSH 密钥 用密钥替代密码 用密钥替代密码 无法被暴力破解 无法被暴力破解 修改端口 修改端口 躲开默认的 22 躲开默认的 22 减少被扫描到的概率 减少被扫描到的概率 禁用密码 禁用密码 只允许密钥登录 只允许密钥登录 彻底杜绝密码攻击 彻底杜绝密码攻击 禁用 root 禁用 root root 不能直接登录 root 不能直接登录 增加攻击难度 增加攻击难度 UFW 防火墙 UFW 防火墙 只开放必要端口 只开放必要端口 减少攻击面 减少攻击面 BBR 加速 BBR 加速 优化网络性能 优化网络性能 提升访问速度 提升访问速度 fail2ban fail2ban 自动封禁恶意 IP 自动封禁恶意 IP 防止持续攻击 防止持续攻击 做完这些,你的服务器安全性已经超过了 90% 的 VPS。 下一篇预告 下一篇我们来讲 SSH密钥登录配置速查 ,会更详细地介绍: • 不同系统生成密钥的方法 • 多密钥管理 • SSH Agent 配置 • 常见 SSH 客户端设置 本文最后更新:2026年1月 独立开发者工具箱系列,欢迎关注! 🔗 原文链接: https://blog.ittinker.com/posts/202... https://blog.ittinker.com/posts/202... 作者: ittinker.com ittinker.com 新买的 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 拥塞控制算法 默认状态 默认状态 风险 风险 我们的解决方案 我们的解决方案 root 用户直接登录 root 用户直接登录 权限过大,误操作后果严重 权限过大,误操作后果严重 创建普通用户 + sudo 创建普通用户 + sudo 密码登录 密码登录 可被暴力破解 可被暴力破解 SSH 密钥登录 SSH 密钥登录 默认 22 端口 默认 22 端口 被扫描器重点照顾 被扫描器重点照顾 改为非标准端口 改为非标准端口 防火墙关闭 防火墙关闭 所有端口对外暴露 所有端口对外暴露 UFW 只放行必要端口 UFW 只放行必要端口 原生网络 原生网络 丢包率高、延迟大 丢包率高、延迟大 BBR 拥塞控制算法 BBR 拥塞控制算法 整体流程 我们按照这个顺序来操作,每一步都会解释为什么这么做。 3、操作步骤 3.1 首次登录与系统更新 获取服务器 IP 购买 VPS 后,服务商会给你: • IP 地址 :如 192.168.1.100 • 端口 :通常是 22 (有些服务商会改成其他端口) • 用户名 :通常是 root • 密码 :随机生成的一串字符 SSH 连接 Mac / Linux 用户 :打开终端,直接输入: Windows 用户 : • Windows 10/11 自带 OpenSSH,可以直接在 PowerShell 或 CMD 中使用上面的命令 • 或者使用 Termius 、 MobaXterm 等工具 Termius MobaXterm 首次连接会看到指纹确认提示: 这是在问你:「我不认识这台机器,你确定要连接吗?」 输入 yes 然后回车。接着输入密码( 注意:输入时不会显示任何字符,这是正常的安全设计 ),回车。 看到类似这样的提示,说明登录成功: 💡 为什么要确认指纹? 这是为了防止"中间人攻击"。首次连接时记录服务器指纹,以后连接时如果指纹变了,说明可能有人在冒充你的服务器。 初识你的服务器 登录后,先了解一下这台机器的基本情况: 记住这些信息,后续排查问题时会用到。 系统更新 了解完服务器信息,第一件正事是更新系统。新服务器的系统镜像可能是几个月前的,期间可能已经有安全补丁发布: 参数解释: • apt update :更新软件包索引 • apt full upgrade :升级所有软件,包括内核 • y :自动确认,不用手动输入 yes • apt autoremove :删除不再需要的依赖 • apt autoclean :清理下载的安装包缓存 ⏱️ 这一步可能需要几分钟,取决于有多少更新。中间偶尔需要确认的,基本上按它的逻辑来就好了。 检查是否需要重启 内核更新后通常需要重启才能生效: 如果提示需要重启: 重启后需要重新 SSH 连接。 安装常用工具 这些工具是干嘛的: 工具 用途 sudo 让普通用户执行管理员命令 curl / wget 下载文件 git 版本控制 vim 文本编辑器 htop 更好看的进程监控 tree 树形显示目录结构 net tools 网络工具(ifconfig、netstat 等) ufw 简单好用的防火墙 fail2ban 防暴力破解 neofetch 漂亮地显示系统信息 工具 工具 用途 用途 sudo sudo 让普通用户执行管理员命令 让普通用户执行管理员命令 curl / wget curl / wget 下载文件 下载文件 git git 版本控制 版本控制 vim vim 文本编辑器 文本编辑器 htop htop 更好看的进程监控 更好看的进程监控 tree tree 树形显示目录结构 树形显示目录结构 net tools net tools 网络工具(ifconfig、netstat 等) 网络工具(ifconfig、netstat 等) ufw ufw 简单好用的防火墙 简单好用的防火墙 fail2ban fail2ban 防暴力破解 防暴力破解 neofetch neofetch 漂亮地显示系统信息 漂亮地显示系统信息 3.2 创建非root用户 为什么不直接用 root? root 用户权限太大了,一个手滑 rm rf / 就全没了。日常操作应该用普通用户,需要管理员权限时再用 sudo 。 龙虾(openclaw)可是怪兽呀,咋敢把 root 给它用呢? 创建用户 系统会提示你设置密码和一些信息: 授予 sudo 权限 验证一下: 如果输出 root ,说明 sudo 配置成功。 💡 小技巧 输入 exit 可以退回 root 用户。后面的操作我们继续用 root 来配置,配置完成后再切换到普通用户。 3.3 配置SSH密钥登录 密钥认证 vs 密码认证 密钥认证比密码安全得多: • 密码可以被暴力破解,密钥几乎不可能 • 不用每次输密码,更方便 • 即使密码泄露,没有私钥也登不上 步骤一:本地生成密钥对 在 你的电脑 (不是服务器)上执行: 会提示: 直接回车使用默认路径。我们这里用了 ./ittinker ,就是表示存在当前路径下,文件名叫 ittinker 可以设置密钥密码(多一层保护),也可以直接回车留空。 生成完成后,你会在 /.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(推荐) 输入密码后,公钥会自动复制到服务器。 方法 B:手动复制 如果 ssh copy id 不可用,可以手动操作: 复制输出的内容(一长串以 ssh ed25519 开头的文本)。 ⚠️ 权限很重要! SSH 对文件权限有严格要求: • .ssh 目录:700(只有用户自己能访问) • authorized keys 文件:600(只有用户自己能读写) 权限不对的话,SSH 会拒绝使用密钥登录。 步骤三:测试密钥登录 新开一个终端窗口 (保持原窗口不要关,万一配置错了还能补救),测试密钥登录: 如果不需要输入密码就能登录,说明密钥配置成功!🎉 (如果你给私钥设置了 passphrase,会提示输入私钥密码,这是正常的) 这里我们加了一个 i 参数,是因为这个 key,我们不是默认路径,而是放在当前路径下,如果不指定,系统会使用默认 key。 3.4 SSH安全加固 现在密钥登录已经可以用了,我们来加固 SSH: 1. 修改默认端口(避免被扫描) 2. 禁用密码登录 3. 禁止 root 直接登录 编辑 SSH 配置文件 找到并修改以下配置(有些可能被注释了,去掉前面的 ): 保存并退出( ctrl + o )。 Nano 保存是 ctrl + o,它会给文件名,直接回车,退出就是 ctrl + x 重启 SSH 服务 ⚠️ 重要提醒! 不要关闭当前终端! 先在新窗口测试新配置能否正常登录: 如果能登录,再关闭旧窗口。如果登不上,还可以在旧窗口里修复配置。 如果你买的是轻量服务器,大概率这个端口改不了,传统的 ECS 是可以修改的,要注意。 3.5 配置UFW防火墙 UFW(Uncomplicated Firewall)是 Ubuntu 默认的防火墙工具,配置简单但功能强大。 基本配置 启用防火墙 会提示: 输入 y 确认。 检查状态 23022 是我敲错了,大家按自己的实际情况来就好了 输出类似: 常用命令速查 3.6 开启BBR加速 BBR(Bottleneck Bandwidth and Round trip propagation time)是 Google 开发的 TCP 拥塞控制算法,可以显著提升网络性能。 一键开启 验证是否开启 输出应该是: 输出类似: 💡 BBR 的效果 开启 BBR 后,特别是在网络不稳定或高延迟的环境下,你会明显感觉到: • 下载速度更快 • SSH 操作更流畅 • 网页加载更快 3.7 配置fail2ban防暴力破解 fail2ban 会监控日志,发现多次登录失败的 IP 后自动封禁。 基本配置 找到 [sshd] 部分,确保以下配置: 启动服务 查看状态 输出类似: 常用命令 3.8 [可选] SSH Config 多服务器管理 如果你有多台服务器,每次输入 ssh p 22000 user@ip 很麻烦。可以用 SSH Config 来简化。 配置文件 在 你的本地电脑 上编辑 /.ssh/config :