Debian VPS 问题排查与安全加固

前言

管理一台 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个为例)。

解决方案:

  1. 手动清理:首先手动删除旧文件,释放空间。注意 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
  2. 修复自动脚本:编辑 /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 工具进行转换。

  1. 安装工具:Bashsudo apt-get update && sudo apt-get install -y dos2unix
  2. 转换文件:Bashsudo 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)

日志是另一个容易被忽略的空间消耗者。

解决方案

  1. 清理 systemd journal 日志:这是现代 Debian 系统的标准日志。Bash# 查看当前 journal 日志大小 journalctl --disk-usage # 清理日志,只保留最近3天的 sudo journalctl --vacuum-time=3d
  2. 清理传统文本日志:位于 /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 电脑上生成密钥对

  1. 打开 PowerShellCMD 终端。
  2. 运行命令生成密钥:PowerShellssh-keygen -t rsa -b 4096
  3. 系统会提示您保存位置,直接按 回车 即可。密钥默认会保存在 C:\Users\您的用户名\.ssh\ 目录下。
  4. 系统会提示您输入密码 (passphrase),强烈建议设置一个,这是对您私钥文件的二次保护。

步骤 2:手动将公钥上传到服务器

  1. 本地 Windows 终端中,显示您的公钥内容:PowerShelltype $env:USERPROFILE\.ssh\id_rsa.pub
  2. 完整复制屏幕上输出的所有内容(从 ssh-rsa 开头到结尾)。
  3. 使用密码登录到您的 Debian VPS
  4. 服务器上,依次执行以下命令,将您的公钥写入认证文件:Bash
  5. # 1. 创建 .ssh 目录并设置权限 (如果目录已存在,此命令不会报错)
  6. mkdir -p ~/.ssh
  7. chmod 700 ~/.ssh
  8. # 2. 将您复制的公钥内容粘贴到引号内,然后执行
  9. echo "在这里粘贴您在Windows上复制的公钥内容" >> ~/.ssh/authorized_keys
  10. # 3. 设置认证文件的严格权限
  11. chmod 600 ~/.ssh/authorized_keys
  12. 注意:双引号是必须的,权限设置 (chmod) 也必须正确,否则密钥无法生效。

步骤 3:测试并禁用密码登录

  1. 测试密钥登录警告:在关闭当前连接之前,请务必完成此测试,防止将自己锁在外面!打开一个全新的本地 PowerShell 或 CMD 窗口,尝试登录服务器:PowerShellssh your_user@your_server_ip 如果系统提示您输入的是密钥的密码 (passphrase) 或直接登录成功,而不是服务器的登录密码,则代表配置成功。
  2. 在服务器上禁用密码登录:在确认密钥登录成功后,回到之前的服务器终端窗口:
    • 编辑 SSH 配置文件: sudo nano /etc/ssh/sshd_config
    • 找到并修改 PasswordAuthentication yesPasswordAuthentication no
    • 仔细检查文件中没有其他冲突的 PasswordAuthentication 设置。
    • 保存文件并重启 SSH 服务: sudo systemctl restart sshd
  3. 最终验证:再次打开一个全新的本地终端,ssh your_user@your_server_ip,确认只能通过密钥登录。

结语

通过以上一系列的排查和配置,我的 VPS 不仅恢复了健康的磁盘空间,更重要的是,服务器的“前门”被牢牢锁上,变得更加安全。希望这篇详尽的实战记录,能成为您服务器管理工具箱中的得力助手。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注