亚麻云之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 篇,链接待发布后补)和文末「系列导航」。
写作说明(发布前删除)。发布前必须完成:
标题已定:CSDN 版用本文标题;公众号版用「SSH 连不上 EC2?Permission denied 和连接超时这样查,私钥丢了也有办法」;
输出标注(不用再补实测):「示例输出」是按官方文档字段写的示意输出,ID、IP 已打码,数值为示意;「官方文档示例」是官方原文;「本机复现(Amazon Linux 2023 虚拟机,非 EC2)」「本机复现(loop 设备模拟,非 EC2)」是在本机虚拟机或 loop 设备上真跑的输出;「模拟环境测试」指用假
aws、本地脚本检查过命令和分支。本系列没有在 EC2 上实测,发布时保持这些标注;按实际控制台核对文中的中文按钮名:安全组、编辑入站规则、我的 IP、添加规则、网络 ACL、路由表、密钥对、导入密钥对、连接、启动时分配的密钥对;
第 1 篇发布后,给文中「本系列第 1 篇」补链接;导航页(第 0 篇)发布后,补文首和文末「系列导航」的链接;本文先于导航页发布的话,把文首「导航页」改成纯文字;
删除本段写作说明。
环境与版本
| 项目 | 本文使用 |
|---|---|
| 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 也可以(作者建议)。
目录
-
- 前言
-
- 安全组是怎么工作的
-
- SSH 端口怎么开才安全
-
- 网络 ACL:排查超时才需要看的一层
-
- 密钥对:类型、导入与更换
-
- 私钥丢了怎么办
-
- 故障排查
-
- 清理资源
-
- 参考资料
- 系列导航
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 改规则不一定会断开已有连接
- 规则来源是具体 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
| 类型 | 支持情况 |
|---|---|
| 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:
- 用现有私钥登录实例;
- 拿到新公钥的内容。导入的密钥直接看
.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); - 把新公钥追加到
~/.ssh/authorized_keys末尾(echo "公钥内容" >> ~/.ssh/authorized_keys); - 用新私钥登录测试。官方步骤是先断开再测;作者建议先不要退出当前会话,开一个新终端测试,比官方步骤更稳;
- 测试通过后,如果要撤销旧钥匙,再从
authorized_keys里删掉旧公钥那一行; - 用了启动模板、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).
原因:网络是通的,问题在「用户名 + 私钥 + 实例上的公钥」这一组。
解决:按这个顺序查。
- 用户名 :Amazon Linux 用
ec2-user,Ubuntu 用ubuntu,Debian 用admin。完整对照见第 1 篇 5.2; - 私钥是不是那一把:用 5.3 的命令查实例启动时的密钥对名称,再用指纹核对本地私钥;
- 本地私钥权限 :权限太宽时 SSH 会忽略私钥,也报这个错。看输出里有没有
UNPROTECTED PRIVATE KEY FILE(第 1 篇 7.1); - 实例上的
authorized_keys:以前能登、突然不能登,可能是实例里的公钥或目录权限被改了。官方修复用chmod 600(authorized_keys)和chmod 700(.ssh和用户主目录),要先用第 6 节的方法进到系统里再改; - 自己生成的密钥:官方排障文档提示,自己生成的密钥要确认是 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
按「最省事」的顺序查:
- 公网 IP:实例有没有公有 IPv4 地址;停止再启动后公网 IP 会变,你连的是不是新 IP;
- 实例状态:是否在运行、状态检查是否通过;
- 安全组 :实例 > 安全 标签页 > 入站规则,有没有放行你当前公网 IP 的 22 端口。IP 变了就按 3.1 更新;实例挂的是不是默认安全组(2.3);
- 网络 ACL:子网的网络 ACL 入站有没有放行 22,出站有没有放行临时端口 1024~65535(第 4 节);
- 路由表和互联网网关 :子网路由表有没有
0.0.0.0/0(IPv6 是::/0)指向已挂到 VPC 的互联网网关,自建 VPC 最容易漏; - 本地网络:公司网络或本机防火墙可能封了出站 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:解决密钥不匹配报错)。
解决:
- 优先升级本地 SSH 客户端 (re:Post 的第一个办法);re:Post 也提到可在本地
~/.ssh/config里用HostkeyAlgorithms追加算法; - 实在不能升级: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. 参考资料
- Amazon EC2 security groups for your EC2 instances
- Security group rules
- Amazon EC2 security group connection tracking
- Default security groups for your VPCs
- Security group rules for different use cases
- Reference for Amazon EC2 instance configuration parameters(启动参数,Firewall 部分)
- Set up to use Amazon ECS(checkip.amazonaws.com 出处)
- Delete an Amazon EC2 security group
- authorize-security-group-ingress(AWS CLI 参考)
- Control subnet traffic with network ACLs
- Default network ACL for a VPC
- Amazon EC2 key pairs
- Create a key pair for your Amazon EC2 instance
- Describe your key pairs
- Verify the fingerprint of your key pair
- Add or replace a public key on your Linux instance
- Delete your key pair
- Prerequisites for EC2 Instance Connect
- Install EC2 Instance Connect on your EC2 instances
- re:Post:私钥丢失后如何连接 EC2 实例
- AWSSupport-ResetAccess 运行手册
- Prerequisites for the EC2 Serial Console
- re:Post:解决 EC2 Linux 实例的密钥不匹配报错
- Amazon Linux 2023:Default SSH server configuration
- Troubleshoot issues connecting to your Amazon EC2 Linux instance
- What is Reachability Analyzer?
- Amazon VPC 定价
系列导航
「亚麻云之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 实现开机自动挂载。