VPSKnow

购机后必做清单:新机安全初始化 10 步全攻略

初级
20分钟

很多人买到 VPS 第一件事就是装软件、建网站——这是最危险的做法。一台未加固的新机器平均在上线后 15 分钟内就会迎来第一批自动化扫描机器人。本清单按优先级给出 10 个必做步骤,每步附带可直接复制的命令,30 分钟内完成所有加固。

📋 10 步清单总览

01 IP 健康体检 首要
02 更新系统软件包 基础
03 修改 SSH 默认端口 安全
04 配置 SSH 密钥登录 安全
05 禁用密码登录 安全
06 配置 UFW 防火墙 安全
07 安装 Fail2ban 安全
08 校准时区与时间同步 运维
09 配置 Swap 虚拟内存 稳定性
10 开启安全自动更新 维护

⏱ 预计完成时间:约 30 分钟 | 难度:初级 | 适用系统:Debian 12 / Ubuntu 22.04+

⚠️ 为什么新机到手别急着用?

🤖

自动化扫描无处不在

全球每天有数以亿计的机器人在持续扫描所有公网 IP 的 22 端口。新机上线后几分钟内就会收到暴力破解尝试,默认 root + 密码登录是最大漏洞。

🕳️

默认配置漏洞多

系统默认开放所有入站端口,任何人都能尝试连接任意服务。未打补丁的系统可能存在已知 CVE 漏洞,被利用只是时间问题。

💸

被入侵代价极高

服务器被黑后常见结果:被用于挖矿耗尽资源、发送垃圾邮件导致 IP 被拉黑、数据被加密勒索。重装系统恢复数据的代价远大于 30 分钟的加固时间。

操作前提:确保已能通过 SSH 成功登录服务器(参见 SSH 连接指南),并且已完成 新机 IP 体检。以下所有命令均在服务器端执行,以 root 身份登录操作。

🩺 第 1 步:IP 健康体检

🚨

必须第一步做!大多数商家提供 24-72 小时内免费更换问题 IP 的机会,错过窗口期后换 IP 需要额外付费($2-5)。先检查 IP 再做其他配置,避免白费功夫。

1
全球多点 Ping 测试

访问 itdog.cnping.pe,输入您的服务器 IP。中国大陆节点全红(丢包 100%)= IP 被墙,需立即联系商家换 IP。

2
IP 纯净度检测

访问 scamalytics.com,风险评分应低于 20 分。高分意味着 IP 曾被用于垃圾邮件或攻击,发邮件会被拒收,部分 API 服务也会拒绝访问。

3
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+OEnterCtrl+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 MB1 GB轻量建站、爬虫
1 GB1-2 GBWordPress、小型 API
2-4 GB2 GBDocker、数据库
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 端口: ss 输出中 sshd 监听端口应为您设置的新端口,而非 22
UFW 防火墙: ufw status 显示 "Status: active",规则列表中有您的 SSH 端口
Fail2ban: systemctl status 显示 "active (running)"
Swap: free -h 中 Swap 行显示非零数值(如 1.0G / 1.0G)
时区: timedatectl 显示 "Time zone: Asia/Shanghai" 或您设置的时区
密钥登录: 新开终端用密钥(不输密码)可以成功登录

常见问题解答

修改 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 原则(本地 + 异地 + 云存储),参见数据备份实战指南