阿里云 SSH 连不上,多数情况下是连接还没走到认证那一步,服务器本身未必有问题。动手改密码或重装系统之前,先看下面三件事。

- 实例是否在运行。进 ECS 控制台看状态是不是“运行中”,同时记下公网 IP 或弹性公网 IP。IP 如果在停机重启后变了,之前保存的地址就会失效。
- 安全组是否放行 22 端口。入方向规则要允许你当前的出口 IP 访问 TCP 22。有人图省事直接写 0.0.0.0/0,这样确实能连上,但等于把端口开给全网,后面扫描器的日志会多得很快。
- 用的是哪种登录方式。是密钥对、创建实例时设的密码,还是控制台的 Workbench 远程连接。三种方式的排查路径不一样,先分清楚能省不少时间。
用密钥对登录
阿里云默认推荐密钥对登录。私钥留在你自己的电脑上,服务器只存公钥。即使有人拿到了服务器上的文件,没有私钥也登不进去。
有个做在线教育的小团队就踩过这个坑。ECS 上线第一周,auth 日志里就堆了几百条失败记录,原因是允许密码登录,而且 root 密码设得太简单。改成密钥登录之后,这类记录就没再出现。
在 Mac 或 Linux 终端里,连接步骤大致是这样:
- 先收紧私钥权限,执行 chmod 400 aliyun_key.pem。权限太宽时,SSH 会直接拒绝使用这把钥匙,报错信息也不太直观,很多人会以为是密钥坏了。
- 再执行 ssh -i aliyun_key.pem root@你的公网IP。用户名要和镜像对应:Ubuntu 一般是 ubuntu,阿里云 Linux 镜像常见的是 root 或 ecs-user,具体以实例的镜像说明为准,别凭印象填。
Windows 用户可以用系统自带的 OpenSSH 客户端,也可以用 PuTTY 或 Xshell。用 PuTTY 时要先用 PuTTYgen 把 .pem 转成 .ppk,否则它不认。
加固 sshd 配置
登录进去之后,建议马上改 sshd 的配置文件,路径是 /etc/ssh/sshd_config。下面三项是最常见的调整。
- 关闭密码登录:把 PasswordAuthentication 设为 no,只留密钥认证。这一项收益最大,改完基本就挡住了大部分密码暴力破解。
- 限制 root 直接登录:把 PermitRootLogin 设为 prohibit-password 或 no,平时用普通用户登录,需要高权限时再用 sudo。这样一旦有异常操作,日志里能看出是谁执行的。
- 修改默认端口:把 Port 改成别的端口,比如 22022。它不能代替真正的访问控制,但能明显减少自动化扫描留下的噪音,日志也更好看。
改完配置,先执行 sshd -t 检查语法,没有输出就说明没问题。然后用 systemctl restart sshd 重启服务。Ubuntu 上的服务名是 ssh,执行的时候注意区分。
这里有一条要守住:改配置时别关掉当前会话。先另开一个终端,用新配置测试登录,确认能进去再关旧的那个。否则配置写错了,你就被挡在服务器外面,只能去控制台的 Workbench 进去回滚,或者重置实例,麻烦得多。
如果改了端口,记得在安全组里放行新端口,并删掉原来的 22 端口规则,不然两个口子都开着,等于白改。
用 fail2ban 拦住暴力破解
关掉密码登录以后,公网上的扫描器还是会不停地发起连接。fail2ban 的作用是读取认证日志,发现同一个 IP 短时间内失败太多次,就自动把它封掉一段时间。
前面那个教育团队在关闭密码登录后又装了 fail2ban,规则设为同一 IP 失败 5 次封禁 1 小时。之后一周,auth.log 里的失败记录从每天几千条降到几十条,其中大部分来自已经被封的地址。
安装后重点看三个参数。maxretry 是允许的失败次数,findtime 是统计的时间窗口,bantime 是封禁时长。数值没有标准答案,要看你平时怎么用。如果办公网络出口 IP 比较固定,又设得太严,可能会把自己误封。建议先把封禁时长设短一点,观察几天再调。
常见报错怎么查
Permission denied (publickey)
这个报错多半是私钥和实例绑定的密钥对不一致,或者用户名填错了。先到控制台确认实例绑定的密钥对名称,再核对用户名和镜像是否匹配。两个都对的话,可以加 -v 参数重新连接,看看客户端到底尝试了哪把钥匙。
Connection timed out
超时一般有两种原因:安全组没放行,或者公网 IP 已经变了。先在控制台确认当前 IP,再检查安全组入方向规则。如果规则没问题,还要确认你本地网络有没有拦截 22 端口,公司或学校网络里经常遇到这种情况。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
服务器重装系统或者换了实例,主机指纹就会变,SSH 会报这个警告。如果确定是你自己做的操作,删掉本地 ~/.ssh/known_hosts 里对应那一行就可以。如果不是你做的,先别急着删,要先排查是否有中间人攻击,或者实例被人替换过。
改完配置就登不上了
这种情况只能走控制台的 Workbench 进系统,把 sshd_config 改回去,再重启服务。前面反复提醒要保留旧会话,就是为了避免走到这一步。
上线前对一遍
- 私钥已经备份到安全的地方,不要传到代码仓库或者聊天工具里。
- 安全组只放行必要的 IP 和端口,旧端口规则已经清理。
- 密码登录已经关闭,root 直接登录受到限制。
- fail2ban 或同类工具已经启用,并且真的看过一次封禁日志。
- 定期翻一下 /var/log/auth.log,或者看看阿里云安全中心的告警。
阿里云上的 SSH 本身没什么复杂的地方,连不上的问题大多出在安全组、默认的密码登录,还有改配置时没留备用通道。按这个顺序走一遍,一台新 ECS 通常半小时左右就能把基础加固做完。