关于 secure-vps-setup
面向新 Linux VPS 的分阶段安全指导技能,解释各项防护措施的作用,并通过检查点和验证推进设置,内容涉及网络控制、Docker 服务、Crowdsec 和备份。
主要功能
- 01分阶段说明操作目的
- 02操作系统与网络加固步骤
- 03Docker、Traefik 和 Watchtower 设置
- 04Crowdsec 防护配置
- 05备份与设置验证指导
适用场景
- 01加固新部署的 Linux VPS
- 02通过 Traefik 部署 Docker 服务
- 03配置 Crowdsec 封禁恶意 IP
- 04规划 VPS 备份并执行最终检查
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tibobfd/ skills-secure-vps-for-beginners --skill secure-vps-setup安装后在 Claude Code 中输入/secure-vps-setup确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdLICENSEreferences/docker-compose-templates.mdsecurity-concepts.mdscripts/verify_setup.sh详细介绍
交互指南
- 先讲“为什么”: 告诉用户运行命令之前,务必解释命令的作用以及它如何提升安全性。
- 分阶段进行: 不要一次性输出整份指南。按阶段逐步讲解。
- 设置检查点: 每个阶段结束后,都要询问用户是否准备好继续。
- 验证: 鼓励用户在进入下一层之前验证是否成功(例如:“现在试着登录”)。
激活时(第一轮)
- 欢迎用户。
- 概述威胁: 简要说明我们为什么要做这些(参考资料中的“The Stakes”部分)。
- 介绍计划: 列出将要讲解的 6 个阶段。
- 询问:“准备好开始阶段 1:操作系统加固了吗?”
安全 VPS 设置指南(专家版)
先决条件
- 一台全新的 Linux VPS(建议使用最新版本的 Ubuntu LTS)。
- Root 或
sudo访问权限。 - 一个域名(用于 Traefik)。
参考资料
-> 阅读 references/security-concepts.md,了解详细概念。
阶段 1:操作系统加固与网络
目标: 在对外开放任何服务之前,保护好操作系统基础。
- 更新系统:
sudo apt update && sudo apt upgrade -y - 安装必要工具:
sudo apt install ufw unattended-upgrades apt-listchanges -y - 配置无人值守升级:
启用自动安全更新。
sudo dpkg-reconfigure -plow unattended-upgrades # Select 'Yes' - Sysctl 加固(内核安全):
阻止常见的网络攻击(IP 欺骗、重定向)。
cat <<EOF | sudo tee /etc/sysctl.d/99-security.conf net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.tcp_syncookies = 1 EOF sudo sysctl --system - 配置防火墙(UFW):
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh # CRITICAL: Don't lock yourself out! sudo ufw enable
阶段 2:SSH 加固(高优先级)
目标: 使用加密密钥替代弱密码。
- 生成密钥(在你的本地计算机上):
如果你还没有密钥:
ssh-keygen -t ed25519 -C "[email protected]" - 将密钥复制到 VPS(在你的本地计算机上):
ssh-copy-id user@your-vps-ip - 测试登录:
打开一个新终端,尝试运行
ssh user@your-vps-ip。此时不应该要求输入密码(或者只要求输入密钥密码)。 - 收紧 SSH 配置(在 VPS 上):
编辑
/etc/ssh/sshd_config:
设置以下值:sudo nano /etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no ChallengeResponseAuthentication no - 重启 SSH:
sudo systemctl restart ssh
阶段 3:安全访问(Tailscale)
目标: 完全阻止管理端口暴露在公共互联网中。
- 安装 Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up - 允许 Tailscale 流量:
这样可以允许所有流量(包括 SSH)通过专用 VPN 隧道。
sudo ufw allow in on tailscale0 - 测试连接(至关重要):
- 查找你的 Tailscale IP:
tailscale ip -4 - 在本地计算机上使用该 IP 尝试通过 SSH 连接到 VPS:
ssh [email protected]
- 查找你的 Tailscale IP:
- 关闭公共入口:
确认可以通过 Tailscale 连接后,移除公共 SSH 规则。
⚠️ 安全保障: 确保你可以访问 VPS 提供商的“Web Console”或“KVM”(例如 OVH/Hetzner 控制面板)。如果 Tailscale 连接失败,这是你唯一能重新连接的方式!
现在,端口 22 对公共互联网不可见,但通过 VPN 仍可正常使用。sudo ufw delete allow ssh
阶段 4:核心服务(Docker 和 Watchtower)
目标: 运行应用并自动更新。
- 安装 Docker:
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # Log out and back in - 创建网络:
docker network create proxy-net - 部署 Traefik:
-> 从 references/docker-compose-templates.md 复制配置
在
~/app-data/traefik中部署。 重要准备工作: Traefik 对证书文件有严格的权限要求。mkdir -p ~/app-data/traefik/letsencrypt touch ~/app-data/traefik/letsencrypt/acme.json chmod 600 ~/app-data/traefik/letsencrypt/acme.json - 部署 Watchtower:
-> 从 references/docker-compose-templates.md 复制配置
创建
~/app-data/watchtower/docker-compose.yml并部署。
阶段 5:主动防御(Crowdsec)
目标: 自动封禁恶意 IP。
方法 A:主机安装(推荐) 最适合保护服务器本身(SSH、系统日志)并直接管理防火墙。
-
安装 Crowdsec:
curl -s https://install.crowdsec.net | sudo sh sudo apt install crowdsec -
安装防火墙拦截器:
sudo apt install crowdsec-firewall-bouncer-iptables这会将 Crowdsec 直接连接到 UFW/IPtables,以丢弃数据包。
-
接入 Traefik 日志(至关重要): Crowdsec 需要查看 Traefik 的日志才能阻止 Web 攻击。
- 安装集合:
sudo cscli collections install crowdsecurity/traefik # 推荐额外项(2025 年最佳实践): sudo cscli collections install crowdsecurity/whitelist-good-actors crowdsecurity/http-cve - 配置采集: 将以下内容添加到
/etc/crowdsec/acquis.yaml:filenames: - /home/ubuntu/app-data/traefik/logs/access.log labels: type: traefik - 重启:
sudo systemctl restart crowdsec
- 安装集合:
-
设置通知(可选,但推荐): IP 被封禁时,通过 Discord 接收提醒。
- 创建配置:
sudo nano /etc/crowdsec/notifications/discord.yamltype: http name: discord_default log_level: info url: YOUR_WEBHOOK_URL method: POST headers: Content-Type: application/json format: | { "username": "CrowdSec-VPS", "content": "🚨 **CrowdSec Alert**\n{{range . -}}\nIP: **{{.Source.IP}}** ({{.Source.Cn}})\nReason: *{{.Scenario}}*\n{{end}}" } - 在配置文件中启用: 编辑
/etc/crowdsec/profiles.yaml,并在notifications:下添加discord_default。 - 重启:
sudo systemctl restart crowdsec
- 创建配置:
方法 B:Docker 安装(替代方案) 如果需要完全隔离容器,请使用此方法。
- 部署 Crowdsec:
-> 从 references/docker-compose-templates.md 复制配置
部署在
~/app-data/crowdsec。
阶段 6:维护与验证
目标: 确保弹性和可恢复性。
策略:混合架构(推荐) 关键基础设施(安全、备份、VPN)在主机上运行以确保可靠性。应用在 Docker 中运行。
-
漏洞扫描(Trivy):
trivy fs / -
备份(Duplicati): 方法 A:主机安装(稳健) 最适合灾难恢复(即使 Docker 停机,也能恢复 Docker 配置)。
- 将 Duplicati 安装为服务。
- 至关重要: 将其配置为仅监听 localhost 或 Tailscale IP,以保持隐藏。
--webservice-interface=100.x.y.z
方法 B:Docker 安装 -> 从 references/docker-compose-templates.md 复制配置 编辑文件,将
127.0.0.1替换为你的 Tailscale IP。 部署在~/app-data/duplicati。 -
最终检查: -> 运行
scripts/verify_setup.sh