亚麻云之EC2——安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查

亚麻云之EC2------安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查

本文作者: 封磊

Eclicktech SA | AWS Community Builder DevTool | 亚马逊云科技云博主

日期: 2026 年 10 月

适用场景: 已经按本系列第 1 篇启动过 EC2、会用 ssh -i 登录,想把 SSH 访问收紧、或者正在排查 SSH 连不上的读者。控制台和 AWS CLI 两种做法都给出。

SSH 连不上 EC2,问题大多出在两处:安全组(端口开没开、对谁开)和密钥对(用户名、私钥、authorized_keys 对不对)。本文讲清安全组怎么工作、SSH 22 端口为什么只对「我的 IP」开,密钥对怎么选、怎么导入、丢了怎么办,最后按报错原文给出排查顺序和速查表。

系列导航:本文是「亚麻云之EC2」系列第 2 篇,全部文章见 导航页(第 0 篇,链接待发布后补)和文末「系列导航」。

写作说明(发布前删除)。发布前必须完成:

  1. 标题已定:CSDN 版用本文标题;公众号版用「SSH 连不上 EC2?Permission denied 和连接超时这样查,私钥丢了也有办法」;

  2. 输出标注(不用再补实测):「示例输出」是按官方文档字段写的示意输出,ID、IP 已打码,数值为示意;「官方文档示例」是官方原文;「本机复现(Amazon Linux 2023 虚拟机,非 EC2)」「本机复现(loop 设备模拟,非 EC2)」是在本机虚拟机或 loop 设备上真跑的输出;「模拟环境测试」指用假 aws、本地脚本检查过命令和分支。本系列没有在 EC2 上实测,发布时保持这些标注;

  3. 按实际控制台核对文中的中文按钮名:安全组、编辑入站规则、我的 IP、添加规则、网络 ACL、路由表、密钥对、导入密钥对、连接、启动时分配的密钥对;

  4. 第 1 篇发布后,给文中「本系列第 1 篇」补链接;导航页(第 0 篇)发布后,补文首和文末「系列导航」的链接;本文先于导航页发布的话,把文首「导航页」改成纯文字;

  5. 删除本段写作说明。

环境与版本

项目 本文使用
Region 亚太地区(东京)ap-northeast-1
实例 沿用第 1 篇的 ec2-lab-01(Amazon Linux 2023 或 Ubuntu Server 24.04 LTS)
VPC 默认 VPC;自建 VPC 的差异在第 4 节和 7.2 说明
密钥对 第 1 篇的 ec2-lab-key(RSA);本文另导入一把 ec2-lab-import
本地 OpenSSH 客户端(macOS/Linux/Windows 10 1809 及以上)
AWS CLI v2,已配置好东京 Region 的凭证(实例上不放 AK/SK 的做法见第 9 篇)
核对日期 2026 年 10 月,规则以文中链接的官方文档为准

Windows 读者 :本文的 CLI 命令用 \ 换行,openssl 也要单独安装,可以在 WSL 里运行(官方指纹文档说 Windows 可以用 WSL);Git Bash 也可以(作者建议)。

目录

    1. 前言
    1. 安全组是怎么工作的
    1. SSH 端口怎么开才安全
    1. 网络 ACL:排查超时才需要看的一层
    1. 密钥对:类型、导入与更换
    1. 私钥丢了怎么办
    1. 故障排查
    1. 清理资源
    1. 参考资料
  • 系列导航

1. 前言

本系列第 1 篇里,我们用启动向导建了安全组,SSH 来源改成「我的 IP」,用 ssh -i ec2-lab-key.pem 登录成功,启动和基本登录这里不再重复。实际用起来问题马上就来:换了网络连不上、同事也要登录、私钥丢了、报错不知道先查哪里。本篇逐个解决。

2. 安全组是怎么工作的

官方的定义是:安全组是 EC2 实例的虚拟防火墙,入站规则控制进入实例的流量,出站规则控制离开实例的流量(Amazon EC2 security groups)。安全组本身不收费。

2.1 五条规则先记住

以下内容来自 Security group rules 和 EC2 安全组文档:

  • 只能放行,不能拒绝:想「拒绝某个 IP」要用网络 ACL(第 4 节);
  • 新建的安全组:没有任何入站规则(所有入站都不通),出站默认放行全部流量;
  • 有状态(stateful):入站请求的响应自动放行,不受出站规则限制,所以 SSH 只需一条入站 22 规则;
  • 多个安全组会合并:一台实例挂多个安全组时,所有规则合在一起判断;
  • 修改自动生效:增删改规则后自动应用到关联的实例,不用重启。CLI 文档的原话是「as quickly as possible. However, a small delay might occur」,可能有很短的延迟。

2.2 改规则不一定会断开已有连接

根据 connection tracking 文档:

  • 规则来源是具体 IP(比如 /32)时,SSH 连接被跟踪(tracked)。把规则删掉或改掉,当前 SSH 会话不会断,只是新连接进不来;
  • 如果入站 22 端口对 0.0.0.0/0(或 ::/0)放行、出站也全放行,这类流量不被跟踪,删掉或改掉规则后已有连接会立刻断开;
  • 网络 ACL 不一样:它无状态,加一条拦截任一方向流量的网络 ACL 规则,已有连接会被断开(同一文档)。

建议 (作者建议):从 0.0.0.0/0 收紧到 /32 时,先加 /32 规则,再删 0.0.0.0/0,然后开一个新终端重新 ssh 一次才算验证。先加再删能否保住当前会话,官方没写。

2.3 默认安全组和向导建的安全组不一样

安全组 默认入站规则
VPC 默认安全组(名称 default) 只放行来自同一安全组内资源的流量,不放行 SSH
启动向导新建的安全组 默认放行 SSH,来源是所有 IP(0.0.0.0/0);第 1 篇 6.1 里选「我的 IP」,就是在改这个默认值

来源:Default security groups、启动参数参考(Firewall)。默认安全组可以改规则,但不能删除。

注意:向导默认对全网开 22 端口,官方说明这只适合短时间的测试实例,要按第 3 节改成「我的 IP」。

注意 :用 CLI(aws ec2 run-instances)启动实例又没指定安全组时,实例会挂上 VPC 的默认安全组。默认规则不放行来自公网的 SSH,所以会超时(除非有人改过默认安全组),这是「控制台能连、脚本启动的连不上」的常见原因。

3. SSH 端口怎么开才安全

3.1 只对「我的 IP」开 22 端口

规则写法(Rules to connect to instances from your computer):

字段 填写
类型 SSH(TCP 22)
来源 你电脑的公网 IPv4,单个地址写成 /32,例如 43.xxx.xx.39/32

控制台路径:EC2 > 安全组 > 选中安全组 > 入站规则 > 编辑入站规则 > 来源选「我的 IP」。控制台会自动填入你当前的公网 IP。

用 CLI 的话,先查自己的公网 IP。AWS 文档里给过它自己的查询服务 checkip.amazonaws.com(ECS 文档):

bash 复制代码
# 查本机公网 IPv4,存进变量
MYIP=$(curl -s https://checkip.amazonaws.com)
# 确认查到的地址
echo "$MYIP"

在同一个终端里接着把这个 IP 加进安全组(sg-xxxxxxxx 换成你的安全组 ID):

bash 复制代码
# 只允许你的公网 IP 访问 22 端口
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxx \
  --protocol tcp \
  --port 22 \
  --cidr "${MYIP}/32"

IP 变了之后旧规则要删掉,把下面的 43.xxx.xx.39 换成你要删的旧 IP:

bash 复制代码
# 删除旧 IP 的 SSH 规则
aws ec2 revoke-security-group-ingress \
  --group-id sg-xxxxxxxx \
  --protocol tcp \
  --port 22 \
  --cidr 43.xxx.xx.39/32

为什么不用 0.0.0.0/0(作者建议):对全网开 22 端口,即使只允许密钥登录,也会持续收到扫描和暴力尝试。「SSH 只对自己开」几乎没有成本。

注意 :家庭宽带和公司网络的出口 IP 可能会变。官方文档提到,没有固定 IP 时要找出所在网络使用的 IP 段填进去(ECS 文档)。经常变的话,更省心的是不开 22 端口,用 Session Manager 登录(第 10 篇)。

3.2 IPv6:两条规则互不覆盖

0.0.0.0/0 只代表所有 IPv4,::/0 才代表所有 IPv6,单个 IPv6 地址写 /128(Security group rules)。

IPv6 SSH 还要求实例有 IPv6 地址、安全组有放行你 IPv6 地址的 22 规则、子网路由表有 ::/0 指向互联网网关,而没改过的默认公有子网只有 IPv4 的互联网路由(EC2 Instance Connect 前提条件),这是「IPv6 连不上」的常见原因。CLI 写法用 --ip-permissions 的 Ipv6Ranges,见 CLI 参考 的 Example 5。

注意 :IPv4 改成了「我的 IP」,却留着 ::/0 的 22 规则,SSH 对全网 IPv6 照样开着,两类规则要一起检查。

3.3 来源填另一个安全组

来源除了填 IP,还可以填另一个安全组的 ID。根据 Security group referencing:

  • 意思是「放行所有挂了那个安全组的实例」,不管 IP 怎么变;走的是它们的私有 IP,不是公网 IP 或弹性 IP;
  • 被引用的安全组要在同一个 VPC 或对等连接的 VPC;入站规则还支持经 Transit Gateway 连接的 VPC。

典型用法是跳板机:跳板机安全组(下文用 sg-yyyyyyyy 表示)对你的 IP 开 22 端口,内网实例的安全组只放行来自它的 22 端口。

bash 复制代码
# 只允许挂了跳板机安全组(sg-yyyyyyyy)的实例 SSH 到本安全组的实例
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxx \
  --protocol tcp \
  --port 22 \
  --source-group sg-yyyyyyyy

3.4 用控制台的 EC2 Instance Connect 时,来源不是你的 IP

在控制台点「连接 > EC2 Instance Connect」时,连接实例的是 EIC 服务,不是你的电脑,所以安全组要放行这个服务的 IP 段。它由托管前缀列表维护,东京的名称是 com.amazonaws.ap-northeast-1.ec2-instance-connect(IPv6 是 com.amazonaws.ap-northeast-1.ipv6.ec2-instance-connect),在入站规则来源里直接选它(EC2 Instance Connect 前提条件)。

其他前提(同一页面):

  • AMI 预装了 EC2 Instance Connect:AL2023 标准 AMI、Amazon Linux 2 2.0.20190618 及以上、Ubuntu 20.04 及以上已预装,AL2023 minimal AMI 要自己装(安装说明);
  • 实例在公有子网里,有公网 IPv4 或 IPv6 地址;
  • 浏览器能访问 prod.ap-northeast-1.oneclickv2-proxy.ec2.aws.dev 的 443 端口,公司网络封了它就连不上;
  • 登录用的 IAM 身份有 EIC 权限,见前提条件页面。

4. 网络 ACL:排查超时才需要看的一层

网络 ACL 作用在子网 上,流量要和安全组两层都通过。默认网络 ACL 入站、出站都全放行(Default network ACL)。但每个网络 ACL 最后都有一条编号为 * 的拒绝规则,所以自己新建的网络 ACL 在加规则之前全部拒绝,自建 VPC 最容易踩坑。

和安全组的区别(Network ACLs):

网络 ACL 安全组
可以放行,也可以拒绝 只能放行
无状态:响应流量要单独放行 有状态:响应自动放行
按规则编号从小到大匹配,命中即停 所有规则合并判断
加了拦截规则,已有连接会断 改规则时已跟踪的连接不断(2.2)

重点 :网络 ACL 无状态,官方排障文档要求它允许来自你本地 IP 的入站 22 端口,同时允许出站到临时端口(1024~65535) ,SSH 的响应才回得来(连接排障文档)。忘了出站,现象就是 Connection timed out。

5. 密钥对:类型、导入与更换

先复习一句原理(EC2 key pairs):EC2 保存公钥,你保存私钥。Linux 实例第一次启动时,启动时指定的公钥会写进默认用户的 ~/.ssh/authorized_keys。EC2 不保留私钥副本,私钥丢了无法找回。

5.1 RSA 还是 ED25519

根据 Create a key pair:

类型 支持情况
RSA Linux 和 Windows 实例都支持;EC2 自己创建的是 2048 位,导入支持 1024/2048/4096 位(走 EC2 Instance Connect API 时只支持 2048/4096)
ED25519 只支持 Linux 实例,Windows 实例不支持
DSA 不接受

官方文档只写明 Windows 实例不支持 ED25519,没有列出哪些 Linux AMI 不支持。作者没有逐一核实老 AMI,遇到很老的系统,用 RSA 最稳。

建议(作者建议):Linux 实例、本地 OpenSSH 较新,优先用 ED25519;要登录 Windows 实例或兼容老系统,用 RSA。

注意 :Amazon Linux 2023 默认禁用了旧的 ssh-rsa 签名算法。用 RSA 密钥登录 AL2023 时,SSH 客户端必须支持 rsa-sha2-256 或 rsa-sha2-512 签名(AL2023 默认 SSH 配置)。老客户端可能因此连不上,见 7.3。

5.2 用自己的密钥:ssh-keygen 生成,导入 EC2

适合给同事开权限:让同事自己生成密钥、只把公钥发给你,私钥不出他的电脑。

第一步,本地生成密钥对。官方文档要求私钥是 PEM 或 PPK 格式,并以 ssh-keygen -m PEM 为例(Create a key pair):

bash 复制代码
# 生成 4096 位 RSA 密钥对,私钥为 PEM 格式
ssh-keygen -t rsa -b 4096 -m PEM -f ~/.ssh/ec2-lab-import.pem -C "ec2-lab-import"

执行后会得到两个文件:私钥 ec2-lab-import.pem 和公钥 ec2-lab-import.pem.pub。

选 ED25519 的话用下面的命令。官方的「PEM 或 PPK」说的是私钥文件 格式,导入时只上传公钥 。ED25519 私钥即使加 -m PEM,文件头也还是 -----BEGIN OPENSSH PRIVATE KEY-----(在 OpenSSH 10.0p2 下测试)。OpenSSH 客户端可以直接用;PuTTY 用户要先用 PuTTYgen 转成 .ppk(见第 1 篇 6.3):

bash 复制代码
# 生成 ED25519 密钥对
ssh-keygen -t ed25519 -f ~/.ssh/ec2-lab-ed25519 -C "ec2-lab-ed25519"

第二步,把公钥 导入 EC2(官方 CLI 示例):

bash 复制代码
# 导入公钥,名称为 ec2-lab-import
aws ec2 import-key-pair \
  --key-name ec2-lab-import \
  --public-key-material fileb://$HOME/.ssh/ec2-lab-import.pem.pub
bash 复制代码
# 确认导入成功
aws ec2 describe-key-pairs --key-names ec2-lab-import

控制台路径:EC2 > 密钥对 > 导入密钥对 ,粘贴公钥内容或选择 .pub 文件。

注意 :密钥对按 Region 隔离,多个 Region 要用同一把密钥,就把公钥分别导入每个 Region (Verify the fingerprint)。

5.3 核对私钥和 EC2 上的密钥对是不是一对

排查「私钥用错了」:用本地私钥算出指纹,和控制台密钥对页面(或 describe-key-pairs)的指纹比对。根据 Verify the fingerprint of your key pair,算法要看密钥是怎么来的:

bash 复制代码
# EC2 创建的 RSA 密钥对(SHA-1)
openssl pkcs8 -in ~/.ssh/ec2-lab-key.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
bash 复制代码
# 导入到 EC2 的 RSA 公钥(MD5),私钥是 PEM 格式(文件头 BEGIN RSA PRIVATE KEY)
openssl rsa -in ~/.ssh/ec2-lab-import.pem -pubout -outform DER | openssl md5 -c
bash 复制代码
# 同上,但私钥是 OpenSSH 格式(文件头 BEGIN OPENSSH PRIVATE KEY)时用这条,openssl rsa 读不了这种文件(路径换成你的私钥)
ssh-keygen -ef ~/.ssh/ec2-lab-import.pem -m PEM | openssl rsa -RSAPublicKey_in -outform DER | openssl md5 -c
bash 复制代码
# ED25519 密钥对,不管是 EC2 创建还是导入的(SHA-256)
ssh-keygen -l -f ~/.ssh/ec2-lab-ed25519

注意 :EC2 算出的指纹末尾可能带 = 填充,ssh-keygen 的可能没有,比对时忽略这个差别。

再确认实例启动时用的是哪把密钥:

bash 复制代码
# 查看实例启动时指定的密钥对名称
aws ec2 describe-instances \
  --instance-ids i-xxxxxxxx \
  --query "Reservations[].Instances[].KeyName" \
  --output text

这个名称是启动时记录的,之后改了 authorized_keys 也不会变。

5.4 给实例加一把公钥、撤销一把公钥

根据 Add or replace a public key,换钥匙要在实例里改 authorized_keys:

  1. 用现有私钥登录实例;
  2. 拿到新公钥的内容。导入的密钥直接看 .pub 文件;EC2 创建的密钥,可以用 ssh-keygen -y -f ec2-lab-key.pem 从私钥导出公钥,或用 aws ec2 describe-key-pairs --key-names ec2-lab-key --include-public-key --query "KeyPairs[].PublicKey" 取(Describe your key pairs);
  3. 把新公钥追加到 ~/.ssh/authorized_keys 末尾(echo "公钥内容" >> ~/.ssh/authorized_keys);
  4. 用新私钥登录测试。官方步骤是先断开再测;作者建议先不要退出当前会话,开一个新终端测试,比官方步骤更稳;
  5. 测试通过后,如果要撤销旧钥匙,再从 authorized_keys 里删掉旧公钥那一行;
  6. 用了启动模板、Auto Scaling 或 EC2 Fleet 的,检查里面指定的密钥对,否则新实例会启动失败(官方第 6 步)。

重点 :在控制台或 CLI 里删除密钥对(delete-key-pair),只删除存在 EC2 里的公钥,不会删除已经写进实例的公钥 。官方文档写明:只要你还有私钥(.pem 文件),仍然可以连接用这个公钥启动的实例,即使它已经从 EC2 删除(Delete your key pair)。私钥泄露、同事离职时,要靠第 5 步改 authorized_keys 才能真正撤销。

注意:官方警告,把实例上的公钥全删光后退出,就再也连不上了,除非你配了别的登录方式。

6. 私钥丢了怎么办

私钥找不回来,但实例通常还能救,思路都是往 authorized_keys 里塞一把新公钥。re:Post 知识中心列出了这几种方法(私钥丢失后如何连接实例),按省事程度排:

方法 适用条件
EC2 Instance Connect AL2 2.0.20190618 及以上或 AL2023,按 3.4 配好;登录后按 5.4 加新公钥
Systems Manager 实例是 Systems Manager 托管节点;AWSSupport-ResetAccess 运行手册自动生成新密钥;它会停止实例 、先建备份 AMI、再起一台临时救援实例,默认 t2.small(第 10 篇)
EC2 串行控制台 支持的 Nitro 实例类型、实例在运行;已开通串行控制台访问,并且事先 在系统里设好带密码的用户(前提条件);不用停机
User Data 停止实例,在用户数据里用 cloud-init 写入新公钥,再启动(User Data 在第 8 篇讲)
救援实例挂盘 停止实例,把根卷挂到另一台实例上改 authorized_keys。挂盘、挂回的完整步骤见第 14 篇第 6 节(那里改的是 fstab,改 authorized_keys 同理)

注意 (来自同一篇 re:Post 和 ResetAccess 运行手册说明):

  • Systems Manager、User Data、救援挂盘这三种方法都要停止实例:停止前先给 EBS 卷做备份(快照在第 7 篇讲),实例存储卷上的数据会丢,自动分配的公网 IP 会变;
  • ResetAccess 建的备份 AMI 不会自动删除,背后的快照会持续计费,用完按第 8 节清理;
  • 用 User Data 方法时,不要把敏感信息写进用户数据;恢复后把用户数据清空。

建议(作者建议):重要实例事先准备一种不依赖私钥的登录方式(EIC 或 Session Manager),私钥放进密码管理器备份。

7. 故障排查

排查方法来自官方 连接排障文档。第 1 篇 7.2、7.3 是入门版,本节是完整排查顺序;私钥权限、PuTTY 和 Host key verification failed 见第 1 篇第 7 节。先看速查表:

报错 / 现象 先查哪里
Permission denied (publickey) 用户名、私钥是不是那一把(7.1)
Connection timed out 公网 IP 是不是新的、安全组里是不是当前 IP(7.2)
no matching host key type found 本地 SSH 客户端版本(7.3)
控制台 EC2 Instance Connect 连不上 安全组是否放行了 EIC 前缀列表、浏览器能否访问 EIC 地址(3.4)

拿不准是哪一类时,加 -vvv 看详细过程:

bash 复制代码
# 打印详细调试信息
ssh -vvv -i ~/.ssh/ec2-lab-key.pem ec2-user@43.xxx.xx.39

只看下面几行关键行。情况一是在 OpenSSH 10.0p2 下对不可达测试地址测的,地址已打码:

text 复制代码
# 情况一:卡在网络层,看 7.2
debug1: Connecting to 43.xxx.xx.39 [43.xxx.xx.39] port 22.
debug1: connect to address 43.xxx.xx.39 port 22: Connection timed out
ssh: connect to host 43.xxx.xx.39 port 22: Connection timed out

情况二是本机复现(Amazon Linux 2023 虚拟机,非 EC2):本地 OpenSSH 10.0p2,故意用一把不匹配的 RSA 私钥连虚拟机的 sshd,虚拟机的 SSH 端口转发到本机 2222,指纹已打码:

text 复制代码
# 情况二:网络通了,认证失败,看 7.1
debug1: Connecting to 127.0.0.1 [127.0.0.1] port 2222.
debug1: Connection established.
debug1: Offering public key: wrong.pem RSA SHA256:xxxxxxxx explicit
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: No more authentication methods to try.
ec2-user@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

Amazon Linux 2023 上括号里除了 publickey 还有 gssapi-keyex,gssapi-with-mic,括号里写了哪些方式由服务器的 sshd 配置决定,只要以 Permission denied (publickey 开头就是同一类问题。

判断:停在 Connecting to ... port 22. 之后、没有 Connection established,是网络问题;有 Connection established、后面跟着 Permission denied,是认证问题。

7.1 Permission denied (publickey)

现象 (官方文档示例):官方把它和 Authentication failed, permission denied、Connection closed by [instance] port 22 归为同一类。

text 复制代码
ec2-user@43.xxx.xx.39: Permission denied (publickey).

原因:网络是通的,问题在「用户名 + 私钥 + 实例上的公钥」这一组。

解决:按这个顺序查。

  1. 用户名 :Amazon Linux 用 ec2-user,Ubuntu 用 ubuntu,Debian 用 admin。完整对照见第 1 篇 5.2;
  2. 私钥是不是那一把:用 5.3 的命令查实例启动时的密钥对名称,再用指纹核对本地私钥;
  3. 本地私钥权限 :权限太宽时 SSH 会忽略私钥,也报这个错。看输出里有没有 UNPROTECTED PRIVATE KEY FILE(第 1 篇 7.1);
  4. 实例上的 authorized_keys :以前能登、突然不能登,可能是实例里的公钥或目录权限被改了。官方修复用 chmod 600(authorized_keys)和 chmod 700(.ssh 和用户主目录),要先用第 6 节的方法进到系统里再改;
  5. 自己生成的密钥:官方排障文档提示,自己生成的密钥要确认是 RSA,DSA 不接受。Linux 实例也支持 ED25519(见 5.1)。

7.2 Connection timed out

现象 :官方列出的是 PuTTY 风格的 Network error: Connection timed out 等写法。OpenSSH 显示为(测试环境同第 7 节开头的情况一):

text 复制代码
ssh: connect to host 43.xxx.xx.39 port 22: Connection timed out

原因:请求没到 sshd,和密钥无关。

解决 :排查时加 ConnectTimeout(作者建议)。在 Linux 上测试,不加要等约 2 分 15 秒,加了几秒出结果,报错一样(其他系统默认值可能不同):

bash 复制代码
# 最多等 5 秒,排查时不用干等
ssh -o ConnectTimeout=5 -i ~/.ssh/ec2-lab-key.pem ec2-user@43.xxx.xx.39

按「最省事」的顺序查:

  1. 公网 IP:实例有没有公有 IPv4 地址;停止再启动后公网 IP 会变,你连的是不是新 IP;
  2. 实例状态:是否在运行、状态检查是否通过;
  3. 安全组 :实例 > 安全 标签页 > 入站规则,有没有放行你当前公网 IP 的 22 端口。IP 变了就按 3.1 更新;实例挂的是不是默认安全组(2.3);
  4. 网络 ACL:子网的网络 ACL 入站有没有放行 22,出站有没有放行临时端口 1024~65535(第 4 节);
  5. 路由表和互联网网关 :子网路由表有没有 0.0.0.0/0(IPv6 是 ::/0)指向已挂到 VPC 的互联网网关,自建 VPC 最容易漏;
  6. 本地网络:公司网络或本机防火墙可能封了出站 22 端口,换手机热点试一下。

前五项都对还是不通,可以用 VPC 的 Reachability Analyzer,它会指出是安全组、网络 ACL 还是路由表拦住的(What is Reachability Analyzer)。它按每次分析收费 ,单价见 VPC 定价页 的 Network Analysis 部分。

7.3 no matching host key type found

现象 (本地模拟:服务器只提供 ed25519/ECDSA 主机密钥,客户端只支持 ssh-rsa):

text 复制代码
Unable to negotiate with 43.xxx.xx.39 port 22: no matching host key type found. Their offer: ssh-ed25519,ecdsa-sha2-nistp256

原因 :发生在认证前的算法协商阶段,和私钥无关,常见于老客户端连 AL2023。AL2023 默认禁用 ssh-rsa 主机密钥算法,只生成 ed25519 和 ECDSA 主机密钥(AL2023 默认 SSH 配置、re:Post:解决密钥不匹配报错)。

解决:

  1. 优先升级本地 SSH 客户端 (re:Post 的第一个办法);re:Post 也提到可在本地 ~/.ssh/config 里用 HostkeyAlgorithms 追加算法;
  2. 实在不能升级:AL2023 官方给的办法是在 User Data 里用 cloud-config 的 ssh_genkeytypes 让实例额外生成 rsa 主机密钥(User Data 在第 8 篇讲)。官方没写这个办法对已在运行的实例是否生效,作者未实测。

另一种情况,别混淆 :主机密钥协商通过了,但老客户端不支持 RSA 用户密钥的 rsa-sha2-256/512 签名(5.1)。AL2023 官方给这种情况的办法是在实例上 切换到 LEGACY 加密策略。你此时用老客户端登不进去,要先用控制台的 EC2 Instance Connect(3.4)或 Session Manager(第 10 篇)登录。这会降低安全性,作者建议只作临时手段:

bash 复制代码
# 在实例上安装加密策略工具,并切换到 LEGACY 策略(会降低安全性)
sudo dnf install crypto-policies-scripts
sudo update-crypto-policies --set LEGACY

8. 清理资源

安全组、网络 ACL 不额外收费(Reachability Analyzer 按次收费,见 7.2),但留着是安全隐患:

  • 删除临时 SSH 规则 :尤其是 0.0.0.0/0 或 ::/0 的 22 端口规则,按 3.1 删掉;
  • 删除不用的安全组 :要先解除和实例、网卡的关联,也不能被其他安全组引用(官方说明);默认安全组不能删;
bash 复制代码
# 删除安全组(需先解除关联和引用)
aws ec2 delete-security-group --group-id sg-xxxxxxxx
  • 删除不用的密钥对:删了不会让已有实例失效(5.4);启动模板或 Auto Scaling 组还引用它的,先改掉,否则替换实例时会启动失败;
bash 复制代码
# 删除 EC2 中保存的公钥(不影响已写入实例的公钥)
aws ec2 delete-key-pair --key-name ec2-lab-import
  • 改回网络 ACL:如果为了实验改过网络 ACL,按原样改回;
  • 用过 AWSSupport-ResetAccess 的 :它建的备份 AMI 不会自动删,确认不用后注销 AMI ,再删除对应快照(快照在第 7 篇讲);
  • 会产生费用的资源 :实例、EBS 卷、弹性 IP 的清理按第 1 篇第 8 节的清单走。不再用 ec2-lab-01 的话,就终止它。

9. 参考资料

系列导航

「亚麻云之EC2」系列(从入门到进阶),链接随发布更新:

  • 第 0 篇:亚麻云之EC2------系列导航:从第一台 EC2 到排障单篇,全部文章目录与按需选读
  • 第 1 篇:亚麻云之EC2------2025 新版免费套餐下启动第一台 EC2 并 SSH 登录(含 Windows)
  • 第 2 篇:亚麻云之EC2------安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查(本篇)
  • 第 3 篇:亚麻云之EC2------EBS 存储入门:卷类型怎么选(gp3/io2/st1),挂数据盘并用 UUID 写 fstab 开机自动挂载
  • 第 4 篇:亚麻云之EC2------弹性 IP(EIP)入门:停止后公网 IP 会变怎么办,闲置 EIP 收费的坑,搭 Nginx 验证
  • 第 5 篇:亚麻云之EC2------实例生命周期与费用:停止、终止、休眠有什么区别,账单和 Cost Explorer 怎么看
  • 第 6 篇:亚麻云之EC2------根分区满了怎么扩容:不重启扩大 EBS 根卷,growpart + xfs_growfs/resize2fs 及报错排查
  • 第 7 篇:亚麻云之EC2------快照与 AMI:用快照恢复卷和替换根卷,制作自定义 AMI 并跨 Region 复制
  • 第 8 篇:亚麻云之EC2------User Data 与启动模板:开机自动装 Nginx,User Data 只执行一次/不执行怎么办,模板版本与默认版本
  • 第 9 篇:亚麻云之EC2------IAM 角色代替 AK/SK:EC2 用实例角色安全访问 S3,IMDSv2 取临时凭证,Unable to locate credentials 排查
  • 第 10 篇:亚麻云之EC2------Session Manager 免密登录:不开 22 端口登录 EC2,端口转发、SSH over SSM,TargetNotConnected 排查
  • 第 11 篇:亚麻云之EC2------ALB + Auto Scaling 弹性伸缩:按 CPU 自动扩缩容、实例刷新滚动更新,目标组健康检查失败与 502/503 排查
  • 第 12 篇:亚麻云之EC2------CloudWatch Agent 采集内存和磁盘使用率:配置存 Parameter Store、User Data 自动安装,磁盘 80% 告警发邮件,INSUFFICIENT_DATA 排查
  • 第 13 篇:亚麻云之EC2------省钱实战:Graviton(ARM)迁移步骤、Spot 实例中断通知与混合实例策略,Savings Plans 与预留实例推荐查询,东京定价对比
  • 第 14 篇:亚麻云之EC2------实例状态检查失败连不上:分清系统和实例检查,救援实例修 fstab,配置自动恢复
  • 第 15 篇:亚麻云之EC2------No space left on device:根分区写满登不上,清理缓解、在线扩容与救援实例紧急修复

下一篇讲 EBS 存储入门:gp3、io2、st1 怎么选,怎么挂一块数据盘,并用 UUID 写 fstab 实现开机自动挂载。

相关推荐
_Evan_Yao9 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd9 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼9 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
武天旭9 小时前
AI安全--AI大模型的隐私保护与法律法规
人工智能·安全
thefool11226610 小时前
TCP 1
java·1024程序员节
金銀銅鐵12 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手13 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck14 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280415 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis