VPS 到手第一件事:基础配置 + 安全加固 + BBR 一条龙

目录

新 VPS 拿到手,几乎所有教程都跳过了一个事实:默认状态的 VPS 是不安全的——22 端口暴露在公网、密码登录开着、没有 fail2ban、内核 TCP 拥塞算法还是几十年前的 cubic。

这篇按顺序把“刚开机到能放心跑服务”之间最少要做的事过一遍,标准 Debian/Ubuntu,10 分钟搞定。

一、整体顺序

流程图流程图

⚠️ 顺序很重要:先配好密钥再关密码登录,否则容易把自己锁在外面。

二、第一次登录后查系统信息

# 系统版本
cat /etc/os-release

# 内核版本
uname -r

# CPU 核心数 / 型号
nproc
lscpu | grep "Model name"

# 内存 / 磁盘
free -h
df -h

这一步是为了和商家承诺的配置对齐——很多小商家会“超售”,到手发现 CPU 是被限频的或内存是 swap 凑出来的。

三、系统更新

apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean
子命令 作用
apt update 更新软件包索引
apt full-upgrade -y 升级所有软件(含内核)
apt autoremove -y 删除孤立依赖
apt autoclean 清理过期下载缓存

升级完检查是否需要重启(通常内核更新后要重启):

cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

四、安装基础工具

apt install -y sudo curl wget git vim htop tree unzip ufw fail2ban neofetch
工具 用途
sudo 普通用户提权
curl / wget 下载
git 版本控制
vim 顺手的编辑器
htop 进程监控(比 top 好看)
tree 树形目录
ufw 简单防火墙
fail2ban 防 SSH 暴力破解
neofetch 系统信息装饰

💡 Debian 最小化镜像默认连 sudo 都没装,记得先装。

五、配置 SSH 密钥登录(关键)

5.1 在本地生成密钥(如果还没有)

# 在你自己电脑上跑
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519

-t ed25519 比 RSA 更短更安全。

5.2 把公钥上传到 VPS

# 方式一:ssh-copy-id(最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@<VPS_IP>

# 方式二:手动(如果商家关了密码登录或没装 ssh-copy-id)
cat ~/.ssh/id_ed25519.pub | ssh root@<VPS_IP> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

5.3 修复权限(90% 的“密钥登录失败”是这个)

# 在 VPS 上跑
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

5.4 验证能用密钥登录

开一个新终端(别关原来的,万一连不上能救):

ssh -i ~/.ssh/id_ed25519 root@<VPS_IP>

能直接进,不让你输密码——成功。

六、改 SSH 端口 + 关密码登录

编辑 /etc/ssh/sshd_config:

sudo vim /etc/ssh/sshd_config

修改这几行:

# 改端口(任选一个 1024–65535 之间的,别用常见的)
Port 22000

# 禁用密码登录
PasswordAuthentication no
ChallengeResponseAuthentication no

# 禁用 root 用密码登录(密钥还允许)
PermitRootLogin prohibit-password

# 启用密钥登录
PubkeyAuthentication yes

改完先别 restart,先把新端口在防火墙开放(下一步),否则 restart 后旧端口失效、新端口被防火墙挡,你就连不上了。

# 先放新端口
sudo ufw allow 22000/tcp

# 再重启 ssh
sudo systemctl restart ssh

再开一个新终端验证:

ssh -p 22000 -i ~/.ssh/id_ed25519 root@<VPS_IP>

能进就成功。这时候才关掉原来的旧连接。

🪤 特别注意:部分云厂商的“轻量应用服务器”或“容器实例”是平台层代理 SSH 的,你改 sshd_config 没用——用 sudo ss -lntp | grep :22 看监听的是 sshd 还是 init/platform_agent。是后者的话,得去云控制台改。

七、开启 ufw 防火墙

# 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 关键端口
sudo ufw allow 22000/tcp   # 你的新 SSH 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用
sudo ufw enable
sudo ufw status

⚠️ ufw enable 会警告“可能中断 SSH”,确认 22000 已 allow 再 y 确认。

八、配置 fail2ban 防 SSH 暴力破解

fail2ban 监控日志,多次登录失败的 IP 自动封 N 分钟:

# 复制默认配置(不要直接改 jail.conf)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local

把 [sshd] 段改成(其它段先不动):

[sshd]
enabled = true
port = 22000                 # 你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 4                 # 4 次失败就封
bantime = 3600               # 封 1 小时
findtime = 600               # 10 分钟内累计
backend = auto

启动:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

常用命令:

# 看 fail2ban 状态
sudo fail2ban-client status

# 看 SSH jail 状态(含被封 IP 列表)
sudo fail2ban-client status sshd

# 手动封 / 解封
sudo fail2ban-client set sshd banip 1.2.3.4
sudo fail2ban-client set sshd unbanip 1.2.3.4

🪤 常见坑:自己输错密码几次也会被自己 ban 掉。把自己的家庭 IP 加白名单:

ignoreip = 127.0.0.1/8 ::1 <你的家庭 IP>

九、开启 BBR 拥塞控制

BBR 是 Google 设计的 TCP 拥塞控制算法,对延迟敏感的代理 / 翻墙线路提升非常明显。Linux 4.9+ 都内置,只需要开启:

# 看当前用的算法
sysctl net.ipv4.tcp_congestion_control

# 开启 BBR
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 验证
sysctl net.ipv4.tcp_congestion_control
# 输出 net.ipv4.tcp_congestion_control = bbr 即成功
lsmod | grep bbr

也可以用社区一键脚本(自动判断内核 + 安装 BBR Plus / BBRv3 等变种):

# 选一个你信任的 BBR 脚本(GitHub star 数高、近期更新)
# 谨慎执行,最好读一遍源码

⚠️ 不要随便执行陌生 BBR 脚本——这是 VPS 上权限最高的操作之一。优先用上面的 sysctl 原生方式。

十、设置时区

VPS 默认时区是 UTC:

# 看当前时区
timedatectl

# 改为上海(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

如果是给国外用户用的服务,时区保留 UTC 反而最好(日志可对齐)。

十一、本地 SSH config(强烈推荐)

每次 ssh -p 22000 -i ~/.ssh/id_ed25519 root@1.2.3.4 太累。编辑本机 ~/.ssh/config:

Host vps1
    HostName 1.2.3.4
    User root
    Port 22000
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

Host vps2
    HostName 5.6.7.8
    User admin
    Port 22000
    IdentityFile ~/.ssh/id_ed25519

之后只用:

ssh vps1

十二、关键文件位置(出问题时去这查)

文件 用途
/etc/ssh/sshd_config SSH 服务端配置
~/.ssh/authorized_keys 允许登录的公钥
/etc/fail2ban/jail.local fail2ban 配置
/var/log/auth.log SSH 登录日志
/etc/sysctl.conf 内核参数(BBR 等)
/etc/ufw/user.rules ufw 用户规则

十三、常见故障速查

现象 原因 解决
密钥登录失败一直要密码 ~/.ssh 或 authorized_keys 权限错 chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
改端口连不上 防火墙没开 / sshd 没重启 / 云厂商代理 SSH 用 VNC 进去查
fail2ban 把自己封了 没加 ignoreip VNC 登录后 fail2ban-client set sshd unbanip 你的IP
sudo 找不到 最小化系统没装 apt install sudo,然后 usermod -aG sudo <用户>
BBR 不生效 内核太老 uname -r 看是不是 4.9+

十四、可选进阶

跑完上面这些已经是合格的“安全 VPS”了。还有几样可以按需加:

  • 2FA SSH(用 google-authenticator-libpam)
  • 改 UFW 默认日志级别为 low:sudo ufw logging low
  • logwatch 每天发邮件给自己(小心邮件配置麻烦)
  • unattended-upgrades 自动安装安全更新:apt install -y unattended-upgrades
  • VPS 监控(哪吒 / Komari / Uptime Kuma)

这套流程跑顺之后,每次新到 VPS 都是 10 分钟从零到生产可用。后面我会把这套整理成一键脚本(带交互式确认,不直接执行陌生命令),避免每次手动复制粘贴。