刚开通的搬瓦工 VPS,只要连上去执行一下 lastb | head -20,基本都能看到陌生 IP 在尝试登录。下面是一台测试机上的实际记录:同一个 IP 在一两分钟内连续尝试了几十次,先试 root,再换成 oracle 这类常见用户名。

这不是有人专门盯上了你,而是全网的自动扫描器在不停地扫 22 端口,碰到谁就试谁。
搬瓦工新机器的默认状态是 root 用户 + 密码登录 + 22 端口,开箱就能用,但这三样恰好也是扫描器最喜欢的组合。只要密码够复杂,短期内一般不会出事,但长期跑业务的服务器,还是值得花半小时把基础安全做好。
这篇文章按实际操作顺序整理了一份加固清单,每一步都考虑了“改错了怎么办”,并且给出了 KiwiVM 面板里的兜底手段。命令同时覆盖 Debian / Ubuntu 和 CentOS / AlmaLinux / Rocky 两大系列。
开始之前,你需要已经能用 SSH 登录 VPS。如果还不会,先看这篇 搬瓦工 SSH 连接教程。
开始之前:先做快照,留好退路
后面要改 SSH 配置和防火墙,这两样一旦改错,最直接的后果就是连不上自己的服务器。所以建议先给 VPS 做一个快照。
登录 搬瓦工官网 的客户中心,依次点击「Services」→「My Services」,在对应 VPS 的「Manage」菜单中选择「Open KiwiVM」进入面板。然后在左侧菜单 KiwiVM Extras 下找到「Snapshots」,点击「Create new snapshot」即可。

关于搬瓦工的快照,有几点需要知道:
- 完全免费:创建和存储快照都不收费
- 保存 30 天:普通快照 30 天后会自动删除,最多可以把 2 个快照标记为 sticky(永久保留)
- 创建快照时 VPS 会重启:如果上面已经在跑业务,选一个访问量少的时间操作
另外 KiwiVM 还有「Backups」自动备份功能,作为额外的保障。不过自动备份不是实时的,改配置之前手动做一次快照才最稳妥。除了快照,你还需要知道搬瓦工的两条“备用”通道,它们都不经过 SSH,所以就算 SSH 配置被改坏了也能用:
- Root shell - basic:网页里直接以 root 身份执行命令,不需要登录
- Root shell - interactive:相当于 VNC 远程控制台,用系统用户名和密码登录

最后是一条贯穿全文的操作原则:修改 SSH 相关配置时,始终保留一个已经登录的窗口不要关,另开一个新窗口测试能否连接。新窗口测试成功了,再关掉旧窗口。这样即使改错,也能在旧窗口里直接改回来。
第 1 步:更新系统和软件包
很多安全问题来自已经公开、早已修复的漏洞,所以第一件事是把系统更新到最新。
Debian / Ubuntu:
apt update && apt upgrade -y
CentOS / AlmaLinux / Rocky:
dnf upgrade -y
如果更新了内核,执行 reboot 重启一次让新内核生效。
如果你的系统版本比较老(比如已经停止维护的 CentOS 7),系统本身已经收不到安全补丁了,建议在 KiwiVM 的「Install new OS」里换成仍在维护的版本。新上线的系统可以参考 KiwiVM 新增 Ubuntu 26.04。重装会清空数据,记得先备份。
第 2 步:开启自动安全更新
手动更新总会忘,所以让系统自己安装安全补丁。这里只自动装安全更新,不自动做大版本升级,避免服务因为升级而出问题。
Debian / Ubuntu 使用 unattended-upgrades:
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
在弹出的界面中选择「Yes」即可。Ubuntu 一般已经预装了这个工具,执行第二条命令确认开启就行。
AlmaLinux / Rocky(以 9 版本为例) 使用 dnf-automatic:
dnf install -y dnf-automatic
编辑配置文件 /etc/dnf/automatic.conf,把下面两项改成:
upgrade_type = security
apply_updates = yes
然后启用定时任务:
systemctl enable --now dnf-automatic.timer
第 3 步:新建普通用户并授予 sudo 权限
一直用 root 登录有两个问题:一是扫描器全都在猜 root,二是 root 权限下误操作没有任何缓冲。更好的做法是建一个普通用户日常登录,需要时再用 sudo 提权。
下面以用户名 bwhuser 为例,你可以换成自己的名字(不要用 admin、test 这类常见用户名)。
Debian / Ubuntu:
# Debian 最小化系统可能没有 sudo,先装上
apt install -y sudo
adduser bwhuser
usermod -aG sudo bwhuser
CentOS / AlmaLinux / Rocky:
adduser bwhuser
passwd bwhuser
usermod -aG wheel bwhuser
接着给新用户配置 SSH 密钥登录。
密钥的生成和上传方法在 搬瓦工重置 root 密码与 SSH 密钥登录 中有完整讲解,这里不再重复,只需要注意一点:公钥要放到新用户的目录下,也就是 /home/bwhuser/.ssh/authorized_keys。用 ssh-copy-id 上传时把用户名换掉即可:
ssh-copy-id bwhuser@你的VPS的IP地址
如果你是用 root 手动创建的 .ssh 目录,记得把所有权交给新用户,否则密钥登录会失败:
chown -R bwhuser:bwhuser /home/bwhuser/.ssh
chmod 700 /home/bwhuser/.ssh
chmod 600 /home/bwhuser/.ssh/authorized_keys
然后新开一个窗口测试:用新用户和密钥登录,执行 sudo whoami,输出 root 就说明 sudo 正常。这一步没成功之前,不要进行后面的操作。
第 4 步:修改 SSH 端口
先说清楚:改端口不能真正挡住有心人,扫一遍全端口就能找到。它的价值在于避开绝大多数只扫 22 端口的自动程序,让日志清净很多,fail2ban 的压力也小很多。
新端口建议在 10000~65535 之间随便选一个,避开 3306、8080 这类常见服务端口。下文我就以 52168 为例。
修改配置文件
编辑 /etc/ssh/sshd_config,找到 #Port 22 这一行,去掉 # 并改成新端口:
Port 52168
如果你已经开启了防火墙(后面第 6 步才会配置,新机默认一般没开),必须先放行新端口再重启 SSH,否则会把自己挡在外面。
让新端口生效
这一步不同系统差别比较大,也是最容易踩坑的地方。
Debian / CentOS / AlmaLinux / Rocky / Ubuntu 22.04 及更早版本:
systemctl restart sshd
Debian 和 Ubuntu 的服务名是 ssh,如果提示找不到 sshd,把命令换成 systemctl restart ssh。
Ubuntu 24.04 及更新版本(包括 26.04):这些版本的 SSH 改成了由 ssh.socket 按需启动,只重启 ssh 服务,新端口不会生效,依然监听在 22。需要执行:
systemctl daemon-reload
systemctl restart ssh.socket
不确定自己是哪种情况,可以执行 systemctl is-active ssh.socket,输出 active 的就用第二种方法。
CentOS / AlmaLinux / Rocky 开启了 SELinux 时,还需要告诉 SELinux 允许 SSH 使用新端口,否则 sshd 会启动失败:
dnf install -y policycoreutils-python-utils
semanage port -a -t ssh_port_t -p tcp 52168
确认并测试
用下面的命令确认 SSH 已经在新端口上监听:
ss -tlnp | grep ssh
看到 :52168 就说明生效了。然后保留当前窗口,另开一个窗口用新端口连接:
ssh -p 52168 bwhuser@你的VPS的IP地址
PuTTY、Xshell 等工具在会话设置里把端口从 22 改成新端口即可,具体位置可以参考 SSH 连接教程 中的截图。
第 5 步:禁止 root 登录和密码登录
这是整篇文章里最重要的一步。关掉密码登录后,没有你的私钥就无法登录,爆破基本没有成功的可能。
前提条件:第 3 步的新用户密钥登录已经测试成功。如果还没成功,千万不要继续。
先用下面这条命令看看 SSH 当前实际生效的配置:
sshd -T | grep -Ei '^(port|permitrootlogin|passwordauthentication)'
没做过任何加固的机器,输出一般是这样的:端口 22,允许 root 登录,允许密码登录,正是扫描器最喜欢的组合。

接下来就把后两项关掉。编辑 /etc/ssh/sshd_config,找到并修改(没有就添加)以下两行:
PermitRootLogin no
PasswordAuthentication no
PermitRootLogin no 表示完全禁止 root 通过 SSH 登录。如果你习惯直接用 root + 密钥登录,可以改成 prohibit-password,意思是 root 只能用密钥登录。
检查覆盖配置
有些系统模板在 /etc/ssh/sshd_config.d/ 目录下还有额外的配置文件,里面的设置会覆盖主配置文件。比如里面如果写着 PasswordAuthentication yes,你在主配置里改成 no 是不生效的。先看一下:
grep -r "PasswordAuthentication\|PermitRootLogin" /etc/ssh/sshd_config.d/
如果有输出,把对应文件里的设置也一并改掉。没有输出就说明没有覆盖配置,直接进行下一步。
重启并验证
和第 4 步一样重启 SSH(Ubuntu 24.04 及以后用 systemctl restart ssh.socket,其他用 systemctl restart sshd 或 ssh),然后再执行一次前面的 sshd -T 命令,输出应该变成:
port 52168
permitrootlogin no
passwordauthentication no
最后新开一个窗口验证:用密钥登录新用户应该成功;用 root 登录、或者用密码登录,都应该被拒绝。
第 6 步:配置防火墙,只开放需要的端口
防火墙的原则很简单:默认拒绝所有进入的连接,只放行你确实需要的端口。
动手之前,先看看服务器上有哪些程序在监听端口:
ss -tulnp
这条命令会列出所有正在监听的端口和对应的程序,帮你确认哪些需要放行、哪些压根不该对外开放。
Debian / Ubuntu:使用 ufw
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
# 先放行 SSH 新端口,这一步一定不能漏
ufw allow 52168/tcp
# 建站需要的话放行 80 和 443
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
一定要先放行 SSH 端口,再执行 ufw enable。顺序反了,当前连接会立刻断开。
启用后查看状态:
ufw status verbose
下面是我一台建站机器的实际规则,可以对照着看:

- Default 一行:
deny (incoming), allow (outgoing),表示默认拒绝所有进入的连接、允许所有出去的连接,这是我们想要的状态 - 38222/tcp:这台机器的 SSH 新端口
- 80/tcp、443/tcp:网站的 HTTP 和 HTTPS
- 443/udp:网站开启了 HTTP/3,它走的是 UDP 协议,不用 HTTP/3 的话不需要放行
- 10650/tcp:管理面板的端口(已改掉默认端口)
- 3306/tcp DENY:明确拒绝外部访问 MySQL。默认策略已经是拒绝,这条规则其实可以不加,但写出来更直观,也能防止以后误放行
- (v6) 开头的规则:ufw 会自动为 IPv6 生成同样的规则,不需要单独设置
你可能注意到截图里 22/tcp 还是放行状态。这是因为截图时还处在“新端口刚测试成功、旧端口还没关”的阶段。确认新端口能正常连接后,记得把 22 端口的规则删掉:
ufw delete allow 22/tcp
CentOS / AlmaLinux / Rocky:使用 firewalld
systemctl enable --now firewalld
firewall-cmd --permanent --add-port=52168/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 新端口确认能连上之后,再移除默认的 22 端口
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
查看当前规则:
firewall-cmd --list-all
哪些端口该开,哪些不该开
- 需要放行:SSH 新端口;建站用的 80、443;你自己部署的服务实际要对外提供的端口
- 不要对外开放:MySQL(3306)、Redis(6379)、MongoDB(27017)这类数据库端口。数据库只给本机程序用的话,根本不需要放行;需要远程管理时,用 SSH 隧道连接更安全
- 管理面板:如果你装了 1Panel 等可视化面板,面板端口需要放行
另外,搬瓦工默认开放 25 端口出站,可以直接发邮件(详见 搬瓦工 Basic 套餐测评)。不发邮件的话不用管它;如果要发邮件,注意别让程序被人利用来群发垃圾邮件,否则可能收到滥用投诉。
第 7 步:安装 fail2ban,自动封禁爆破 IP
fail2ban 会盯着登录日志,同一个 IP 在短时间内失败次数过多,就自动用防火墙把它封掉一段时间。
Debian / Ubuntu:
apt install -y fail2ban python3-systemd
AlmaLinux / Rocky(fail2ban 在 EPEL 仓库中):
dnf install -y epel-release
dnf install -y fail2ban
不要直接改默认的 jail.conf,而是新建 /etc/fail2ban/jail.local,写入:
[sshd]
enabled = true
port = 52168
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
这几项的意思是:10 分钟内失败 5 次,就封禁该 IP 1 小时。port 记得填你的 SSH 新端口。
为什么要写 backend = systemd:fail2ban 默认通过读取 /var/log/auth.log 来发现失败的登录,但从 Debian 12 开始,官方默认不再安装生成这个文件的 rsyslog。系统里没有这个文件时,fail2ban 会直接启动失败。改成从 systemd 日志读取就不受影响,这也是上面安装命令里要带上 python3-systemd 的原因。不管你的系统有没有这个文件,这样写都能正常工作。
启动并设为开机自启:
systemctl enable --now fail2ban
过一段时间查看封禁情况:
fail2ban-client status sshd
输出中的 Currently banned 是当前正在封禁的 IP 数量,Total banned 是累计封禁次数,Banned IP list 列出了具体被封的 IP。服务器在公网上跑几个小时后,这里通常就会出现被封禁的扫描 IP。
如果不小心把自己的 IP 封了,可以通过 KiwiVM 的 Root shell 执行下面的命令解封:
fail2ban-client set sshd unbanip 你的IP地址
别忘了账户层面的安全
服务器加固做得再好,如果搬瓦工账户或 KiwiVM 面板被别人登录,对方可以直接重置 root 密码、重装系统。所以 KiwiVM 左侧菜单的 Security & Records 分组里,有几项值得花两分钟设置:
- Two-factor authentication:开启两步验证,登录面板时除了密码,还需要手机上的动态验证码
- Passkeys and Security keys:支持通行密钥和硬件安全密钥,比两步验证更方便也更安全
- Audit log:记录面板上的操作,可以定期看看有没有不是你本人做的操作
- Email notifications:开启邮件通知,面板上有重要操作时会发邮件提醒你
这几项的位置可以参考本文开头快照截图的左侧菜单。
另外有两点也要注意:
- 搬瓦工客户中心账户的密码要足够复杂,不要和其他网站共用同一个密码
- 只从官方网址或官方镜像站登录。最稳妥的做法是把 搬瓦工官网 加入浏览器书签,每次都从书签进入,不要点击来路不明的链接。如果你访问官网有困难,可以参考 搬瓦工官网打不开怎么办 中整理的官方地址
改错了连不上怎么办?
只要按前面的顺序操作,并且始终保留一个已登录的窗口,一般不会被锁在外面。万一真的连不上了,按下面的情况处理。所有操作都在 KiwiVM 面板中完成,不需要 SSH。
情况一:改了端口,但防火墙没放行
打开 KiwiVM 的「Root shell - basic」,执行放行命令(ufw 用 ufw allow 新端口/tcp,firewalld 用 firewall-cmd --add-port=新端口/tcp)。实在不确定问题在哪,可以先临时关闭防火墙(ufw disable 或 systemctl stop firewalld),连上之后再慢慢排查。
情况二:关了密码登录,但密钥没配好
在「Root shell - basic」里把 /etc/ssh/sshd_config 中的 PasswordAuthentication 临时改回 yes,重启 SSH 后用密码登录,再重新配置密钥。也可以直接在 Root shell 里把公钥写进 authorized_keys,方法见 SSH 密钥登录设置。
情况三:被 fail2ban 封了自己的 IP
换个网络(比如手机热点)连接,或者在 Root shell 里用 fail2ban-client set sshd unbanip 你的IP 解封。
情况四:SSH 服务本身起不来
使用「Root shell - interactive」,它相当于直接插了一台显示器到服务器上,完全不经过 SSH 和网络端口,用系统用户和密码就能登录。即使设置了 PermitRootLogin no,这里也照样能用 root 登录,因为这个限制只对 SSH 有效。

最后的手段:恢复快照
以上方法都解决不了的话,在「Snapshots」里恢复到开始前做的那个快照,然后重新来一遍。
拿不准问题出在哪里,也可以先问一下 KiwiVM 内置的 Assistant Amy AI 助手,让它帮你分析排查。
安全设置自查清单
全部完成后,可以用下面这张表逐项检查一遍:
| 检查项 | 检查命令 | 期望结果 |
|---|---|---|
| SSH 端口 | sshd -T | grep ^port | 显示你设置的新端口 |
| 禁止 root 登录 | sshd -T | grep permitrootlogin | no 或 prohibit-password |
| 禁止密码登录 | sshd -T | grep passwordauthentication | no |
| 防火墙状态 | ufw status 或 firewall-cmd --state | active / running |
| fail2ban 状态 | fail2ban-client status sshd | 正常输出,没有报错 |
| 自动更新 | systemctl status unattended-upgrades 或 systemctl status dnf-automatic.timer | active |
| 对外开放的端口 | ss -tulnp | 只有你确实需要的端口 |
全部通过之后,再创建一个快照并标记为 sticky。以后重装系统或出了问题,可以直接恢复到这个加固好的状态,省去重新配置的时间。
总结
搬瓦工 VPS 的安全设置并不复杂,跟着做下来大约半小时。如果时间有限,最重要的是这三件事:
- 动手前先做快照,给自己留好退路
- 使用密钥登录并关闭密码登录,这一项就能挡住绝大多数爆破
- 防火墙只开放需要的端口,尤其不要把数据库端口暴露在公网
做完安全设置,下一步可以 开启 BBR 加速,提升 VPS 的网络速度。
还没有搬瓦工 VPS?
本文用到的快照、Root shell、两步验证等功能,都是搬瓦工 KiwiVM 面板自带的,不需要额外付费。尤其是快照和不经过 SSH 的 Root shell,让新手做安全设置时即使改错了也能自己救回来。
- 个人建站、学习 Linux:Basic VPS 系列性价比最高, 前往查看 Basic VPS 套餐
- 对线路和稳定性要求高的业务:CN2 GIA 系列晚高峰更稳定, 前往查看 CN2 GIA 套餐
第一次购买的话,可以跟着 搬瓦工购买教程 一步步操作,下单前别忘了到 搬瓦工优惠码汇总 看看当前可用的优惠码。
常见问题解答(FAQ)
Q1:已经改了 SSH 端口,还有必要装 fail2ban 吗?
+有必要,但两者的作用不一样。改端口只是让自动扫描器少找到你,属于“降噪”;真正有人盯上你的服务器时,扫一遍全端口就能找到新的 SSH 端口。
fail2ban 则是在对方反复猜密码时直接封掉 IP。如果你已经按本文关闭了密码登录,爆破基本不可能成功,fail2ban 更多是减少日志垃圾和无效连接。所以优先级是:密钥登录 + 关闭密码登录 > 防火墙 > fail2ban > 改端口,四项都做最稳妥。
Q2:VPS 被攻击会导致搬瓦工 IP 被墙吗?
+一般不会。IP 被墙通常和服务器上跑的流量类型有关,而不是被别人扫描或爆破。但如果服务器真的被攻破、被拿去发垃圾邮件或攻击别人,搬瓦工可能会因为滥用投诉暂停你的 VPS,处理起来比被墙麻烦得多。
如果你的 IP 已经出现异常,可以参考 搬瓦工更换 IP 教程 先检测再处理。
Q3:在 KiwiVM 重装系统后,这些安全设置还在吗?
+不在。重装系统会清空整块硬盘,新建的用户、SSH 配置、防火墙规则都会恢复成模板默认状态,需要重新做一遍。
省事的办法是:在新系统上加固完成后立即创建一个快照,并把它标记为 sticky(永久保留)。以后需要重来时直接恢复这个快照,就不用每次都从头配置了。
Q4:开启防火墙会影响 BBR 加速或网速吗?
+Q5:VPS 只是用来学习和测试,也需要这么设置吗?
+建议至少做三件事:设置强密码或密钥登录、保持系统更新、创建一个快照。学习用的机器同样会被全网扫描,一旦被攻破被用来作恶,账户被封的是你。
其余的改端口、fail2ban 可以视情况跳过,但整套流程本身就是很好的 Linux 练习,花半小时做一遍也不亏。