很多人买搬瓦工 VPS 之后,习惯把默认的 22 端口改成别的,再顺手用密钥登录。平时用 Termius、Xshell 这些客户端把连接信息一存,基本不用手输端口,日子一长,还真就忘了当初改到多少。更麻烦的是,客户端里保存的还是 22,本地私钥明明还在,服务器也一直正常跑着,就是登不上去。
遇到这种情况,先别急着重装系统。端口丢了不代表私钥丢了,也不代表数据没了,代价太大的操作放到最后再考虑。本文讲两种实用的办法:先用 Nmap 扫一下 VPS 开放了哪些端口,找不到就进搬瓦工的 KiwiVM 控制台,从服务器内部把真正生效的 SSH 端口查出来。如果你只是刚改完端口没多久,可以对照我们这篇搬瓦工 SSH 安全设置教程回忆一下当初的配置,多少能找到点线索。
一、使用 Nmap 扫描并确认 SSH 端口
如果还能记得 VPS 的 IP 地址,SSH 服务也还在正常跑,只是把端口号忘了个干净,那直接上 Nmap 最省事。有人一看到端口范围是 1 到 65535 就头大,觉得得一个端口一个端口试到天荒地老。其实不用。Nmap 会自己探测服务器上开放着的 TCP 端口,一台普通 VPS 扫完也就是几分钟的事。
nmap -Pn -p- --open -T4 VPS_IP
把最后的 VPS_IP 换成你的搬瓦工 IP,比如:
nmap -Pn -p- --open -T4 104.XXX.XXX.XXX
简单说下几个参数的作用:
-Pn:不先靠 ping 判断 VPS 在不在线,直接开始扫。有些机器禁 ping,带上它免得第一步就被卡住。-p-:扫描 TCP 的 1 到 65535 全部端口。--open:只显示开放着的端口,把关闭和 filtered 的都滤掉。-T4:加快扫描速度,普通网络下够用,也不用更激进的 -T5。
扫完的结果可能长这样:
PORT STATE SERVICE
80/tcp open http
443/tcp open https
38652/tcp open unknown
重点看状态是 open、service 那列是 unknown 的那个高位端口,多半就是 SSH。为求稳妥,可以用版本探测再确认一次那个端口到底是不是 OpenSSH:
nmap -Pn -p 38652 -sV VPS_IP
确认之后,直接拿私钥连就行:
ssh -i 私钥文件路径 -p 38652 root@VPS_IP
原来的 SSH 密钥登录还能接着用,不需要重新生成密钥。这里要留意一下,如果端口找回来了,但正确的端口加上正确的密钥还是连不上,那问题就不在端口上了,得继续排查 SSH 服务、防火墙和网络这几块。
二、Nmap 无法确认时使用 KiwiVM 控制台
Nmap 不是每次都能扫到。比如说 VPS 防火墙对不少端口直接丢包,或者 SSH 服务干脆停了,扫描结果可能是一大堆 filtered,甚至连 OpenSSH 的影子都找不到。这时候就别跟 Nmap 较劲了,进搬瓦工后台用 KiwiVM 控制台。
第一次用 KiwiVM 的人不清楚入口在哪,可以先看如何从官网后台登录 KiwiVM 管理面板。进到对应 VPS 之后打开网页控制台,老用户习惯叫它搬瓦工 VNC,里面能找到 Root Shell Interactive 一类的入口。这里走的不是 SSH,所以压根不需要知道端口。
控制台出登录界面后,输入 root,再输 VPS 的 root 密码。成功进去之后就不用猜端口了,直接执行:
sshd -T | grep '^port '
如果返回:
port 38652
说明当前 SSH 配置用的就是 38652。还可以再看一眼监听状态:
ss -lntp | grep sshd
比如:
LISTEN 0 128 0.0.0.0:38652 0.0.0.0:* users:(("sshd",pid=785,fd=3))
这下就能确认 sshd 确实在监听那个端口了。有些教程让人去翻 /etc/ssh/sshd_config,这个办法也能用,但现在部分系统会从别的地方(比如 conf.d 或者 Drop-in 目录)再加载一段配置,直接读主文件容易翻到旧的、已经失效的参数。所以想知道现在到底用的是哪个端口,看 sshd -T 最靠谱,它列的是当前真正生效的值。
三、关闭 SSH 密码登录是否影响 VNC
这个点很多人容易搞混。设置密钥登录的时候,通常会把 SSH 配置里的 PasswordAuthentication 改成 no,意思是关掉 SSH 的密码认证,以后从 Termius、Xshell 或者命令行连 SSH,都不能再用 root 密码了。但这不等于把 Linux 系统里的 root 密码删掉了。
| 登录方式 | 能不能登录 |
|---|---|
| SSH + root 密码 | 不能 |
| SSH + 私钥 | 能 |
| KiwiVM/VNC + root 密码 | 能 |
注意:SSH 私钥不能拿来登 VNC。VNC 和 SSH 走的是两套认证,本地保存的那把私钥只用于 SSH。进搬瓦工网页控制台,要的是系统 root 密码。
四、VNC 无法登录时重置 root 密码
更尴尬的情况是,SSH 端口忘了,想进 KiwiVM 查一下,结果连 root 密码也想不起来了。这种也别急着重装。先进 KiwiVM 面板,找到 root 密码修改功能,设一个新密码,再回 Root Shell Interactive 登录系统。
修改 root 密码不会自动重新开启 SSH 的密码登录。如果 SSH 配置里还是 PasswordAuthentication no,就算你刚给 root 设了新密码,从外面用密码连 SSH 依旧连不上。这个新密码主要是让你先进 KiwiVM 控制台,把忘记的端口找回来。进去之后照样执行
sshd -T | grep '^port ',确认端口,再回到电脑上用原来的私钥连就行。
五、忘记 SSH 端口是否需要重装 VPS
不需要。服务器里还跑着网站、程序或者存着数据,只因为一个端口就重装系统,代价实在有点大。这类问题按下面的顺序处理基本都能解决:
- VPS IP 还记得、私钥还在,先上 Nmap 扫开放端口。
- 扫到可疑端口,用
nmap -sV确认是不是 OpenSSH。 - Nmap 找不到,进搬瓦工后台的 VNC 或网页控制台。
- root 密码忘了,先在 KiwiVM 面板重新设置。
- 进了系统,用
sshd -T查看当前端口。
只有 VPS 上确实没有要保留的数据,系统本身还有别的问题,而且你也懒得再排查了,这时候才值得考虑重装。
六、总结
自己改过 SSH 端口、客户端又没把新端口存下来,看着是挺折腾,但只要 SSH 私钥还在,基本都能处理。SSH 服务正常时,先执行 nmap -Pn -p- --open -T4 VPS_IP 把开放端口扫出来,再用 nmap -sV 找出跑 OpenSSH 的那个端口。Nmap 也找不到,就进搬瓦工 KiwiVM 控制台,用 VNC 登录服务器,执行 sshd -T | grep '^port ' 查到当前的 SSH 端口。所以碰到 SSH 登不上、又想不起改过的端口时,别急着重装系统,Nmap 加 KiwiVM 这两招,基本能应付大多数忘记 SSH 端口的情况。
如果你正打算入手或者升级搬瓦工,可以到官网对照一下最新套餐和线路,再结合自己的预算和机房需求做决定:前往搬瓦工官网。
常见问题(FAQ)
Q1: 忘记 SSH 端口但私钥也丢了怎么办?
私钥是密钥登录的凭证,丢了暂时进不了系统。但只要 root 密码还记得,走 KiwiVM 控制台照样能登进去,在系统里把 SSH 端口查出来,再重新生成一对密钥、把新公钥写进 authorized_keys,就能恢复密钥登录。要是 root 密码也忘了,先在 KiwiVM 面板重设,再从控制台进系统。
Q2: Nmap 扫出来的端口很多,哪个才是 SSH?
优先看状态是 open 的高位端口,service 那列显示 unknown 的尤其要留意。再用 nmap -sV 对单个端口做版本探测,如果显示 openssh,基本就是它。既然你已经确定不是 22 端口,就重点看非 22 的高位端口。
Q3: 用 Nmap 扫自己的 VPS 会不会被当攻击?
扫自己 VPS 的开放端口是常规运维排查,速度用 -T4 也不算激进,一般不会因为这一件事被标记。但高频、大规模扫别人的 IP 就是另一回事,别拿它去扫不相干的主机。
Q4: sshd -T 和直接看 sshd_config 有什么区别?
sshd -T 输出的是守护进程当前实际生效的参数,会合并 include 进来的其他配置文件;直接读主配置文件可能漏掉那些 Drop-in 覆盖,导致你照着文件改了半天,改的其实不是生效的那一份。想知道现在到底用哪个端口,看 sshd -T 最准。
Q5: 改了 SSH 端口之后,防火墙要不要跟着改?
要。搬瓦工系统里的防火墙(firewalld、UFW 或者你自己配的 nftables)如果只放行 22,改成高位端口后从外网就连不上了。改完端口记得同步放行新端口,再决定要不要关掉不必要的端口。
Q6: VNC 能登录但 SSH 连不上,该怎么办?
用 VNC 进去后先确认 sshd 在跑、端口对、防火墙放行了那个端口、SSH 配置里密码认证和公钥认证都没禁错,再检查 hosts.deny 和 fail2ban 有没有把来源 IP 拉黑。都排查完还不行,多半是网络层面的问题,可以再对照 SSH 连接失败的排查思路往下查。
