前言
管理一台 VPS 服务器就像是维护一辆车,需要定期的检查和保养。最近,我遇到了一个典型的问题:一台用于备份的 VPS 磁盘空间频繁告急,同时日志显示服务器正遭受持续的网络攻击。经过一番排查,我不仅解决了空间问题,还对服务器的安全性进行了一次彻底的升级。
这篇教程记录了从发现问题、诊断分析到最终解决并加固的全过程,特别为使用 Windows 系统进行远程管理的朋友们提供了详尽的步骤,希望能为您未来遇到类似问题时提供一份清晰的路线图。
第一章:解决失控的自动备份(磁盘空间危机)
1.1 症状:磁盘可用空间越来越小
问题的最初表现是 vps2 的磁盘空间被逐渐占满。要解决问题,首先要找到“元凶”。
诊断工具:
df -h:查看各个分区的磁盘使用情况。du -ah / | sort -rh | head -n 20:找出系统中最大的20个文件或目录。
通过 du 命令,我迅速定位到 /root/vps-backup 目录占用了大量空间,里面堆积了每日的备份文件。
1.2 寻找根源:谁在执行备份和清理?
自动任务通常由 cron 服务管理。我们需要检查备份的发起方 (vps1) 和接收方 (vps2)。
诊断工具:
crontab -l:检查当前用户的定时任务。sudo crontab -l:检查root用户的定时任务。ls -l /etc/cron.daily/:检查系统每日执行的任务脚本。
最终发现:
- 备份源 (
vps1): 在root用户的crontab中发现了一个脚本/root/backup-scripts/vps_backup_to_tencent.sh,它在每天凌晨2点执行,负责打包并发送备份。 - 清理脚本 (
vps2): 在/etc/cron.daily/目录下发现了一个名为cleanup-vps-backups的脚本,它本应负责清理旧备份,但显然没有正常工作。
1.3 修复:编写一个可靠的清理脚本
问题的核心在于 vps2 上的清理脚本失效了。我们需要修复它,让它只保留最近的 N 个备份(这里以2个为例)。
解决方案:
- 手动清理:首先手动删除旧文件,释放空间。注意
ls命令需要-d参数来只列出目录本身,rm命令需要-r来删除目录。Bash# 将 /path/to/backups/backup-prefix-* 替换为你的实际路径和文件/目录名前缀 ls -dt /path/to/backups/backup-prefix-* | tail -n +3 | xargs -r sudo rm -r - 修复自动脚本:编辑
/etc/cron.daily/cleanup-vps-backups文件,将其内容替换为以下稳定可靠的版本:Bash#!/bin/bash # 功能:保留最新的2个备份目录,其余全部删除。 # -d 参数让 ls 只列出目录名,而不是其内容。 # -t 参数按时间排序。 ls -dt /root/vps-backup/safe-code-1.localdomain-* | tail -n +3 | xargs -r rm -r
1.4 疑难杂症:脚本为何无法执行?
修复脚本后,手动执行时遇到了一个奇怪的错误:No such file or directory,尽管文件明明存在。
问题根源:这是典型的文件行结尾符格式错误。脚本文件是从 Windows 环境下复制或编辑的,使用了 CRLF (\r\n) 换行符,而 Linux 系统只认识 LF (\n)。
解决方案:使用 dos2unix 工具进行转换。
- 安装工具:Bash
sudo apt-get update && sudo apt-get install -y dos2unix - 转换文件:Bash
sudo dos2unix /etc/cron.daily/cleanup-vps-backups
转换后,脚本即可正常执行,自动清理任务正式修复。
第二章:服务器空间深度大扫除
备份问题解决后,我发现服务器上还有其他“空间大户”。
2.1 为 Docker“瘦身” (5.4 GB)
Docker 是空间消耗大户,其镜像和容器会占用大量空间。
解决方案:使用 Docker 官方清理命令。
Bash
# 安全清理:删除已停止的容器、悬空镜像和无用的网络
docker system prune
# 深度清理:额外删除所有未被使用的镜像(慎用!)
docker system prune -a
2.2 清理日志文件 (1.4 GB)
日志是另一个容易被忽略的空间消耗者。
解决方案:
- 清理 systemd journal 日志:这是现代 Debian 系统的标准日志。Bash
# 查看当前 journal 日志大小 journalctl --disk-usage # 清理日志,只保留最近3天的 sudo journalctl --vacuum-time=3d - 清理传统文本日志:位于
/var/log下的其他日志文件。- 查看大文件:
ls -lSh /var/log - 安全删除旧的压缩日志:
sudo find /var/log -name "*.gz" -delete - 安全清空正在写入的大日志文件(不要直接
rm!):Bash# 将 syslog 替换为具体的大文件名 sudo truncate -s 0 /var/log/syslog
- 查看大文件:
第三章:安全加固:从密码登录到 SSH 密钥 (Windows 用户特别版)
在排查日志时,我发现服务器正遭受持续的 SSH 暴力破解攻击,这是日志文件巨大的主要原因。是时候升级服务器的安全等级了。
3.1 诊断威胁:fail2ban 告诉我们什么
fail2ban 是一个 great 的工具,可以自动封禁恶意 IP。通过检查它的状态,我们可以了解攻击的猛烈程度。
诊断命令:
Bash
sudo fail2ban-client status sshd
输出结果中 Total failed 的数值巨大,说明必须立刻加固 SSH。
3.2 终极安全方案:禁用密码,只用 SSH 密钥
这是提升服务器安全性的最重要一步。对于 Windows 用户,我们没有 ssh-copy-id 命令,需要手动完成。
步骤 1:在您的 Windows 电脑上生成密钥对
- 打开 PowerShell 或 CMD 终端。
- 运行命令生成密钥:PowerShell
ssh-keygen -t rsa -b 4096 - 系统会提示您保存位置,直接按 回车 即可。密钥默认会保存在
C:\Users\您的用户名\.ssh\目录下。 - 系统会提示您输入密码 (passphrase),强烈建议设置一个,这是对您私钥文件的二次保护。
步骤 2:手动将公钥上传到服务器
- 在本地 Windows 终端中,显示您的公钥内容:PowerShell
type $env:USERPROFILE\.ssh\id_rsa.pub - 完整复制屏幕上输出的所有内容(从
ssh-rsa开头到结尾)。 - 使用密码登录到您的 Debian VPS。
- 在服务器上,依次执行以下命令,将您的公钥写入认证文件:Bash
# 1. 创建 .ssh 目录并设置权限 (如果目录已存在,此命令不会报错)mkdir -p ~/.sshchmod 700 ~/.ssh# 2. 将您复制的公钥内容粘贴到引号内,然后执行echo "在这里粘贴您在Windows上复制的公钥内容" >> ~/.ssh/authorized_keys# 3. 设置认证文件的严格权限chmod 600 ~/.ssh/authorized_keys- 注意:双引号是必须的,权限设置 (
chmod) 也必须正确,否则密钥无法生效。
步骤 3:测试并禁用密码登录
- 测试密钥登录:警告:在关闭当前连接之前,请务必完成此测试,防止将自己锁在外面!打开一个全新的本地 PowerShell 或 CMD 窗口,尝试登录服务器:PowerShell
ssh your_user@your_server_ip如果系统提示您输入的是密钥的密码 (passphrase) 或直接登录成功,而不是服务器的登录密码,则代表配置成功。 - 在服务器上禁用密码登录:在确认密钥登录成功后,回到之前的服务器终端窗口:
- 编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config - 找到并修改
PasswordAuthentication yes为PasswordAuthentication no。 - 仔细检查文件中没有其他冲突的
PasswordAuthentication设置。 - 保存文件并重启 SSH 服务:
sudo systemctl restart sshd
- 编辑 SSH 配置文件:
- 最终验证:再次打开一个全新的本地终端,ssh your_user@your_server_ip,确认只能通过密钥登录。
结语
通过以上一系列的排查和配置,我的 VPS 不仅恢复了健康的磁盘空间,更重要的是,服务器的“前门”被牢牢锁上,变得更加安全。希望这篇详尽的实战记录,能成为您服务器管理工具箱中的得力助手。