很多人买到 VPS 第一件事就是装软件、建网站,却忽略公网服务从上线起就可能被自动扫描。本清单按风险顺序给出 10 个初始化步骤,每步附带可执行命令;实际完成时间取决于系统更新、控制台能力和验证过程,不要为了赶时间跳过新会话测试与回退确认。
📋 10 步清单总览
⏱ 预计完成时间:约 30 分钟 | 难度:初级 | 适用系统:当前受支持的 Debian / Ubuntu LTS
⚠️ 为什么新机到手别急着用?
自动化扫描无处不在
公网 SSH 和其他常见服务会持续面对自动扫描。真正需要降低的是弱密码、长期开放的高权限登录和未修补服务带来的风险,而不只是隐藏端口。
默认配置漏洞多
不同镜像、云防火墙和商家安全组的默认策略并不一致。应实际检查监听端口与入站规则,并及时修补系统和已安装服务的已知漏洞。
被入侵代价极高
服务器被黑后常见结果:被用于挖矿耗尽资源、发送垃圾邮件导致 IP 被拉黑、数据被加密勒索。重装系统恢复数据的代价远大于 30 分钟的加固时间。
🩺 第 1 步:IP 健康体检
必须第一步做!大多数商家提供 24-72 小时内免费更换问题 IP 的机会,错过窗口期后换 IP 需要额外付费($2-5)。先检查 IP 再做其他配置,避免白费功夫。
IP 纯净度检测
使用 Scamalytics、AbuseIPDB 和 Spamhaus 等不同类型的数据源交叉核对。评分口径和更新频率不同,单一高分或低分都不是最终结论;邮件、AI、流媒体或账号业务应直接测试对应目标服务。
TCP 端口连通性(可选)
访问 port.ping.pe,输入 IP:22。国内节点不通但国外通,说明 22 端口对中国方向有封锁,SSH 连接会很慢或不稳定。
体检通过标准:目标地区和运营商可通过预期协议稳定连接,路由与丢包没有持续异常,所需业务服务实际可用,且多个风险数据源没有与用途直接冲突的记录。保存测试时间和结果后再继续;更多工具参见 IP 工具箱。
📦 第 2 步:更新系统软件包
系统出厂镜像往往不是最新版本,可能存在已知安全漏洞。第一件事是把所有软件包更新到最新。
apt update && apt upgrade -y && apt autoremove -y
⏱ 视软件包数量需 1-5 分钟。执行期间不要关闭终端。
apt update 刷新软件源索引
apt upgrade -y 升级所有已安装包
apt autoremove -y 清理不再需要的旧包
🛟 第 3 步:确认控制台与回退入口
修改 SSH、认证策略或防火墙前,先确认即使 SSH 失效也能恢复访问。改端口只能减少扫描噪声,不能替代密钥登录、最小权限和系统更新,因此不再列为基础安全的前置步骤。
1 验证带外控制台
在商家控制面板中找到 Console、VNC、KVM、Serial Console 或救援模式,实际打开一次并确认能够看到系统登录界面。
2 保留当前 SSH 会话
后续每次修改认证或防火墙后,都先在新终端验证登录。新会话成功前不要退出当前会话,也不要同时修改端口、密钥和防火墙。
3 确认恢复信息
确认账号邮箱、二次验证、救援系统说明和重装影响。重要数据先做异地备份,避免把“能重装”误当成“能恢复数据”。
⚠️ 关键安全提示
控制台和救援模式也可能因商家故障而不可用。它们是配置失误时的回退入口,不是备份;业务数据仍需保存在不同故障域。
🔑 第 4 步:配置 SSH 密钥登录
密钥登录比密码登录安全数个数量级。Ed25519 密钥几乎不可能被暴力破解,同时还能免密登录,体验更好。
本地 在本地电脑生成密钥对
在本地终端(不是服务器)执行:
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车使用默认路径。生成的两个文件:私钥 ~/.ssh/id_ed25519(保密!)和公钥 ~/.ssh/id_ed25519.pub(可公开)。
本地 上传公钥到服务器(方法一:ssh-copy-id,推荐)
默认 SSH 端口为 22;如果您此前已经改过端口,再额外传入对应的 -p 参数:
ssh-copy-id 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
# 先校验语法;失败时不要重载或退出当前会话 sshd -t # Debian / Ubuntu 的服务单元通常名为 ssh systemctl reload ssh
🧱 第 6 步:配置 UFW 防火墙
UFW(Uncomplicated Firewall)是 Linux 主机防火墙的简化前端,可使用系统提供的 iptables/nftables 后端。默认策略是拒绝所有入站、只放行必要端口;Docker 发布端口属于转发流量,需另行验证。
安装并配置 UFW
先放行当前正在使用的 SSH 端口;示例按默认 22 端口编写,只开放实际需要的 Web 端口:
ufw default deny incoming ufw default allow outgoing ufw allow 22/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
创建自定义配置文件
cat > /etc/fail2ban/jail.d/sshd.local << 'EOF' [DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 [sshd] enabled = true port = ssh EOF
bantime = 3600
封禁 1 小时
findtime = 600
10 分钟内
maxretry = 5
失败 5 次触发
启动并设置开机自启
# 校验配置后再启用服务 fail2ban-client -t 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 步安全初始化已全部完成!您的服务器现在已具备:可验证的回退入口、密钥登录、密码登录禁用、防火墙隔离、自动封禁暴力破解、时间校准、缓解 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 是主机防火墙的简化前端;现代 Ubuntu 通常使用 iptables-nft 后端,因此“输入的是 iptables 命令”不代表系统仍在使用旧内核后端。UFW 用 ufw allow 22 等命令生成并持久化规则,适合常规主机入站控制。需要复杂转发、集合或容器网络策略时,应先确认实际后端,再选择 UFW、iptables 兼容命令或原生 nftables,避免多个工具同时修改同一规则集。
Fail2ban 误封了我自己的 IP,如何解封? +
如果您无法 SSH 登录,先通过商家 VNC/串口控制台连接服务器,然后执行:fail2ban-client set sshd unbanip 你的IP。固定管理 IP 可在 /etc/fail2ban/jail.d/sshd.local 中加入精确白名单;不要为了方便白名单整个城市或运营商网段。动态家庭 IP 更适合通过可信 VPN 管理,或适当提高 maxretry 并保留带外控制台。
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。
重装系统后,这些配置还在吗?需要重新做一遍吗? +
重装系统通常会清空系统盘上的数据和配置,需要重新执行这些步骤。建议:① 将可重复配置写成可审阅、可分步执行的初始化脚本;② 异地备份 SSH 配置、/etc/fail2ban/jail.d/ 局部配置及业务数据;③ 快照只能作为短期回退点,仍需独立备份并定期验证恢复。重装范围和附加数据盘是否保留必须以商家提示为准。
如何把这 10 步写成一键初始化脚本? +
可以将本文中的命令整合为一个 bash 脚本(.sh 文件),在脚本顶部定义变量(SSH 端口、时区等),然后依次执行各步骤命令。注意以下事项:① 密钥的生成和上传步骤必须在本地执行,不能放在远程脚本里;② 修改 SSH 配置后应先运行 sshd -t,再平滑重载 SSH 服务;脚本不能替代新终端登录验证,应暂停并要求用户确认新连接可用;③ 建议脚本在交互模式运行,关键步骤前提示用户确认,避免自动化执行出错无法回滚。我们的自动化运维脚本指南中有详细的 Shell 脚本编写教程。
安装 Docker 需要额外开放哪些防火墙端口? +
安装 Docker 本身不要求额外开放端口;是否暴露取决于每个容器的发布配置。-p 3306:3306 默认绑定所有接口,可能绕过 UFW 常规 INPUT 规则直接对外可达。敏感服务优先使用 -p 127.0.0.1:3306:3306,并通过 docker ps、ss -lntup 和外部扫描验证。不要设置 "iptables": false:Docker 官方不建议这样做,它可能破坏容器网络;复杂限制应按 Docker 实际防火墙后端配置转发规则。
完成初始化后,后续日常运维还需要做什么? +
初始化是一次性工作,日常运维建议养成以下习惯:① 每月检查一次:df -h 磁盘使用率(超 80% 要清理)、free -h 内存占用、fail2ban-client status sshd 查看封禁记录;② 定期手动更新:即使开了自动安全更新,每 1-2 个月手动 apt update && apt upgrade 一次;③ 查看登录日志:last -n 20 确认没有异常登录;④ 续费提醒:到期前一周续费,避免数据丢失;⑤ 定期备份:重要数据遵循 3-2-1 原则(本地 + 异地 + 云存储),参见数据备份实战指南。