VPS 情报站

新 VPS 到手先做这 6 件事:更新、建用户、密钥登录、关密码、防火墙、swap

发布于 2026-10-28

VPS 一开通就有公网 IP,全网的扫描器几分钟内就会来试 root 密码。所以拿到机器后,先做安全设置,再部署东西。

本文以 Ubuntu 24.04 为例,Debian 基本一样。截图都是真实运行结果,演示机器的 IP 用 203.0.113.10 代替,你照做时换成自己 VPS 的 IP。

演示环境:一台全新的 Ubuntu 24.04(主机名 my-vps)和一台“你的电脑”(用户名 me)。

第 1 步:登录并更新系统

商家会在邮件或控制台里给你 root 密码。在自己电脑的终端里登录:

ssh root@你的IP

第一次连接会问是否信任这台主机,输入 yes,再输入密码。登录后先把系统更新到最新:

apt update
apt upgrade -y

在 VPS 上运行 apt update 和 apt upgrade,提示所有软件已是最新

第 2 步:建一个日常用的普通用户

一直用 root 操作,手一抖就可能删掉系统文件。建一个普通用户(这里叫 deploy,名字随意),给它 sudo 权限,需要管理员权限时再用 sudo:

adduser deploy
usermod -aG sudo deploy

adduser 会让你设置密码(输入时屏幕不显示),后面姓名、电话等直接回车跳过。最后用 id deploy 确认,输出里有 sudo 就对了。

adduser deploy 创建用户,usermod 加入 sudo 组,id deploy 显示已在 sudo 组

第 3 步:改用 SSH 密钥登录

密码可以被暴力猜,密钥基本猜不出来。

在你自己的电脑上(不是 VPS)生成一对密钥。macOS、Linux 和 Windows 10 以上的终端都自带这个命令:

ssh-keygen -t ed25519 -C "me@laptop"

一路回车即可(想给密钥加密码也可以在提示时输入)。会生成两个文件:~/.ssh/id_ed25519 是私钥,绝不能给别人;id_ed25519.pub 是公钥,要放到服务器上。

在自己电脑上运行 ssh-keygen 生成 ed25519 密钥,并查看公钥内容

然后把公钥装到 VPS 上的 deploy 用户里,会要求输入一次 deploy 的密码:

ssh-copy-id deploy@你的IP

装好后用 deploy 登录试试,这次不会再问密码:

ssh-copy-id 把公钥装到 VPS,随后用 ssh deploy@203.0.113.10 免密码登录成功

Windows 自带的 OpenSSH 没有 ssh-copy-id。可以在 PowerShell 里运行: type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@你的IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

第 4 步:禁止 root 登录和密码登录

确认第 3 步的密钥登录成功之后再做这一步,否则会把自己锁在外面。

用 deploy 登录,新建一个配置文件:

echo "PermitRootLogin no" | sudo tee /etc/ssh/sshd_config.d/01-hardening.conf
echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config.d/01-hardening.conf
sudo sshd -t && echo "配置检查通过"
sudo sshd -T | grep -E "^(permitrootlogin|passwordauthentication) "

创建 01-hardening.conf,sshd -t 检查通过,sshd -T 显示 permitrootlogin no 和 passwordauthentication no

演示环境里模拟了云厂商镜像常带的 50-cloud-init.conf

文件名为什么用 01- 开头? 很多云厂商的 Ubuntu 镜像在同一目录下自带 50-cloud-init.conf,里面写着 PasswordAuthentication yes。SSH 按文件名顺序读取,同一项以先读到的为准。如果你的文件叫 99-xxx.conf,就会被它覆盖,看起来改了其实没生效。最后一条 sshd -T 显示的是真正生效的值,两项都是 no 才算成功。

确认无误后重启 SSH 服务:

sudo systemctl restart ssh

先别关掉当前窗口,另开一个终端测试:用 deploy 能登录,用 root 应该被拒绝。

在自己电脑上 ssh root@203.0.113.10 被拒绝:Permission denied (publickey)

第 5 步:打开防火墙,只放行需要的端口

Ubuntu 自带 ufw 防火墙。一定先放行 SSH,再启用,不然当前连接会被断开、再也连不上:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status

80 和 443 是网站用的端口,不建站可以不开。启用时会提示可能中断 SSH 连接,输入 y 确认。

依次放行 OpenSSH、80、443 端口,启用 ufw,状态显示 active

有些商家(如腾讯云、AWS、Vultr)在控制台里还有一层“安全组”或“防火墙”。如果端口在服务器上放行了还是访问不了,去控制台检查那一层。

第 6 步:内存小的机器加 swap

1–2 GB 内存的机器,跑着跑着内存用完,系统会直接杀掉进程。加一块 1–2 GB 的 swap(用硬盘临时充当内存)可以兜底:

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

用 free -h 检查,Swap 那一行有数字就成功了。最后一行命令让重启后自动挂载。swap 比内存慢得多,只是兜底,经常用到就该升级内存了。

做完之后