不开公网 22 端口也能 SSH:AWS EC2 Instance Connect Endpoint 实战
传统方式 SSH 进 EC2要么给实例挂公网 IP 安全组开放 22暴露面大要么搭堡垒机成本和运维负担。EC2 Instance Connect Endpoint下称 EIC Endpoint是 AWS 推出的方案本质上是一种Interface VPC Endpoint基于 PrivateLink让你从本地直接 SSH 到私有子网里的 EC2全程走 AWS 内网不碰公网。它解决了什么问题不开公网 22实例无需公网 IP安全组的 22 只对 Endpoint 开放不用堡垒机少一台机器、少一层跳板不用长期密钥每次连接 CLI 自动生成临时密钥对公钥推送到实例元数据连接结束即失效原理与流量路径你的笔记本 │ (AWS API 调用推送临时公钥 建立隧道) ▼ EIC Endpoint ENI ← VPC 内的一个弹性网络接口 │ (从 ENI 发起 SSH 到实例的 22) ▼ EC2 实例 (私有 IP)关键认知EIC 最终还是要连到实例的 22 端口——它省的是把 22 暴露到公网不是省掉 22。所以实例安全组必须放行 22但只对 Endpoint 开放。前置条件AWS CLI v2SSO 登录需要 v2aws--version# aws-cli/2.x.x ...实例侧已安装ec2-instance-connect包sshd 已配置从实例元数据取公钥AuthorizedKeysCommand。Amazon Linux 系列默认已装Ubuntu/Debian 需确认见文末注意事项。网络侧EIC Endpoint 与实例在同一 VPC实例安全组放行 22 来自 Endpoint。一、认证配置EIC 命令走标准 AWS CLI 认证AK/SK 和 SSO 都支持。方式 AIAM Identity CenterSSO适合企业账号通过统一身份门户分发访问权限的场景——当对方给你一个xxx.awsapps.com/start登录地址时走这条路。aws configure sso按提示填写提示填什么SSO session name随便起如myorgSSO start URLhttps://d-xxxxxxxxxx.awsapps.com/startSSO regionIdentity Center 目录所在区域见下方注意SSO registration scopes回车选默认sso:account:access随后浏览器自动打开用 SSO 账号登录授权。回到终端后会列出可用的 AWS 账号和角色选择后给 profile 命名CLI profile name [RoleName-111111111111]: my-profile之后所有命令带--profile my-profile即可。⚠️SSO region 不是实例 region而是 Identity Center 目录托管区域从 start URL 看不出来需向管理员确认常见us-east-1、ap-northeast-1。填错会报InvalidGrantException。⚠️ SSO token 一般 8–12 小时过期过期后重跑aws sso login --profile my-profile。方式 BAK/SK访问密钥适合个人账号或持有长期密钥的场景。aws configure# AWS Access Key ID: AKIA...# AWS Secret Access Key: ****# Default region name: us-east-1# Default output format: json二、创建 EIC Endpoint先拿到目标实例的子网和 VPCaws ec2 describe-instances --instance-ids i-0xxxxxxxxxxxx\--profilemy-profile--regionus-east-1\--queryReservations[].Instances[].[VpcId,SubnetId]--outputtext在实例所在子网创建 Endpointaws ec2 create-instance-connect-endpoint\--subnet-id subnet-0xxxxxxxxxxxx\--profilemy-profile--regionus-east-1等待状态变为create-completeaws ec2 describe-instance-connect-endpoints\--profilemy-profile--regionus-east-1\--queryInstanceConnectEndpoints[].[InstanceId,State]--outputtext也可在控制台创建VPC → Endpoints → Create Endpoint服务选择 EC2 Instance Connect Endpoint。三、配置实例安全组Endpoint 会从其 ENI 发起 SSH 到实例的 22所以实例安全组要放行来自 Endpoint 的 22。两种写法。写法 1放行 Endpoint 的安全组推荐最精确先拿到 Endpoint ENI 关联的安全组aws ec2 describe-network-interfaces\--profilemy-profile--regionus-east-1\--filtersNamedescription,Values*Instance Connect*\--queryNetworkInterfaces[].[NetworkInterfaceId,Groups[].GroupId]--outputtext然后给实例 SG 加规则aws ec2 authorize-security-group-ingress\--group-id sg-0实例的SG\--protocoltcp--port22\--source-security-group-id sg-0Endpoint的SG\--profilemy-profile--regionus-east-1写法 2放行整个 VPC 网段省事aws ec2 authorize-security-group-ingress\--group-id sg-0实例的SG\--protocoltcp--port22\--cidr172.31.0.0/16\--profilemy-profile--regionus-east-1⚠️ 这里放行的是实例 SG 对 Endpoint 开 22不是对公网开。Endpoint 的 ENI IP 在 VPC 网段内用 VPC CIDR 即可覆盖。四、连接核心命令aws ec2-instance-connectssh\--instance-id i-0xxxxxxxxxxxx\--connection-type eice\--os-user ubuntu\--profilemy-profile\--regionus-east-1两个参数是成败关键⚠️--connection-type eice强制走 EIC Endpoint。不加的话默认auto在实例有公网 IP 时会退回直连公网 IP而本地 IP 又不在安全组里于是Operation timed out。这是最高频的坑。⚠️--os-user按 AMI 选对应用户默认ec2-user只对 Amazon Linux 系列有效。常见对照AMIos-userAmazon Linux 2 / 2023ec2-userUbuntuubuntuDebianadminRHEL / CentOSec2-user或centos用户名错了会报Permission denied (publickey)——CLI 把临时公钥推到该用户的元数据槽位SSH 登录用户必须与之一致。不确定 AMI 类型时查一下aws ec2 describe-images --image-ids ami-0xxx\--profilemy-profile--regionus-east-1\--queryImages[].[Name,Description]--outputtext注意事项汇总--connection-type eice必须显式指定否则有公网 IP 的实例会走直连公网超时。--os-user按 AMI 选Ubuntu 用ubuntu不是ec2-user。SSO token 过期→aws sso login --profile my-profile重登。实例必须装ec2-instance-connect包否则 sshd 不会去元数据取临时公钥报Permission denied (publickey)。Ubuntu 安装sudoapt-getupdatesudoapt-getinstall-yec2-instance-connectsudosystemctl restartssh安全组 22 是对 Endpoint 开不是对公网开——这正是 EIC 的意义所在。五、简化日常使用每次敲一长串命令太烦做个 alias# ~/.zshrcaliassshfbaws ec2-instance-connect ssh \ --instance-id i-0xxxxxxxxxxxx \ --connection-type eice \ --os-user ubuntu \ --profile my-profile \ --region us-east-1source~/.zshrc sshfb# 一键进入或写进~/.ssh/config配合ProxyCommand让ssh my-ec2像连普通服务器一样自然。