VPS 开箱加固与网络调优保姆级教程(小白友好·零翻车版)
适合谁:刚买了一台 Linux 云服务器(VPS),只会复制粘贴命令,不懂底层原理也希望能把机器配置得既安全、又顺畅的人。
支持系统:原生 Debian 11/12/13、Ubuntu 20.04/22.04/24.04 LTS(腾讯云、阿里云、AWS、甲骨文、搬瓦工、轻量云等主流 VPS 通用)。
耗时预期:约 30 ~ 45 分钟(大部分时间在等系统下载打补丁,期间可以喝杯水)。
做完你将得到:一台密码撞不进、扫描器找不到门、弱网访问更丝滑、突发高负载不宕机、重要安全漏洞自动修补的可靠服务器。
⚠️ 全程唯一铁律(先牢记): 在第 9 步新窗口测试连接成功之前,绝对不要关闭你打开的第一个服务器黑框窗口! 它是你的物理安全绳。任何时候只要出问题,这个窗口都能保你随时回退。
🧭 核心概念:搞懂两个“窗口”(90% 新手迷路的地方)
本教程会在两台电脑上操作,每条命令开头都会用醒目标签注明该在哪里粘贴,千万别敲错位置:
| 标记图标 | 代表含义 | 怎么打开 | 作用与职责 |
|---|---|---|---|
| 🖥️ 【服务器窗口】 | 远程连接在你云服务器上的黑色控制台 | 见【第 1 步】 | 负责给远端系统装工具、改配置,全程保持开启 |
| 💻 【你自己的电脑】 | 你自己本地电脑的命令行终端 | Windows 打开 PowerShell;Mac 打开 终端 (Terminal) |
负责在本地生成登录钥匙、发起测试连接,随时可开关 |
📋 开始前的准备清单(缺一项都别往下走)
- [ ] 服务器公网 IP:在云厂商控制台的“实例详情”里复制(例如
123.45.67.89); - [ ] 初始 root 密码:购买后厂商发邮件给你的初始密码,或者在控制台点“重置密码”设好的密码;
- [ ] 给服务器拍个“快照”:
- 🗣️ 大白话:快照就是游戏的「手动存档」。改系统前拍一张,后面万一把网络配崩了,在控制台点一下就能穿越回现在,新手不拍快照改配置等于裸奔!
- 怎么做:云控制台找到你的服务器 → 找到「快照 / 备份」标签 → 点击「创建快照 / 立即备份」 → 看到状态变成“成功”或“100%”再继续。
- [ ] 想好一个新门牌号(自定义端口):
- 默认的 SSH 登录端口是
22,全世界的黑客扫描器 24 小时在扫它。我们要把它换成一个高位数字(范围在1024 ~ 65535之间,建议选个 5 位数,比如28822或35222); - 请把你想好的端口号记在便签纸上,后面会反复用到好几次。本教程演示用
28822,你可以随意换。
第 1 步:第一次连上服务器
💻 【你自己的电脑】 打开本地 PowerShell(Windows)或终端(Mac),输入以下命令并回车(把 123.45.67.89 换成你的服务器真实 IP):
- 第一次连的提示:终端会弹出一行问你
Are you sure you want to continue connecting (yes/no/[fingerprint])?👉 敲键盘输入yes并回车; - 输密码的提示:接着出现
root@... password:👉 粘贴或输入你的初始 root 密码,然后直接回车; - ⚠️ 高频心理障碍预警:在 Linux 终端输密码时,屏幕上不会有任何星号、圆点或光标移动! 屏幕看上去像没反应一样,这不是键盘失灵,只管稳稳敲完密码按回车即可。
- ✅ 成功标志:终端屏幕出现
root@xxx:~#样式的绿色或白色命令提示符。
💡 从这一秒开始,这个黑色终端窗口就是 🖥️【服务器窗口】。把它放在屏幕左边,后续所有带该标记的命令全部粘进这里。
第 2 步:时区对齐、NTP 对时与基础环境打补丁
时区错乱或时钟漂移会导致后续申请 SSL 证书失败、双因子验证码失效。这一步把时钟校准到北京时间,并让官方自动补丁接管系统维护。
🖥️ 【服务器窗口】 复制下面整段命令,粘贴并回车:
# 1. 切换时区至北京时间 (CST, UTC+8)
timedatectl set-timezone Asia/Shanghai
# 2. 显式开启网络时间协议 (NTP) 自动对齐物理时钟
timedatectl set-ntp true
# 3. 刷新软件仓库并升级系统现有组件
export DEBIAN_FRONTEND=noninteractive
apt update && apt upgrade -y
- 🗣️ 说明:升级过程屏幕会飞速刷字,这是正常下载安装,别慌,喝口水等它跑完;若中间偶尔弹出蓝色弹窗询问,直接按回车选默认项即可。
紧接着,在 🖥️ 【服务器窗口】 继续安装后续必备的原生小工具,并开启系统漏洞自动修补:
# 安装基础排障与安全工具
apt install -y curl wget git vim htop ufw fail2ban ca-certificates dnsutils procps lsof unattended-upgrades
# 开启安全更新无人值守自动安装(遇到系统漏洞,官方静默修复)
dpkg-reconfigure -f noninteractive unattended-upgrades
最后检查本次更新是否替换了系统底层内核:
cat /var/run/reboot-required 2>/dev/null || echo "不需要重启"
- ✅ 成功标志:最后一条命令输出显示
不需要重启。 (如果输出了提示需要重启的内容,直接输入reboot回车。等 1 分钟后重新用第 1 步的命令登入,然后继续往下走第 3 步)。
第 3 步:给服务器加一个“内存急救包”(Swap 交换分区)
🗣️ 大白话:很多便宜的小 VPS 内存只有 1G 或 2G。在构建应用、编译代码或突发流量时,内存瞬间用完,系统会直接无脑触发 OOM 强行杀掉进程甚至死机。Swap 就是用硬盘划出一小块空间垫底——内存告急时临时缓冲一下,保住机器不死机。
🖥️ 【服务器窗口】 粘贴执行以下整段代码(默认创建 2GB 弹性空间):
SWAP_SIZE_GB="2"
# 1. 安全创建并挂载 2GB Swap 文件(带自动降级容错机制)
if [ "$(free -m | awk '/^Swap:/ {print $2}')" -eq 0 ]; then
echo "[+] 正在初始化 Swap 空间..."
# 优先快速分配,若文件系统限制则自动降级为连续块写入
SWAP_OK=0
if fallocate -l ${SWAP_SIZE_GB}G /swapfile 2>/dev/null; then
chmod 600 /swapfile
mkswap /swapfile >/dev/null 2>&1
swapon /swapfile 2>/dev/null && SWAP_OK=1 || { swapoff /swapfile 2>/dev/null || true; rm -f /swapfile; }
fi
if [ "${SWAP_OK}" -eq 0 ]; then
dd if=/dev/zero of=/swapfile bs=1M count=$((SWAP_SIZE_GB * 1024)) status=progress
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
fi
# 2. 开机自动挂载配置(幂等写入)
grep -q '/swapfile none swap' /etc/fstab || echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 3. 内存回收倾向调优:告诉系统平时多用物理内存,内存紧缺时优先回收缓存,不要乱磨损硬盘
cat << 'EOF' > /etc/sysctl.d/90-swap-tuning.conf
vm.swappiness = 10
vm.vfs_cache_pressure = 50
EOF
sysctl -p /etc/sysctl.d/90-swap-tuning.conf
echo "[✓] Swap 内存急救包已就位!"
else
echo "[i] 系统已存在 Swap,跳过创建。"
fi
检查是否生效:
free -h
- ✅ 成功标志:输出结果中的
Swap:那一行,显示大小约为2.0Gi。
第 4 步:开启 Google BBR 网络拥塞算法与管道扩容
🗣️ 大白话:原生 Linux 的网络算法偏向保守,一旦跨国线路出现轻微丢包,它就会把传输速度主动削减 30%,导致连线像便秘一样慢。BBR 是 Google 开发的动态算法,它能看清网络的真实承载能力,搭配扩容后的 TCP 缓冲区,能极大改善跨国高延迟下的下行带宽。
🖥️ 【服务器窗口】 粘贴执行整段配置:
cat << 'EOF' > /etc/sysctl.d/99-network-tuning.conf
# 开启 FQ 队列管理与 BBR 拥塞控制算法
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 提升系统最大连接与文件句柄
fs.file-max = 1048576
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 16384
# 扩充 TCP 读写缓冲区至 16MB(彻底释放跨海大带宽)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 快速释放与重用 TIME_WAIT 套接字
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
EOF
# 立即应用新内核参数
sysctl --system
检查 BBR 是否成功开启:
sysctl net.ipv4.tcp_congestion_control
- ✅ 成功标志:输出明确返回
net.ipv4.tcp_congestion_control = bbr。
第 5 步:在你自己的本地电脑上生成“防撞库钥匙对”
🗣️ 大白话:黑客每天都在用自动化脚本扫全网服务器的弱口令。密码只要留在那里,就有被碰对的概率。我们改用现代密码学里的「Ed25519 钥匙」——私钥(真钥匙)放在你电脑里绝对不外传;公钥(锁芯)扔到服务器上。以后只有拿着你电脑里的私钥才能开门,彻底断绝碰撞爆破。
💻 【你自己的电脑】(把视线拉回你本地的 PowerShell 或 Mac 终端),运行以下命令:
ssh-keygen -t ed25519 -C "my-vps-key"
- 问保存路径(
Enter file in which to save the key...)👉 直接回车(用默认路径); - 问私钥密码(
Enter passphrase...)👉 直接回车; - 再次确认密码(
Enter same passphrase again...)👉 再次回车。
生成完毕后,查看并复制你的公钥(锁芯):
- Mac / Linux 用户执行:
bash cat ~/.ssh/id_ed25519.pub - Windows PowerShell 用户执行:
powershell cat $env:USERPROFILE\.ssh\id_ed25519.pub
屏幕上会打出一整行文本,长相类似下面这样:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGq4k7...中间一长串字符... my-vps-key
⚠️ 关键动作:用鼠标完整复制整行内容(从开头的 ssh-ed25519 一直到末尾的备注),复制好,放剪贴板备用。
第 6 步:把钥匙装到服务器 + 更改门牌号(避开所有官方暗坑)
回到远端控制台,我们将钥匙写入白名单,同时切换到你的专属高位端口。
🖥️ 【服务器窗口】 先填写你的两个核心变量(第 1 行换成你在便签上记下的新端口,第 2 行填入刚才复制的那一整行公钥):
CUSTOM_SSH_PORT="28822"
SSH_PUBLIC_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGq4k7... my-vps-key"
⚠️ 注意:公钥两端必须保留英文双引号!如果中途断网重连过,记得重新把这两行变量粘一遍。
接着,在 🖥️ 【服务器窗口】 粘贴执行以下整段配置逻辑(内含 3 个深度避坑机制):
# 1. 部署受保护的 .ssh 目录并将公钥安全写入授权表
mkdir -p ~/.ssh && chmod 700 ~/.ssh
if ! grep -qF "${SSH_PUBLIC_KEY}" ~/.ssh/authorized_keys 2>/dev/null; then
echo "${SSH_PUBLIC_KEY}" >> ~/.ssh/authorized_keys
fi
chmod 600 ~/.ssh/authorized_keys
# 2. 防坑 A:清理主配置文件里残留的默认 Port 22 指令(OpenSSH 端口具有叠加性,不删会同时监听)
sed -i -E 's/^[# ]*Port [0-9]+/Port '"${CUSTOM_SSH_PORT}"'/' /etc/ssh/sshd_config || true
# 3. 防坑 B:将新规则命名为 01-hardened.conf,利用字典序抢占“首次匹配 (first-match-wins)”,
# 彻底防止云厂商自带的 50-cloud-init.conf 强行覆盖安全策略
mkdir -p /etc/ssh/sshd_config.d/
cat << EOF > /etc/ssh/sshd_config.d/01-hardened.conf
# 监听端口
Port ${CUSTOM_SSH_PORT}
# 认证控制
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 4
# 长连接心跳保活(防止无操作被路由器 NAT 超时断流)
ClientAliveInterval 30
ClientAliveCountMax 3
X11Forwarding no
EOF
# 4. 防坑 C:Ubuntu 22.10+ / 24.04 默认使用 systemd socket 激活(ssh.socket 强占 22 端口),
# 如果只重启服务,端口根本改不动!这里显式剥离 socket 托管,切回传统的独立服务守护:
if systemctl is-active --quiet ssh.socket 2>/dev/null; then
echo "[!] 发现 Ubuntu 现代 socket 激活机制,正在切换为独立守护进程..."
systemctl disable --now ssh.socket
systemctl enable --now ssh.service
fi
# 5. 重载服务前执行语法体检,确认无拼写错误再重启,杜绝把服务配挂
if sshd -t; then
systemctl restart ssh 2>/dev/null || systemctl restart sshd
echo "[✓] SSH 守护进程已按新门牌号平稳重启!"
else
echo "[✗] 配置文件存在语法错误,已阻断重启!请检查配置!"
exit 1
fi
# 6. 现场查验新端口是否已处于监听状态
ss -tulpn | grep ":${CUSTOM_SSH_PORT}"
- ✅ 成功标志:最后一条命令的输出结果中,能看到
LISTEN以及你刚刚设置的端口号(如28822)。
⚠️ 再次敲黑板:从现在开始,左边的 🖥️【服务器窗口】绝对不许关闭!
第 7 步:去云厂商网页控制台放行新端口(大门门禁)
🗣️ 大白话:很多新手最容易栽在这里——系统里的门牌号改了,但云服务商在服务器外面还有一层“保安门卫”(安全组 / 防火墙)。你不跟保安报备你的新端口,任何连接根本到不了你的服务器。
操作流程(所有云厂商逻辑一致,以你买服务器的控制台为准):
- 登录云服务器控制台,进入你的服务器实例管理页;
- 找到导航栏的 「安全组」 或 「防火墙」 标签,点击 「添加规则 / 更改规则」;
- 点击 「添加入站规则」:
* 协议类型:选择
TCP; * 端口范围:填入你便签上的新端口(例如28822); * 授权对象 / 源 IP:填0.0.0.0/0(代表允许所有客户端连接); * 策略:选择允许 (Allow)。 - 保存规则。
- ✅ 成功标志:安全组入站规则列表中,清晰展示着你刚刚添加的端口与允许策略。
第 8 步:配置系统防火墙(UFW)与防暴力破解守护(Fail2ban)
大门保安通知到了,现在回到系统内部配置内部门禁。
⚠️ 安全警告:下面的
ufw --force reset适用于全新开箱的裸机。如果你的服务器上已经跑了网站、面板或特定业务容器,请跳过 reset 那一行,以免误删业务规则。
🖥️ 【服务器窗口】 粘贴执行以下命令:
# 1. 配置基础策略:默认拦截一切外部连接,放行全部出站
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
# 2. 核心:放行你刚才设置的自定义端口(千万不能漏,漏了就失联)
ufw allow ${CUSTOM_SSH_PORT}/tcp comment "Custom_SSH_Port"
# 3. 启用防火墙
ufw --force enable
# 4. 配置 Fail2ban(现代模式:直接对接 systemd journal 日志,兼容 Debian 12+ 无 auth.log 架构)
cat << EOF > /etc/fail2ban/jail.local
[DEFAULT]
findtime = 10m
maxretry = 5
bantime = 1d
backend = systemd
banaction = ufw
[sshd]
enabled = true
port = ${CUSTOM_SSH_PORT}
EOF
# 5. 启动防暴力破解守护
systemctl restart fail2ban
systemctl enable fail2ban
检查防火墙状态:
ufw status verbose
- ✅ 成功标志:输出显示
Status: active、Default: deny (incoming),规则列表里唯独放行了你的新端口。
💡 防手滑小提醒:Fail2ban 已经上线,凡是密码连续输错 5 次的 IP 会被拉黑整整 24 小时。等会儿测试时,如果钥匙不对千万别连续硬试,先回头看教程检查。
第 9 步:终极生死测试(新窗口免密连接验证)
千万不要关闭原先的 🖥️【服务器窗口】!
💻 【你自己的电脑】(回到你的本地电脑),打开一个全新的、独立的命令行终端窗口,运行以下命令(将端口和 IP 换成你的):
- Mac / Linux 终端执行:
bash ssh -p 28822 -i ~/.ssh/id_ed25519 [email protected] - Windows PowerShell 执行:
powershell ssh -p 28822 -i $env:USERPROFILE\.ssh\id_ed25519 [email protected]
根据回显现象判定结果:
- 🟢 现象 A:不需要输入密码,直接登进服务器出现了
root@...#!
🎉 恭喜!整个链路 100% 跑通了!直接前往【第 10 步】进行安全收网。 - 🔴 现象 B:提示
Connection timed out(连接超时)
👉 必是【第 7 步】云厂商网页控制台的安全组规则没放行成功,或者端口敲错,回去仔细核对入站规则。 - 🔴 现象 C:提示
Connection refused(连接被拒绝)
👉 回到老窗口敲ss -tulpn | grep sshd看一眼,通常是新端口未监听,回第 6 步看防坑 C 是否漏掉了。 - 🔴 现象 D:提示
Permission denied (publickey)
👉 钥匙问题:说明公钥没对齐,回到第 5、6 步检查公钥复制是否漏了头尾字符或引号。 - 🔴 现象 E:提示
Permissions are too open
👉 本地电脑的私钥权限过大,本地执行chmod 600 ~/.ssh/id_ed25519即可。
第 10 步:安全收网——彻底关闭密码登录通道
铁律:必须在第 9 步新窗口已经免密连入成功的前提下,才执行此步!
回到老 🖥️ 【服务器窗口】,执行收网指令:
# 将彻底禁用密码登录追加进 01-hardened.conf
cat << EOF >> /etc/ssh/sshd_config.d/01-hardened.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin prohibit-password
EOF
# 优雅重载服务
systemctl restart ssh 2>/dev/null || systemctl restart sshd
接着,执行终极合规复核(OpenSSH 官方唯一认可的有效参数解析工具 sshd -T):
sshd -T | grep -E '^(port|passwordauthentication|permitrootlogin)'
- ✅ 成功标志(三行必须完全对应):
text port 28822 passwordauthentication no permitrootlogin prohibit-password
此时,密码登录通道已在系统物理层面彻底封死,黑客即使用超级计算机跑暴力碰撞字典也敲不开大门。
🏁 大功告成!现在,最初那个保命的服务器老窗口终于可以安全关闭了。
🎁 极客彩蛋:配置本地别名,从此一秒直连
以后每次连服务器都要敲一长串端口、IP 和密钥路径,太繁琐了?只需在自己本地电脑做个快捷别名:
💻 【你自己的电脑】 编辑或新建本地配置文件:
* Mac / Linux:nano ~/.ssh/config
* Windows:用记事本打开新建 ~\.ssh\config
在文件里追加保存这几行(IP 和端口换成你的):
Host myvps
HostName 123.45.67.89
Port 28822
User root
IdentityFile ~/.ssh/id_ed25519
保存退出后,以后无论何时,只要在本地电脑输入:
ssh myvps
一秒回车,直接免密跃入服务器,清爽且极客!🚀
🚑 翻车急救站(FAQ 常见问题救助)
| 异常现象 | 真实根因 | 对应救命招式 |
|---|---|---|
| 新开终端连接提示超时 | 云厂商控制台外层安全组阻断 | 登录云平台网页控制台,核对安全组入站规则是否放行了该 TCP 端口。 |
| 测试中途把密码连错 5 次被关在门外 | Fail2ban 正常拦截了暴力试探 | 方案 1:连手机热点换个 IP 连接; 方案 2:在云平台网页上打开 VNC 网页控制台(走内部通道,不受拦截影响)登入,执行 fail2ban-client unban <你的本地IP>。 |
| 不小心把老窗口手滑关了,新端口死活连不上 | 出现配置断联事故 | 绝杀大招:回到云厂商控制台的「快照」页面,找到【准备阶段】拍的快照,点击「恢复系统盘」,服务器一键无损回到起跑线! |
| 忘记自己随手记在便签上的端口号了 | 遗忘自定义端口 | 登录网页 VNC,执行 grep Port /etc/ssh/sshd_config.d/01-hardened.conf 查看。 |
🎓 毕业全维度状态自检表
在服务器里运行以下指令核对,全部符合即代表本台机器的基准加固已彻底达到生产受控标准:
| 检查维度 | 查验命令 | 预期看到的结果 | 达标意义 |
|---|---|---|---|
| 时钟同步 | timedatectl \| grep -E 'synchronized\|NTP' |
synchronized: yesNTP service: active |
证书与安全令牌时钟严格对齐 |
| 内存缓冲 | free -h \| grep Swap |
约为 2.0Gi |
消除突发高负载被 OOM 强行打崩隐患 |
| BBR 网络 | sysctl net.ipv4.tcp_congestion_control |
= bbr |
跨国弱网与丢包链路下维持高吞吐 |
| 防火墙 | ufw status verbose |
Status: active仅有你的自定义端口 |
物理收敛外部暴露面 |
| SSHD 审计 | sshd -T \| grep -E '^(port\|password)' |
你的端口 + no |
首次匹配生效,密码通道物理封死 |
| 入侵守护 | fail2ban-client status sshd |
正常显示 jail 与封禁计数器 | 24 小时自动阻断暴力穷举试探 |
| 自动修补 | apt-config dump \| grep Unattended |
包含 "1"; |
核心 CVE 安全漏洞无需人工巡检自动修复 |
0 RESPONSES
读者回应
把读完后的余温,留在这篇文章下面。