很多人买到 VPS 第一件事就是装软件、建网站——这是最危险的做法。一台未加固的新机器平均在上线后 15 分钟内就会迎来第一批自动化扫描机器人。本清单按优先级给出 10 个必做步骤,每步附带可直接复制的命令,30 分钟内完成所有加固。
📋 10 步清单总览
⏱ 预计完成时间:约 30 分钟 | 难度:初级 | 适用系统:Debian 12 / Ubuntu 22.04+
⚠️ 为什么新机到手别急着用?
自动化扫描无处不在
全球每天有数以亿计的机器人在持续扫描所有公网 IP 的 22 端口。新机上线后几分钟内就会收到暴力破解尝试,默认 root + 密码登录是最大漏洞。
默认配置漏洞多
系统默认开放所有入站端口,任何人都能尝试连接任意服务。未打补丁的系统可能存在已知 CVE 漏洞,被利用只是时间问题。
被入侵代价极高
服务器被黑后常见结果:被用于挖矿耗尽资源、发送垃圾邮件导致 IP 被拉黑、数据被加密勒索。重装系统恢复数据的代价远大于 30 分钟的加固时间。
🩺 第 1 步:IP 健康体检
必须第一步做!大多数商家提供 24-72 小时内免费更换问题 IP 的机会,错过窗口期后换 IP 需要额外付费($2-5)。先检查 IP 再做其他配置,避免白费功夫。
IP 纯净度检测
访问 scamalytics.com,风险评分应低于 20 分。高分意味着 IP 曾被用于垃圾邮件或攻击,发邮件会被拒收,部分 API 服务也会拒绝访问。
TCP 端口连通性(可选)
访问 port.ping.pe,输入 IP:22。国内节点不通但国外通,说明 22 端口对中国方向有封锁,SSH 连接会很慢或不稳定。
体检通过标准:大陆节点可以 Ping 通(允许少量丢包)、纯净度评分 < 20、SSH 可正常连接。满足以上条件即可继续后续步骤。 更多IP检测工具(参见 IP工具箱)
📦 第 2 步:更新系统软件包
系统出厂镜像往往不是最新版本,可能存在已知安全漏洞。第一件事是把所有软件包更新到最新。
apt update && apt upgrade -y && apt autoremove -y
⏱ 视软件包数量需 1-5 分钟。执行期间不要关闭终端。
apt update 刷新软件源索引
apt upgrade -y 升级所有已安装包
apt autoremove -y 清理不再需要的旧包
🔌 第 3 步:修改 SSH 默认端口
默认 22 端口每天被数以万计的自动化脚本扫描。改成高位随机端口(建议 10000-65535),可以立即消除 99% 的暴力破解尝试,日志会瞬间变得清净。
1 打开 SSH 配置文件
nano /etc/ssh/sshd_config
2 找到并修改端口号
用 Ctrl+W 搜索 #Port 22,将其修改为(去掉 # 号并改为您选择的端口):
# 将下面的数字替换为您选择的端口,如 39521 Port 39521
保存退出:Ctrl+O → Enter → Ctrl+X
3 重启 SSH 服务
systemctl restart sshd
⚠️ 关键安全提示
重启 SSH 后,不要关闭当前连接!新开一个终端窗口,用新端口测试登录:ssh -p 39521 root@YOUR_IP。确认新端口可以登录后,再关闭旧连接。如果锁住了自己,请使用商家控制台的 VNC 功能修复。
🔑 第 4 步:配置 SSH 密钥登录
密钥登录比密码登录安全数个数量级。Ed25519 密钥几乎不可能被暴力破解,同时还能免密登录,体验更好。
本地 在本地电脑生成密钥对
在本地终端(不是服务器)执行:
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车使用默认路径。生成的两个文件:私钥 ~/.ssh/id_ed25519(保密!)和公钥 ~/.ssh/id_ed25519.pub(可公开)。
本地 上传公钥到服务器(方法一:ssh-copy-id,推荐)
将 NEW_PORT 替换为您在第 3 步设置的端口:
ssh-copy-id -p NEW_PORT root@YOUR_SERVER_IP
或 手动上传(方法二:适用于 Windows 或 ssh-copy-id 不可用时)
在服务器端执行(将公钥内容粘贴替换 YOUR_PUBLIC_KEY):
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
🚫 第 5 步:禁用密码登录
前提:必须先完成第 4 步并确认密钥登录可以正常使用,再执行此步骤。否则会将自己锁在门外!
密钥配置好后,关闭密码登录,让所有暴力破解尝试彻底失效。
编辑 sshd_config,修改以下三项
# 禁用密码登录 PasswordAuthentication no # 启用密钥登录 PubkeyAuthentication yes # 禁止空密码 PermitEmptyPasswords no
保存后重启 SSH 服务
systemctl restart sshd
🧱 第 6 步:配置 UFW 防火墙
UFW(Uncomplicated Firewall)是 iptables 的简化前端,新手友好。默认策略:拒绝所有入站,只放行必要端口。
安装并配置 UFW
将 NEW_SSH_PORT 替换为您在第 3 步设定的端口号:
ufw default deny incoming ufw default allow outgoing ufw allow NEW_SSH_PORT/tcp # 改成你的 SSH 端口 ufw allow 80/tcp ufw allow 443/tcp ufw enable
验证防火墙状态
ufw status verbose
常用 UFW 管理命令
ufw allow 8080/tcp放行 8080 端口
ufw deny 3306/tcp封锁 MySQL 端口
ufw delete allow 8080删除已有规则
ufw allow from 1.2.3.4只允许指定 IP
ufw disable临时关闭防火墙(救急用)
ufw reset清空所有规则重来
🚨 第 7 步:安装 Fail2ban
Fail2ban 监控日志文件,自动将多次登录失败的 IP 加入 iptables 封禁列表,是防暴力破解的最后一道防线。即使已禁用密码登录,也建议安装——它能防护 SSH 以外的其他服务(如 Nginx、邮件服务)。
安装 Fail2ban
apt install fail2ban -y
创建自定义配置文件(替换 NEW_SSH_PORT)
cat > /etc/fail2ban/jail.local << 'EOF' [DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 [sshd] enabled = true port = NEW_SSH_PORT EOF
bantime = 3600
封禁 1 小时
findtime = 600
10 分钟内
maxretry = 5
失败 5 次触发
启动并设置开机自启
systemctl enable fail2ban && systemctl start fail2ban
查看封禁状态
fail2ban-client status sshd
🕐 第 8 步:校准时区与时间同步
VPS 默认时区通常是 UTC,与国内时间相差 8 小时。时区错误会导致日志时间戳混乱、定时任务执行时间偏移、HTTPS 证书校验问题。
timedatectl set-timezone Asia/Shanghai timedatectl status
常用时区列表
Asia/Shanghai中国标准时间 UTC+8
Asia/Tokyo日本 UTC+9
America/Los_Angeles美西 UTC-8
Europe/Berlin德国 UTC+1
💡 现代系统(Debian/Ubuntu)已默认启用 systemd-timesyncd 自动同步 NTP 时间,一般无需额外配置。
💿 第 9 步:配置 Swap 虚拟内存
Swap 是用磁盘空间模拟内存。当物理内存不足时,系统将部分内存数据转移到 Swap,防止 OOM(Out of Memory)直接杀死进程导致服务崩溃。1 GB 内存的 VPS 强烈建议配置 1-2 GB Swap。
fallocate -l 1G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab sysctl vm.swappiness=10 echo 'vm.swappiness=10' >> /etc/sysctl.conf
最后一行 vm.swappiness=10 表示系统只在物理内存剩余 10% 时才开始使用 Swap,避免过早降速。
验证 Swap 已生效:
free -h
Swap 大小参考建议
| 物理内存 | 推荐 Swap | 适用场景 |
|---|---|---|
| 512 MB | 1 GB | 轻量建站、爬虫 |
| 1 GB | 1-2 GB | WordPress、小型 API |
| 2-4 GB | 2 GB | Docker、数据库 |
| 8 GB+ | 可选/不需要 | 高内存机器通常不需要 |
🔄 第 10 步:开启安全自动更新
unattended-upgrades 会自动安装系统安全补丁,无需手动干预。只更新安全包,不会自动升级大版本,稳定可靠。
apt install unattended-upgrades -y dpkg-reconfigure --priority=low unattended-upgrades
执行第二条命令时会弹出交互界面,选择 "Yes" 启用自动更新即可。
到这里,10 步安全加固已全部完成!您的服务器现在已具备:随机 SSH 端口、密钥登录、密码登录禁用、防火墙隔离、自动封禁暴力破解、时间校准、防 OOM 崩溃的 Swap,以及自动安全补丁。
🔍 验收:一键检查所有配置
运行以下脚本,一次性验证所有关键配置是否已生效:
echo "=== SSH Port ===" && ss -tlnp | grep sshd echo "=== UFW Status ===" && ufw status echo "=== Fail2ban ===" && systemctl status fail2ban --no-pager -l | head -5 echo "=== Swap ===" && free -h | grep Swap echo "=== Timezone ===" && timedatectl | grep "Time zone" echo "=== Last Login ===" && last -n 5
✅ 验收标准对照
❓ 常见问题解答
修改 SSH 端口后把自己锁在门外了,怎么办?
不要慌,有救命通道:登录 VPS 商家控制面板(WHMCS/SolusVM/KiwiVM),找到 VNC / Console / KVM 功能,点击打开控制台。这是一个不依赖 SSH 的带外访问方式,就像坐在机器前直接操作。进入后编辑 /etc/ssh/sshd_config 把端口改回正确值,或者运行 ufw disable 临时关闭防火墙,再重启 sshd。操作完毕后关闭控制台,重新用正确端口 SSH 登录。事后必须仔细核查配置,确认防火墙规则放行了新 SSH 端口。
UFW 和 iptables 有什么关系?为什么不直接用 iptables?
UFW 是 iptables 的简化封装层,底层规则仍由 iptables 执行。iptables 功能极强但语法繁琐(例如 iptables -A INPUT -p tcp --dport 22 -j ACCEPT),容易出错且规则不持久化(重启后失效)。UFW 用更简洁的命令(ufw allow 22)实现同等效果,并自动持久化配置。对于个人 VPS 和中小型服务器,UFW 完全够用。需要更复杂策略(如端口敲门、连接速率限制)时再考虑直接用 iptables 或 nftables。
Fail2ban 误封了我自己的 IP,如何解封?
如果您无法 SSH 登录,先通过商家 VNC 控制台连接服务器,然后执行解封命令:fail2ban-client set sshd unbanip 你的IP。为了避免未来误封自己,可以在 /etc/fail2ban/jail.local 中添加白名单:ignoreip = 127.0.0.1/8 你的家庭IP。家庭 IP 通常是动态的,如果经常变动,可以在白名单中填写您所在城市的 IP 段(CIDR 格式),或干脆提高 maxretry 阈值(如改为 10 次)来降低误封概率。
Swap 配置在 NVMe SSD 上会损害硬盘吗?
在 VPS 上这个担心基本不成立,原因有三:① VPS 的 NVMe 是虚拟化的,底层物理磁盘由多个 VPS 共享,您的写入操作只是虚拟层的一小部分;② swappiness=10 意味着系统极少主动使用 Swap,只在内存极度不足时才会用到,日常写入量极少;③ 现代企业级 NVMe 寿命通常有数百 TBW(TeraByte Written),日常 Swap 使用几乎不影响寿命。更大的风险是没有 Swap 时内存耗尽导致服务崩溃。建议保留 Swap 配置,不必担心磁盘损耗。
这 10 步都完成了,VPS 就安全了吗?还有什么需要注意?
完成这 10 步已经覆盖了 90% 的常见攻击面,但安全是持续的过程,还需注意:① 数据备份:定期将重要数据备份到异地(参见数据备份指南),这是应对硬件故障、误删、勒索软件的最后保障;② 最小权限原则:只安装必要软件,关闭不需要的服务;③ 应用层安全:Web 应用(如 WordPress)的漏洞是入侵的主要来源,定期更新插件和主题;④ 监控报警:部署 Uptime Kuma 等监控工具,服务器异常时第一时间收到通知;⑤ 定期检查登录日志:last -n 20 查看最近登录记录,发现异常登录立即处理。
OpenVZ/LXC 架构的 VPS 能完成这 10 步吗?
大部分步骤可以完成,但有以下限制:① Swap:OpenVZ 默认不支持用户自建 Swap(需商家在宿主机层开启),第 9 步可能失败;② UFW/iptables:部分 OpenVZ 环境的 iptables 内核模块被禁用,防火墙规则可能无法生效;③ 时区设置:部分 OpenVZ 容器时区与宿主机共享,timedatectl 修改可能不生效,需要用 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 替代;④ Fail2ban:通常可以正常使用。遇到上述限制时,建议联系商家寻求支持,或升级为 KVM 架构的 VPS。
重装系统后,这些配置还在吗?需要重新做一遍吗?
重装系统会清空所有数据和配置,一切从零开始,需要重新执行这 10 步。这正是建议养成以下习惯的原因:① 用一个初始化脚本把常用配置固化(可以把本文所有命令整理成一个 shell 脚本,以后一键执行);② 重装前备份好 /etc/ssh/sshd_config、/etc/fail2ban/jail.local 等配置文件;③ 使用快照功能:初始化完成后立即给服务器拍一张快照,以后重置可以从快照恢复,省去重新配置的时间。
如何把这 10 步写成一键初始化脚本?
可以将本文中的命令整合为一个 bash 脚本(.sh 文件),在脚本顶部定义变量(SSH 端口、时区等),然后依次执行各步骤命令。注意以下事项:① 密钥的生成和上传步骤必须在本地执行,不能放在远程脚本里;② 修改 SSH 端口后 systemctl restart sshd 的那一刻当前会话不会断开,但新连接需要用新端口,脚本中需要加入等待和验证逻辑;③ 建议脚本在交互模式运行,关键步骤前提示用户确认,避免自动化执行出错无法回滚。我们的自动化运维脚本指南中有详细的 Shell 脚本编写教程。
安装 Docker 需要额外开放哪些防火墙端口?
这是一个重要的坑:Docker 会直接操作 iptables 绕过 UFW,将容器映射的端口直接暴露到公网,即使 UFW 中没有放行规则也一样!例如 docker run -p 3306:3306 mysql 会直接让 3306 端口对外可达。解决方案有两种:① 只绑定本地:将端口绑定为 -p 127.0.0.1:3306:3306,只允许本机访问;② 修改 Docker 配置:在 /etc/docker/daemon.json 中设置 "iptables": false 禁用 Docker 直接操作 iptables,然后手动通过 UFW 管理端口。第一种方案更简单,推荐新手使用。
完成初始化后,后续日常运维还需要做什么?
初始化是一次性工作,日常运维建议养成以下习惯:① 每月检查一次:df -h 磁盘使用率(超 80% 要清理)、free -h 内存占用、fail2ban-client status sshd 查看封禁记录;② 定期手动更新:即使开了自动安全更新,每 1-2 个月手动 apt update && apt upgrade 一次;③ 查看登录日志:last -n 20 确认没有异常登录;④ 续费提醒:到期前一周续费,避免数据丢失;⑤ 定期备份:重要数据遵循 3-2-1 原则(本地 + 异地 + 云存储),参见数据备份实战指南。