VPS 开通那一刻起,自动化扫描器就开始光探测——几分钟之内就有人来猜 root 密码、扫常见端口。「新机即裸奔」是最容易翻车的状态。这套清单覆盖自动化脚本重点光顾的入口(SSH、防火墙、补丁、登录风控),半小时内能把九成自动攻击挡在门外。
第一步:把系统补丁打齐
镜像可能是几周前做的,漏洞数据库每天在涨,先 patch 再做后面所有事:
sudo apt update && sudo apt upgrade -y(Debian/Ubuntu)
sudo dnf update -y(AlmaLinux/Rocky)
如果内核有更新,会需要 reboot,提前在控制台留个备用连接防掉线。
第二步:禁用 root 登录,用 SSH 密钥
root + 密码是最容易被光顾的组合。建一个非 root 管理员账号,全部日常操作用它:
adduser opsadmin && usermod -aG sudo opsadmin
本地生成密钥对(不是服务器上),把公钥推到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub opsadmin@your.server.ip
然后改 /etc/ssh/sshd_config,把三个关键配置改成:
| 配置项 | 推荐值 |
|---|---|
| PermitRootLogin | no |
| PasswordAuthentication | no |
| Port | 改成非默认(如 2222) |
| PermitEmptyPasswords | no |
重启 SSH 服务前,保留当前会话——验证新窗口能连进去再退旧会话:
sudo systemctl restart sshd
第三步:装 Fail2ban 自动封禁
即使禁用密码登录,还是会有人扫 SSH 端口看哪些服务还在跑。Fail2ban 看 auth.log 里连续失败 N 次的 IP,自动调用 iptables 封禁一段时间:
sudo apt install fail2ban -y
新建 /etc/fail2ban/jail.local 覆盖默认配置:
[DEFAULT] bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = true port = 2222 logpath = %(sshd_log)s
启用并开机自启:sudo systemctl enable --now fail2ban。半小时后用 sudo fail2ban-client status sshd 就能看到被封的 IP 列表。
第四步:开 UFW 防火墙,只暴露必要端口
默认全禁、按需开白名单,是最直接的攻击面收缩:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable
MySQL / Redis / MongoDB / Elasticsearch 这些数据库端口永远不应该对外开——绑 127.0.0.1 即可。
第五步:开自动安全更新
手动更新一定会忘,自动安全更新把高危补丁应用上:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
需要的话再配 /etc/apt/apt.conf.d/50unattended-upgrades,把 -security 源留启用、-updates 源按需。
第六步:装入侵检测(可选但推荐)
AIDE、rkhunter、ClamAV 三个常见组合:
- AIDE:文件完整性监控,敏感目录一旦被改会报警
- rkhunter:扫 rootkit,特征库日更
- ClamAV:通用杀毒,扫 web 上传的 webshell 很有用
每日凌晨跑一次 cron,结果发到邮箱:
0 3 * * * /usr/bin/aide --check | mail -s 'AIDE Report' opsadmin@yourdomain.com
第七步:备份策略
被攻破后还能快速恢复,关键靠备份。规则:
- 每日全量 + 每周全量
- 至少一份异地(对象存储 OSS / S3 / Backblaze B2)
- 每月抽一次做恢复演练,不演练的备份等于没备份
自动备份脚本可以用 restic + rclone,或者直接用主机商自带的快照功能(Contabo / Hetzner / DigitalOcean 都支持)。
第八步:日志监控
重点看三个文件:
/var/log/auth.log(登录失败、sudo 使用)
/var/log/syslog(系统消息)
/var/log/nginx/(Web 访问与错误)
简易方案用 Logwatch 每日汇总发邮件,进阶方案接 ELK / Loki / Grafana。
检查清单
| 任务 | 完成 | 优先级 | 预计耗时 |
|---|---|---|---|
| 系统补丁更新 | ☐ | 关键 | 2min |
| 建非 root 管理员 | ☐ | 关键 | 2min |
| SSH 密钥 + 禁密码 | ☐ | 关键 | 5min |
| 禁用 root 登录 | ☐ | 关键 | 2min |
| UFW 防火墙 | ☐ | 关键 | 3min |
| Fail2ban | ☐ | 关键 | 3min |
| 自动安全更新 | ☐ | 重要 | 2min |
| 入侵检测 | ☐ | 重要 | 10min |
| 备份策略 | ☐ | 重要 | 15min |
| 日志监控 | ☐ | 加分 | 10min |
常见问题
Q:都做了这些还需要云厂商的硬件防火墙吗?
A:需要。硬件防火墙在 OS 之前就过滤了大部分网络层垃圾,自己装的 UFW 是 OS 层。两层结合效果最好——Contabo / Hetzner / DigitalOcean 都在控制面板免费提供基础网络层防火墙。
Q:禁用了密码登录,万一密钥丢了怎么办?
A:在主机控制台用 VNC / 串行控制台连上去,恢复密码登录临时登录。或者一开始就做两套密钥,两个不同设备各存一份,再加一份加密 U 盘异地备份。
Q:SSH 改了端口真的有用吗?
A:有用但有限。自动化扫描器会扫全端口,改了非默认端口能让 90% 的低水平扫描脚本直接跳过。但对有针对性的攻击没用——他们会做端口扫描。所以这是「减少噪音」的一招,不是核心防线。
按这个清单做完,VPS 已经能挡住绝大多数自动攻击了。剩下的定期看日志 + 每周 apt list –upgradable 检查一次就行了。如果被某条记录卡住或者哪个工具装不上,贴到 fenij.com 留言我帮你接着看。
第一步就建议改强密码,可用随机密码生成器快速生成。