一、VPS怎么连接:先分清你连的是哪种协议

搜索「VPS怎么连接」的人,脑子里往往只有一个画面:打开一个终端,敲一行命令,连上了。但「VPS 连接」至少包含四种完全不同的操作,搞混了就会一直在错误的方向上排查。
先对着下面这张表确认你要做的是哪一种:
| 你要做的事 | 用什么协议 | 典型场景 |
|---|---|---|
| 敲命令、改配置 | SSH | 建站、运维、部署,最常用 |
| 传文件 | SFTP / SCP | 上传网站代码、下载备份 |
| 图形界面操作 | RDP | Windows 系统,远程桌面 |
| 访问内网服务 | 隧道转发 | 数据库在本地、程序在云上 |
四种里面,SSH 是绝对主力,所以本文九成篇幅在讲它。但如果你是 Windows 系统并且需要图形界面,那 RDP 的部分请直接看第五节——那一节的机制和 SSH 完全不同,命令不能混用。
还有一件事必须在连接之前确认:你手上到底有没有正确的连接信息。 大部分「连不上」不是网络问题,而是这三个信息错了:
1. IP 地址抄错了——尤其是手动输入的时候;
2. SSH 端口不是默认的 22——不少商家会用自定义端口;
3. IP 已经变了——重装系统、迁移机房、商家调整路由之后,IP 会变。
# 核对 IP:ping 通不代表 SSH 端口通,两件事要分开验
ping -c 4 你的服务器IP
# 单独验 SSH 端口,这是判断「机器活着没」最准的一步
nc -zv 你的服务器IP 22
# 端口不通时看详细握手过程
telnet 你的服务器IP 22
上面这三条命令的结果对应三种完全不同的结论:
- ping 通、端口也通——网络和机器都正常,问题在认证阶段(密码错、密钥不对、用户不对);
- ping 不通但端口通——机器活着,只是 ICMP 被禁了,这很正常,不是故障,继续往认证阶段查;
- 端口不通——机器没起来、IP 错了、端口记错了,或者被防火墙拦了。
这一步分清楚,能省掉后面很多无用功。 最常见的错误是看到 ping 不通就直接断定「机器坏了」,而实际上商家禁 ping 是常规操作。
但如果你要的是一台具体配置的机器,光看「能不能连上」还不够——还得知道连上之后拿到的是什么。 渠道库在售机型的配置跨度很大,从 1 GB 内存到 256 GB 都有:
| 机型 | 折合月价 | 内存 | 硬盘 | 月流量 | 每 GB 内存/月 |
|---|---|---|---|---|---|
| RosCloud-01 | 19.99 美元 | 1 GB | 20 GB | 1024 GB | 19.99 美元 |
| RosCloud-02 | 29.99 美元 | 2 GB | 40 GB | 2048 GB | 15.00 美元 |
| RosCloud-03 | 39.99 美元 | 4 GB | 80 GB | 3072 GB | 10.00 美元 |
| RosCloud-04 | 49.99 美元 | 8 GB | 160 GB | 4096 GB | 6.25 美元 |
| RosCloud-05 | 59.99 美元 | 16 GB | 240 GB | 5120 GB | 3.75 美元 |
| LAX-STARTER | 16.67 美元 | 2 GB | 40 GB | 5000 GB | 8.33 美元 |
| LAX-MICRO | 33.33 美元 | 4 GB | 80 GB | 10000 GB | 8.33 美元 |
| LAX-MEDIUM | 66.67 美元 | 8 GB | 160 GB | 20000 GB | 8.33 美元 |
| 云途 HK.DS.S | 800 元 | 128 GB | 6000 GB | 40000 GB | 6.25 元 |
| 云途 DS.ES.B | 1500 元 | 256 GB | 1920 GB | 30000 GB | 5.86 元 |
这张表的意义在于:连接方式本身和配置高低没有关系,但你连上之后能做什么,完全取决于配置。 一台 1 GB 内存的机器适合跑静态页和跳板机,一台 128 GB 内存的机器可以跑一整套容器编排。连接成功只说明链路通了,说明不了这台机器配不配得上你的业务。
关于这张表还有一条实用结论:内存单价随容量递减。 从 RosCloud-01 的 19.99 美元/GB/月到 LAX-MEDIUM 的 8.33 美元/GB/月,差距超过一倍。所以「先买一台小机器试试,不够再升」这个策略,在单价上是划算的——但前提是小机器本身不是超售到无法使用的配置。
具体配置以商家官网当日报价为准。
二、SSH 远程连接:命令、参数和三个最常见报错

SSH 的机制很简单:客户端用私钥对会话做加密协商,服务器用公钥验证你。 理解这一点,后面所有的报错都能对上号。
最基本的连接命令:
ssh root@你的服务器IP
加上端口和指定用户:
ssh -p 端口号 用户名@你的服务器IP
加上私钥路径:
ssh -i /path/to/id_rsa root@你的服务器IP
指定端口、指定密钥、指定跳板机,这是最完整的生产环境写法:
ssh -i ~/.ssh/id_vps -p 2222 -J user@跳板机:22 root@目标服务器IP
-J 参数(跳板机)在两个场景下非常有用: 一是目标机器的 SSH 端口只对内网开放;二是你需要通过一台固定机器中转,避免自己的 IP 直接暴露在目标服务器的日志里。
接下来是三个最常见的报错,每一个都要知道根因:
报错一:ssh: connect to host xxx port 22: Connection timed out
机制:你的数据包发出去了,但没有收到任何回应。 这说明连接请求被丢在半路——可能是机器没启动、IP 写错、端口不对,也可能是中间网络把流量挡了。
# 第一步:确认端口通不通,这是分水岭
nc -zv 你的服务器IP 22
# 第二步:端口通的话,看握手到了哪一步
ssh -vvv root@你的服务器IP
-vvv 是排查 SSH 的终极工具,它会把每一步都打出来。看输出停在哪一行,就知道卡在哪: 停在 Connecting to 之后是网络问题;停在 Connection established 之后是认证问题。
报错二:Permission denied (publickey,password)
机制:网络通了、身份验证阶段被拒。 三个可能的原因,挨个排除:
# 原因一:用户名不对。Linux VPS 常见用户是 root、ubuntu、debian、centos,
# 商家如果不是 root,就用你创建时指定的账号
ssh ubuntu@你的服务器IP
# 原因二:密码错了。这是大小写和输入法的问题,
# 复制粘贴时经常带上空格或切换成中文标点
# 原因三:私钥没被服务端接受,检查本地密钥的权限
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
报错三:Host key verification failed
机制:服务器的 SSH 主机密钥和本地记录的不一致。 通常是两种情况:换机器了,或者本地存的是旧的记录。
# 删除旧记录后重新连接
ssh-keygen -R 你的服务器IP
ssh root@你的服务器IP
如果你是重装系统后遇到这个报错,要意识到一件事:重装会生成新的主机密钥,而本地记录的还是旧的。 确认 IP 确实没变、确实是你自己在重装,删掉记录是安全的;如果 IP 变了却没察觉,删记录会掩盖一个更严重的问题——你可能连到了别人的机器上。
关于 SSH 端口的一句提醒:改端口是有效的安全措施,但它挡住的只是自动扫描。 真正的防线是密钥登录加禁用密码登录,端口只是减少日志噪音。该做的三件事都要做。
三、密钥登录配置:把密码换成密钥的正确步骤

上一节说了密码登录的各种麻烦,这一节给出密钥登录的完整流程。顺序是关键,顺序错了会把自己锁在门外。
第一步:在本地生成密钥对。
# 生成 RSA 密钥,兼容性最好
ssh-keygen -t rsa -b 4096 -C "vps-服务器IP"
# 或者生成 ed25519,密钥更短、更安全、连接更快
ssh-keygen -t ed25519 -C "vps-服务器IP"
生成过程中会问三个问题,答案分别是:
- 保存路径:回车用默认就行(~/.ssh/id_rsa);
- passphrase:建议设置。设了之后每次用私钥要输一次密码,但私钥文件即使泄露,没有 passphrase 也用不了;
- 确认 passphrase:再输一遍。
第二步:把公钥传到服务器。这一步需要输入一次服务器密码。
# Linux 和 macOS 自带
ssh-copy-id -i ~/.ssh/id_rsa.pub root@你的服务器IP
# Windows 如果没有 ssh-copy-id,用这一条,功能等价
type %USERPROFILE%\.ssh\id_rsa.pub | ssh root@你的服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
第三步:验证密钥登录生效了。这一步必须做,不能跳。
ssh root@你的服务器IP
# 如果这次没要求输入服务器密码就进去了,说明成功
第四步:确认成功之后,才关掉密码登录。
# 编辑前先备份一份,出问题能快速回滚
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 先检查配置文件语法,这一步能避免重启后连不上
sshd -t
# 改配置
sed -i 's/#PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
# 重启服务
systemctl restart sshd
第五步:开一个全新的终端窗口测试。
这一步是整段操作里最关键的一步,也是最常被跳过的一步。 在你确认新窗口能登录成功之前,不要关掉原来那个窗口。如果配置写错了,原窗口是你唯一的救生通道——关掉它之前,先在新窗口里登录一次。
# 验证密码登录确实关掉了
sshd -T | grep -E "passwordauthentication|permitrootlogin"
# 期望看到 passwordauthentication no
第六步:配置 SSH 别名,从此一条命令搞定。
cat >> ~/.ssh/config << 'EOF'
Host myvps
HostName 你的服务器IP
User root
Port 22
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 60
ServerAliveCountMax 3
ServerAliveCountMax 3
EOF
# 之后直接
ssh myvps
最后那两行 ServerAliveInterval 值得解释。 它让客户端每隔 60 秒发一个心跳包,防止中间的 NAT 或防火墙因为长时间无流量而掐断连接。没有它的话,典型症状是「跑着一个长任务,屏幕不动了,过一会儿任务莫名中断」。改端口、改密钥都不能解决这个问题,只有这两行能。
四、文件传输:传文件不用再开第三方软件

连上之后马上要做的就是传文件。很多人还在用各种第三方工具,其实 SSH 协议本身就带文件传输能力,而且更可靠。
最常用的三条命令:
# scp 传单个文件
scp 本地文件.txt root@你的服务器IP:/var/www/
# scp 传整个目录,必须加 -r
scp -r 本地目录 root@你的服务器IP:/var/www/
# 从服务器下载
scp root@你的服务器IP:/var/www/远程文件.zip 本地目录/
注意 scp 传目录时那个 -r 千万别漏,漏了会报 omitting directory 之类的错误。
更推荐的是 sftp,因为它支持断点续传和目录同步。
# 交互式 sftp
sftp root@你的服务器IP
# 进入后用这些命令:
# put 本地文件 /远程路径/
# get /远程文件 本地路径
# ls / cd / lcd / pwd
# bye 退出
要在两台机器之间传文件,用 rsync,它是最可靠的:
# 同步目录,带删除和压缩
rsync -avz --delete --exclude='*.log' /本地目录/ root@远程IP:/远程目录/
# 第一次同步前先看会动什么,这一步不能省
rsync -avz --delete --dry-run /本地目录/ root@远程IP:/远程目录/
--delete 是这一节最需要小心的地方。 它的含义是「删除目标端有、源端没有的文件」,方向写反就会清空远端目录。所以永远先加 --dry-run 看清列表,再去掉它执行。
如果两台机器都有 SSH,也可以不下载文件直接中转:
scp -3 本地文件 root@机器A:/目标路径
Windows 用户还有一个选择:Windows 10 和 11 自带 OpenSSH 客户端,可以在 PowerShell 里直接用 ssh 和 scp,不需要装第三方软件。如果提示找不到 ssh 命令,去「设置 → 应用 → 可选功能」里把 OpenSSH 客户端装上即可。
传输大文件时的两个实用技巧:
# 断点续传,中断了重跑同一条命令就能接着传
rsync -avz --partial --progress /大文件 root@远程IP:/目标路径/
# 传之前先压缩,Linux 之间传用 tar 效果最好
tar czf - /本地目录 | ssh root@远程IP "tar xzf - -C /目标目录"
上面这行命令的原理是:本地打包压缩,通过 SSH 管道送到远端再解开。 传一万个小文件时,它比 scp -r 快好几倍,因为避免了成千上万次的网络往返。
传完之后校验一下是最稳的习惯:
# 在两端各算一次文件数量和总大小,对不上就说明传漏了
find /本地目录 -type f | wc -l
ssh root@远程IP "find /目标目录 -type f | wc -l"
# 校验和对比,这是最可靠的方式
md5sum /本地目录/重要文件.zip
ssh root@远程IP "md5sum /目标目录/重要文件.zip"
两边输出的校验和一致,才算传对了。 这一步在传安装包、数据库导出文件时尤其必要——一个传了一半的压缩包,解压时才会报错,而那时候你可能已经覆盖了线上文件。
五、Windows VPS 怎么连接:远程桌面 RDP 的完整流程

如果你用的是 Windows 系统的 VPS,SSH 依然能连上(用于命令行),但要看到图形界面需要用 RDP(远程桌面)。 这是完全不同的另一套机制。
连接前的准备:
第一步:确认系统里开启了远程桌面。 这一步在商家交付时通常已经做好,但值得确认:
# 在 Windows PowerShell 里检查远程桌面是否开启
Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" | Select-Object fDenyTSConnections
# 输出 0 表示已开启,1 表示未开启
第二步:确认防火墙放行了 3389 端口。
# 查看 RDP 规则是否启用
Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Select-Object DisplayName, Enabled
第三步:确认 RDP 服务在运行。
Get-Service TermService | Select-Object Name, Status, StartType
# StartType 要是 Automatic
第四步:拿到 IP、用户名、密码。 Windows VPS 的初始密码通常由商家以邮件或控制台形式给出,用户名常见的是 Administrator,但也可能是你购买时指定的账号。
在本地连接 RDP:
- Windows 系统:按 Win + R,输入 mstsc,回车,在对话框里填 IP;
- Mac 系统:应用商店下载 Microsoft Remote Desktop;
- 手机:装 Microsoft Remote Desktop 或 RD Client。
连接后可能遇到的三个问题:
问题一:提示「你的凭据不工作」。
根因是用户名不对。 Windows 的用户名经常需要写成 .\Administrator 或 计算机名\Administrator,只写 Administrator 在某些商家提供的镜像上会失败。
问题二:连接后黑屏或直接断开。
根因通常是显卡驱动或分辨率设置问题。 在连接对话框点「选项 → 显示」,把分辨率调低一些再试。
问题三:连接很卡、鼠标一顿一顿。
这说明远程桌面走的是公网,延迟直接体现在操作体验上。 解决办法是在 RDP 连接前把画质降下来:
- 显示设置里把颜色改成 16 位;
- 关掉「允许桌面组合」和字体平滑;
- 传输类型选「低画质」。
如果你的 Windows VPS 需要频繁图形操作,一个更好的方案是装 RDP 客户端 + 修改注册表启用 UDP 传输,这需要管理员权限改一个注册表值:
# 用管理员权限的 PowerShell 执行,启用 UDP 传输降低延迟
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'UserAuthentication' -Value 1
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'MinEncryptionLevel' -Value 2
Restart-Service -Name TermService -Force
最后提醒一句:如果你的业务是 Web 服务,用 Windows VPS 并不是好选择。 同等预算下 Linux 的资源占用明显更低,而 Windows 的授权成本通常不包含在 VPS 标价里。 只有当你确实需要 Windows 专有软件时才值得付这个差价。
六、数据库和内网服务:连接不上时怎么排查

前面五节讲的是连机器本身,这一节讲连机器上的服务——数据库、Redis、以及跑在防火墙后面的内部程序。这是「SSH 能连上但服务连不上」类问题的排查方法。
先建立一个通用的排查顺序:
# 第一步:服务本身在跑吗
systemctl status mysql
systemctl status redis-server
# 第二步:端口在监听吗
ss -tulnp | grep 3306
ss -tulnp | grep 6379
# 第三步:从服务器本机连,能连上说明服务本身没问题
mysql -h 127.0.0.1 -u root -p
redis-cli -h 127.0.0.1 ping
这三步能把问题分成三类:
- 服务没跑——去启动它,看日志找原因;
- 服务跑了但端口没监听——检查配置文件里的监听地址和端口;
- 服务跑了、端口也监听、本机能连——那问题在防火墙或安全组。
第四步:检查防火墙。
# ufw 防火墙
ufw status numbered
# firewalld
firewall-cmd --list-ports
# 云服务商的安全组也要放行,这是最常被忽略的一层
第五步:检查数据库的监听地址。 这一条是数据库连不上的头号原因。
# MySQL / MariaDB 默认只监听本地,如果你的业务需要远程连,必须改
grep -rn "bind-address" /etc/mysql/ /etc/mysql/mariadb.conf.d/
但要先想清楚一件事:真的需要让数据库暴露在公网吗? 绝大多数情况下不需要,而且非常危险。 正确的做法是用 SSH 隧道——安全、免费、还不用改数据库配置:
# 在本地建立隧道,把远程的 3306 映射到本地的 3307
ssh -N -L 3307:127.0.0.1:3306 root@你的服务器IP
# 之后本地程序连 localhost:3307 就行,实际走的是 SSH 加密通道
# Redis 同理
ssh -N -L 6380:127.0.0.1:6379 root@你的服务器IP
# 网页后端要访问内网服务,做本地端口转发
ssh -N -L 8080:127.0.0.1:3000 root@你的服务器IP
-N 参数表示只做转发不执行命令,-L 是本地转发。 这一个命令能解决「数据库在云上、程序在本地」这类需求,而且不需要在数据库上做任何开放公网的改动。
如果确实需要远程直连数据库,有两条必须做的事:
# 一是改监听地址为 0.0.0.0
# 二是在数据库里限制允许的来源 IP,不要用 % 通配
-- 创建只允许特定 IP 的账号,这是正确做法
CREATE USER 'app'@'203.0.113.10' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON 数据库名.* TO 'app'@'203.0.113.10';
FLUSH PRIVILEGES;
注意这里的 'app'@'203.0.113.10'——限定来源 IP,而不是 'app'@'%'。 后者意味着任何人都能尝试连接你的数据库,只靠密码防护。
还有第三个选项,也是最安全的:把数据库和应用程序放在同一台机器上,用 Unix socket 连接。
# MySQL 通过 socket 连接,不经过网络,也不需要开放端口
mysql -u root -p
# 配置文件里指定 socket 路径
# socket=/var/run/mysqld/mysqld.sock
这个方案的优点是数据库端口根本不监听 TCP,攻击面直接归零。 只有当应用和数据库必须分开部署时,才需要用上面的方式远程连接。
如果应用和数据库分开部署,SSH 隧道还有一种更隐蔽的用法——反向隧道,适合服务端主动连本地的情况:
# 在本地执行:让远程服务器能连回本地的服务
ssh -N -R 8080:localhost:3000 root@你的服务器IP
正向转发(-L)和反向转发(-R)的区别,一句话讲清:
| 参数 | 方向 | 典型场景 |
|---|---|---|
-L |
本地端口 → 远程服务 | 本地程序访问远程的数据库 |
-R |
远程端口 → 本地服务 | 远程服务器回调本地服务 |
最后提醒一句关于明文端口的风险:数据库端口直接暴露在公网上,每天都在被自动化扫描。 哪怕你设了强密码、限制了来源 IP,多一层 SSH 隧道就少一个暴露面,而且不需要额外成本。
七、连接不稳定:断连、卡顿、超时的排查

「能连上,但老是断」是另一类问题,根因通常不在 SSH 本身,而在网络路径或服务端资源。
先分清是「你这边断」还是「服务器那边断」。
# 服务器端看有没有人踢你下线
grep -i "disconnect\|session closed\|timeout" /var/log/auth.log | tail -20
如果日志里有大量 Disconnected from user,说明连接是被正常关闭的,常见原因是空闲超时——有些商家会在没有数据传输一段时间后主动断开。
解决空闲断连的办法就是前面提到的两行配置:
# 在本地 ~/.ssh/config 里加
# ServerAliveInterval 60
# ServerAliveCountMax 3
如果日志里是 Maximum authentication attempts exceeded 或 Connection reset by peer,那是被防火墙或 fail2ban 拦了。
# 查自己有没有被 fail2ban 封了
sudo fail2ban-client status sshd
# 解封
sudo fail2ban-client set sshd unbanip 你的IP
如果是连接卡顿、鼠标一顿一顿(Windows RDP 尤其明显),先测一下基础网络质量:
# 丢包率和延迟
ping -c 20 你的服务器IP
# 逐跳路径,看有没有某一跳特别慢
mtr -r -c 20 你的服务器IP
mtr 的输出要这样看:中间某一跳延迟高但后续跳恢复正常,通常只是那一跳的 ICMP 限速,不代表你的实际路径有问题;真正的信号是延迟在某一跳之后持续升高且不回落。
还有一个常见的原因是服务器资源耗尽导致 SSH 无响应。
# 内存是不是满了,满了会导致 sshd 无法 fork 新进程
free -h
# 磁盘是不是满了
df -h
# 进程数是不是爆了
ps -e --no-headers | wc -l
# 系统负载
uptime
进程数爆掉是 VPS 上很典型的一种故障,尤其是被挖矿程序或者失控的循环任务占满的时候。这时候的表现就是「网络明明通,但 SSH 完全没反应」。
最后是长任务的稳定性问题。 跑几个小时的编译、备份、迁移任务,断连就白跑了。两个办法:
# 方法一:用 tmux 或 screen,断了重连能恢复现场
apt install -y tmux
tmux new -s work
# 断线后重连,然后
tmux attach -t work
# 方法二:用 nohup 放到后台跑,输出重定向到日志
nohup your-command > /var/log/task.log 2>&1 &
# 之后用 tail 看进度
tail -f /var/log/task.log
tmux 的好处是能交互——你可以在里面停进程、改参数、重新跑。 对于需要观察和干预的长时间任务,它比 nohup 好用得多。
八、常见报错速查与对应处理

前面七节的内容浓缩成一张速查表。遇到报错先在这里定位,找到对应的行直接照做。
| 报错原文 | 根因 | 处理 |
|---|---|---|
Connection timed out |
机器没起、IP 错、端口错、网络不通 | nc -zv IP 端口 验证端口;核对 IP 和端口 |
Connection refused |
端口上没有服务在听 | ss -tlnp 查监听;sshd 状态;重装后可能没启动 |
Permission denied (publickey,password) |
用户名或密码错、私钥没被接受 | 换用户名试;检查密钥权限 600;用 -vvv 看细节 |
Host key verification failed |
主机密钥变了,本地记录过期 | ssh-keygen -R IP 后重连;确认是重装导致的 |
Too many authentication failures |
本地密钥太多,SSH 试超次数 | ssh -o IdentitiesOnly=yes -i 指定密钥 |
Connection reset by peer |
被防火墙、fail2ban 或服务端主动断 | 查 fail2ban 状态;查防火墙规则 |
kex_exchange_identification |
服务端 SSH 版本协商失败 | ssh -o "KexAlgorithms=+diffie-hellman-group14-sha1" 试 |
Error: No matching host key type found |
老旧客户端不支持新的密钥算法 | 更新客户端;或服务端指定 HostKeyAlgorithms |
bind: Address already in use |
本地转发端口被占用 | 换一个本地端口号 |
channel open failed: administratively prohibited |
服务器禁止了端口转发 | 改用其他方式;或检查 sshd_config 的 AllowTcpForwarding |
The requested operation requires elevation |
Windows RDP 权限不足 | 用 Administrator 账号;确认远程桌面已开启 |
你的凭据不工作 |
Windows 用户名或密码不对 | 用 .\Administrator 或 计算机名\Administrator |
这张表里有一条特别值得单独提:Too many authentication failures。 它的机制是:SSH 客户端会按顺序把本地所有密钥都试一遍,如果密钥超过 5 个还没成功,就直接断开。 解决办法是明确指定用哪个密钥:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_vps root@你的服务器IP
IdentitiesOnly=yes 这个参数的作用是「只用我指定的这个密钥,不要试其他的」,在本地密钥多或者有 agent 缓存多个密钥的环境里特别有用。
还有一个必须理解的机制:SSH 的认证方式是有优先级的。 当你同时有密钥和密码时,客户端会先试公钥认证,失败后才尝试密码认证。这解释了一个常见现象:明明设了密码却提示 Permission denied (publickey)——因为服务器端已经关闭了密码认证(PasswordAuthentication no),而你的密钥又没配对,所以两个方式都失败了。
用 -vvv 看认证过程,能看清到底是哪一步失败的:
ssh -vvv root@你的服务器IP
输出里重点看这几行:
- Offering public key: ...——客户端在提供公钥,如果这行之后紧接着 Server accepts key,说明密钥被接受了;
- Authentications that can continue: publickey——说明服务端只接受公钥,密码这条路已经关了;
- identity file ... type ...——确认用的是哪个密钥文件,路径错了或者 passphrase 没输对都会在这里暴露。
关于 passphrase 的一个实际建议:给私钥设 passphrase,但用 ssh-agent 缓存,避免每次都输。
# 添加私钥到 agent,输一次 passphrase 就行
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
# 确认 agent 里有哪些密钥
ssh-add -l
# 如果本机没有 agent 的自启配置,写进 ~/.bashrc
echo 'eval "$(ssh-agent -s)"' >> ~/.bashrc
echo 'ssh-add ~/.ssh/id_rsa' >> ~/.bashrc
这样做的结果是:私钥文件本身是加密的(拿到文件也没用),但你日常使用又不用反复输密码。
还有一条容易被忽略的:连接之前先做一次端口探测,能省掉大量猜测。
# 一条命令判断「机器活着吗」
nc -zv 你的服务器IP 端口号
这个命令返回成功,说明网络和机器都活着,问题一定在认证或配置;返回超时或拒绝,说明问题在更前面一层。 这是最高效的第一步。
九、连上之后:检查一下这台机器是不是你想要的

连上之后还有一个动作值得做:花两分钟确认这台机器的实际状态和你的预期一致。 这不是多疑,而是因为超售、配置不符、IP 归属错误这些问题,都会在连上之后立刻暴露出来。
确认硬件配置:
# 内存与 CPU
free -h && nproc && lscpu | grep "Model name"
# 磁盘与挂载
lsblk -f && df -h
# 内核与架构
uname -a
确认网络资源:
# 公网 IP 是不是你以为的那个
curl -s https://api.ipify.org; echo
# 实际的网卡和 MTU
ip addr show && ip link | grep mtu
确认 IP 归属:这一项在业务涉及海外访问时特别重要。
# 查这个 IP 归属哪个组织、哪个地区
curl -s http://ip-api.com/json/你的服务器IP
查出来的国家/地区和机房位置对不上,就要警惕了。 比如你买的是「原生 IP 机型」,但查出来是某个数据中心段而不是住宅段,说明标注和实际不符。渠道库里的 sixtynet 就把住宅 IP 作为核心卖点明确标注,这类属性是可以也应该核对的。
确认反向解析:
# 查这个 IP 的反向 DNS 记录
dig -x 你的服务器IP +short
# 或者
nslookup 你的服务器IP
很多邮件服务会检查 RDNS 与 IP 归属是否一致,不一致时轻则进垃圾箱,重则直接拒收。如果你要用这台机器发邮件或者对接第三方 API,这一条必须提前确认。
确认服务状态和系统时间:
# 时间不对会让日志、证书、定时任务全乱
timedatectl status
# 有没有异常的开机自启服务
systemctl list-unit-files --state=enabled | head -30
# 有没有挖矿程序之类的可疑进程
ps aux --sort=-%cpu | head -15
最后把上面这些确认结果记下来。 这些数字后面还用得上——换机、迁移、或者跟商家沟通的时候,「这台机器的内存谷值是 X、随机写是 Y、IP 归属是 Z」这种具体记录,比「感觉还行」有用得多。
按你的情况,下一步该看哪家
上面讲的是判断标准,但多数人最后还是想问一句「那我该买谁」。按你的实际情况对照下面几条,直接去看对应的机型页比继续比价更快:
- 主要访客在国内、在意打开速度:先确认回程线路,再谈配置。看 iwebfusion 当前机型与价格
- 只是开发测试、临时用:按小时或月付,用完就删,别买年付。看 racknerd 当前机型与价格
价格与库存以商家页面当日显示为准,下单前建议先确认退款窗口与是否支持按月付费。
十、服务端配置:你的连接体验是被这几行决定的

前面九节讲的都是客户端怎么连。但连接顺不顺,有一大半是由服务器上的 SSH 配置决定的——这一节把这些配置项讲清楚,也讲清每项改动的影响和风险。
先看当前生效的配置:
# 查看实际生效的配置,而不是配置文件里的注释
sshd -T | grep -E "^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries|clientaliveinterval|allowtcpforwarding)"
# 查配置文件位置
grep -E "^\s*Port|^\s*Include" /etc/ssh/sshd_config
几个关键配置项,逐个说明:
ClientAliveInterval 和 ClientAliveCountMax——这两个控制服务端多久发一次心跳。 默认值往往是 0,也就是永不发送,结果就是连接会被中间的 NAT 设备静默掐断。 设成 60 和 3 的意思是:每 60 秒发一次心跳,连续 3 次没回应就断开。
# 让服务端主动保活
echo "ClientAliveInterval 60" >> /etc/ssh/sshd_config
echo "ClientAliveCountMax 3" >> /etc/ssh/sshd_config
systemctl restart sshd
MaxAuthTries——限制尝试认证的次数,默认是 6。 把它调小到 3 能让暴力破解更慢,但要注意它的副作用:如果你本地有很多密钥,客户端会依次尝试,可能在你还没轮到正确密钥时就被服务端踢下线。 遇到 Too many authentication failures 时,除了用 -o IdentitiesOnly=yes 指定密钥,也可以适度调高这个值。
AllowTcpForwarding——控制是否允许端口转发。 默认是 yes,如果你禁止它,第二节讲的 SSH 隧道就完全用不了(会报 administratively prohibited)。对于不需要隧道的机器,关掉它能缩小攻击面。
PermitRootLogin 的三个取值,含义完全不同:
| 取值 | 含义 | 适用场景 |
|---|---|---|
yes |
允许 root 用密码登录 | 不推荐 |
prohibit-password |
允许 root 登录,但只能密钥 | 推荐 |
no |
完全禁止 root 登录 | 配了普通用户时最安全 |
prohibit-password 是绝大多数情况下的正确答案——root 仍然能用密钥登录,但密码爆破这条路被堵死了。
修改 sshd_config 的安全做法,固定四步:
# 第一步:备份
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 第二步:改完之后先检查语法,这一步能避免重启后完全连不上
sshd -t
# 第三步:只有语法检查通过才重启
systemctl restart sshd
# 第四步:另开一个终端验证能连上,再关掉原来那个
第二步是最容易被跳过、也最致命的一步。 sshd -t 会检查语法错误,如果你改出了语法错误又直接重启,sshd 起不来,你就彻底失去这台机器的访问权了——这种情况只能通过商家的 VNC 控制台救援。
还有一个更保险的做法:改完不重启,而是让新配置在下次重启时生效,同时用一条命令热加载。 不过要注意,热加载的方式在部分发行版上行为不一致,最稳妥的还是先 sshd -t 通过再 systemctl reload sshd(而不是 restart),因为 reload 不会杀掉已有的会话。
最后提醒一件容易被忽略的事:VPS 上的 SSH 服务和独立服务器不完全一样。 商家通常会预装一些安全策略,包括可能的端口改写、IP 限制、或者基于 IP 的黑白名单。这些策略你在机器内部看不到,只能问商家或者从连接日志里反推。 所以前面说的「另开终端验证」这一套流程,在 VPS 上比在普通服务器上更有必要。
最后是几个新手最容易踩的坑,一次性说清楚:
坑一:把公网 IP 和内网 IP 搞混。 商家交付邮件里可能同时给这两个地址,连内网地址在自己电脑上当然连不上,因为那是给机器内部用的。
坑二:以为 SSH 能用来传网站流量。 SSH 转发是给开发调试用的,拿它跑生产流量会有明显的性能损耗,而且不稳定的连接会让页面加载断断续续。
坑三:同时开着三个终端改同一份配置。 改到一半互相覆盖,最后不知道生效的是哪一版。改配置时只留一个窗口在改,其他窗口留着应急。
坑四:用 root 跑所有日常操作。 root 权限太大,一条手滑的 rm -rf 就没有回头路。日常操作用普通用户,只有确实需要时才 sudo。
坑五:把密码记在和 SSH 私钥同一个地方。 私钥本来的作用就是让你不用记密码,把两者放在一起等于白做。
关于价格的说明:本文涉及的配置参数与价格,来自渠道库在售机型快照(时间 2026-11-06 13:28),用于说明不同场景的连接需求;实际价格、库存与线路以商家官网当日报价为准。

喜欢
高兴
鬼脸
呵呵
无聊
伤心