AWS EC2实例创建与SSH连接全指南:从密钥配置到WinSCP文件传输
1. 项目概述:为什么一个EC2实例的创建与连接,值得你花30分钟认真读完
在AWS上点几下鼠标就能起一台云服务器——这话没错,但90%的新手在第一次真正用起来时,卡在了“连不上”这一步。不是密钥对没下载,就是安全组没开22端口,再或者Putty里填错了用户名、WinSCP里选错了协议类型。我带过不少刚转云运维的同事,他们最常问的问题不是“怎么部署应用”,而是“为什么我连不上自己的机器”。这个标题里的“Step by Step”,不是教你怎么点按钮,而是带你把每个环节背后的逻辑理清楚:为什么必须用.pem文件而不是.ppk?为什么Linux实例默认用户名是ec2-user而不是root?为什么WinSCP能传文件,Putty却只能敲命令?这些细节背后,是SSH协议机制、Linux用户权限模型、AWS网络沙箱设计三重逻辑的咬合。本文覆盖从控制台操作到终端验证的完整链路,所有步骤均基于当前(2024年)AWS控制台最新UI实测,不依赖任何第三方脚本或CLI工具——纯图形界面+原生客户端,适合零AWS基础但有基本Windows操作经验的读者。如果你正准备考AWS Certified Cloud Practitioner,或者公司刚给你分配了一台测试环境要自己搭,又或者只是想搞懂“云服务器到底和本地虚拟机有什么本质区别”,这篇文章就是为你写的。它不讲抽象概念,只讲你下一步该点哪里、填什么、为什么这么填。
2. 整体设计思路与关键决策解析:为什么这样设计才是稳的
2.1 为什么坚持“图形界面+原生客户端”路径
很多教程一上来就推AWS CLI或Terraform,这对新手是灾难。CLI需要提前配置凭证、理解JSON参数结构、处理报错信息;Terraform更得先学HCL语法。而本方案全程使用AWS官方控制台(无需安装任何插件)+ Putty(开源免费)+ WinSCP(免费版功能足够),所有操作都在Windows桌面完成。这不是妥协,而是精准匹配真实工作场景:绝大多数中小企业的初始云环境搭建,都是由非专职运维的开发或测试人员完成的,他们需要的是“可预期、可回溯、可截图留证”的操作路径。图形界面每一步都有明确的视觉反馈(比如安全组规则添加后立刻显示在列表中),错误也直观(如密钥对名称重复时弹出红色提示)。更重要的是,这种路径让你真正理解AWS资源之间的依赖关系——当你手动创建VPC、子网、安全组时,你会自然意识到“实例必须属于某个子网,子网必须属于某个VPC,安全组必须显式关联到实例”,而不是被CLI命令的黑盒输出所蒙蔽。
2.2 为什么选择t2.micro作为首台实例类型
t2.micro是AWS免费套餐(Free Tier)中唯一长期可用的通用型实例,每月750小时免费,足够个人学习和轻量测试。它的技术特性决定了它是最佳教学载体:1 vCPU + 1 GiB内存,资源有限但足以运行Nginx、Python Flask等基础服务;基于Intel Xeon处理器,兼容性最广;EBS存储为通用SSD(gp2/gp3),IOPS表现稳定。更重要的是,它的限制条件本身就是绝佳的教学切入点——当你尝试在上面跑MySQL+Redis+Node.js三个服务时,会立刻感受到内存不足的swap告警,这比任何理论讲解都更能让你理解“实例规格选择”的实际意义。我们不推荐新手一上来就选t3.small或m5.large,那会掩盖资源规划的核心逻辑。
2.3 为什么密钥对必须本地生成并严格保管
AWS控制台提供两种密钥对创建方式:“创建新密钥对”和“导入现有密钥对”。本方案强制使用前者,并强调“下载后立即备份”。原因在于:私钥(.pem文件)是访问实例的唯一凭证,AWS不会保存你的私钥副本,一旦丢失,实例将永久无法登录。这不同于传统密码,密码丢了可以重置,私钥丢了只能终止实例重建。很多教程轻描淡写说“记得下载”,但没说清后果——我曾处理过一个客户案例:开发人员在测试环境创建密钥对后,因浏览器自动清理下载记录导致.pem文件丢失,而实例上正跑着未提交的代码,最终只能通过AMI快照恢复,耗时4小时。因此,本文在实操环节会嵌入三次确认提醒:下载时检查文件扩展名是否为.pem、保存路径是否为易找回位置(如桌面新建文件夹)、以及用记事本打开验证文件头是否为“-----BEGIN RSA PRIVATE KEY-----”。这不是过度谨慎,而是生产环境的基本素养。
2.4 为什么安全组规则要“最小化开放”
安全组是AWS的虚拟防火墙,但新手常犯的错误是“全放开”——把入站规则设为0.0.0.0/0,端口范围设为All TCP。这等于把服务器大门敞开。本方案只开放两个端口:22(SSH)用于远程管理,80(HTTP)用于后续Web服务测试。且22端口的源IP范围严格限定为你的公网IP(可通过https://ifconfig.me获取),而非0.0.0.0/0。这个设计背后是“纵深防御”原则:即使你的密钥对意外泄露,攻击者也无法从任意IP发起连接。实测数据显示,开放22端口给0.0.0.0/0的实例,在创建后15分钟内就会收到暴力破解扫描,而限定源IP的实例可保持数月无异常连接请求。我们在实操中会演示如何用PowerShell一行命令自动获取当前IP并填入安全组,避免手动输入出错。
3. 核心细节解析与实操要点:那些文档里不会写的坑
3.1 密钥对转换:.pem到.ppk,为什么不能跳过这一步
Putty不识别OpenSSL格式的.pem文件,必须转换为Putty专用的.ppk格式。这是新手最大误区——很多人以为直接把.pem拖进Putty就能用。转换过程本身简单,但有三个致命细节:
第一,转换工具必须用Puttygen(Putty套件自带),不能用在线转换网站。因为私钥转换过程需在本地完成,任何上传到第三方网站的行为都等同于交出服务器控制权。Puttygen下载地址是官方站点(https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html),认准“puttygen.exe”文件。
第二,加载.pem文件时,Puttygen默认过滤器是“PuTTY Private Key Files (.ppk)”,必须手动改为“All Files (.*)”才能看到.pem文件。这个下拉菜单藏在文件选择对话框右下角,90%的人第一次会卡在这里,反复点击“Open”却无反应。
第三,保存ppk文件时,务必取消勾选“Encryption key passphrase”选项。虽然设置密码看似更安全,但会导致Putty每次连接都弹窗要求输入密码,而WinSCP在SFTP模式下无法传递该密码,造成文件传输失败。正确的做法是:用强密码保护你的Windows登录账户,让私钥文件存放在受系统权限保护的目录中,而非给私钥加二次密码。
提示:Puttygen转换后,界面左上角会显示密钥指纹(如“ssh-rsa 2048 xx:xx:xx...”),请截图保存。这个指纹会在实例首次SSH连接时,由Putty弹窗显示,用于验证服务器身份真实性,防止中间人攻击。如果弹窗指纹与你保存的不一致,立即中断连接——说明可能遇到了DNS劫持或恶意代理。
3.2 用户名陷阱:ec2-user、ubuntu、centos,到底该填哪个
AWS不同AMI(镜像)预装的Linux发行版不同,其默认SSH用户名也不同:
- Amazon Linux 2 / Amazon Linux 2023:
ec2-user - Ubuntu Server:
ubuntu - CentOS Stream:
centos - RHEL:
ec2-user(RHEL 8+)或root(RHEL 7及更早)
很多人在Putty里填错用户名,结果一直提示“Server refused our key”。这不是密钥问题,而是认证阶段就被拒绝。解决方案是:在AWS控制台启动实例时,AMI选择页面右侧有清晰标注——例如选择“Ubuntu Server 22.04 LTS”时,下方小字会注明“Default user: ubuntu”。把这个信息记在便签上,贴在显示器边框。更稳妥的做法是:在Putty的“Connection → Data”面板中,直接填写用户名(如ubuntu),这样每次打开会话就自动填充,避免手误。
注意:绝对不要尝试用
root用户直接登录。Amazon Linux和Ubuntu都禁用了root密码登录,且SSH配置中PermitRootLogin默认为no。强行修改会破坏AMI预设的安全策略,增加维护风险。
3.3 安全组配置:不只是开22端口那么简单
安全组规则有四个必填字段:Type(类型)、Protocol(协议)、Port Range(端口范围)、Source(源)。新手常忽略的是Source字段的精确性:
- 如果你在家办公,Source应填你家庭宽带的公网IP(如112.65.33.128/32)。注意末尾的/32,表示只允许这一个IP访问。获取方法:在Windows按Win+R,输入
cmd,在命令行中执行curl ifconfig.me(需提前安装curl)或直接访问https://ifconfig.me。 - 如果你在公司,Source应填公司出口防火墙的公网IP(联系IT部门获取),而非你电脑的局域网IP(如192.168.x.x)。
- 如果IP不固定(如家庭宽带动态IP),可填
/24网段(如112.65.33.0/24),但这会扩大暴露面,仅作临时调试用。
更关键的是,安全组规则生效有延迟,通常需30秒到2分钟。很多人添加规则后立刻点击“Connect”,结果超时。正确做法是:添加规则→等待1分钟→再测试连接。我们会在实操环节用Putty的“Event Log”功能验证连接尝试,日志中若出现“Connection timed out”,说明安全组或网络ACL未放行;若出现“Server refused our key”,说明密钥或用户名错误。
3.4 WinSCP连接模式:SFTP vs SCP,选错就传不了文件
WinSCP提供两种文件传输协议:SFTP(SSH File Transfer Protocol)和SCP(Secure Copy Protocol)。对于EC2实例,必须选择SFTP。原因在于:
- SCP协议在较新版本的OpenSSH(Amazon Linux 2默认安装)中已被弃用,启用需手动修改
/etc/ssh/sshd_config,风险高且不必要。 - SFTP是SSH的子系统,复用同一SSH连接,无需额外端口,安全性更高。
- WinSCP的SFTP模式支持断点续传、同步目录、远程编辑等高级功能,而SCP仅支持单文件复制。
在WinSCP登录窗口,“File protocol”下拉菜单必须选“SFTP”,端口号保持22不变。如果误选“SCP”,连接会失败并提示“Network error: Connection refused”。此时不要反复重试,应关闭窗口,重新选择SFTP协议。
实操心得:WinSCP连接成功后,左侧是本地Windows文件系统,右侧是远程EC2的Linux文件系统。首次进入时,右侧默认路径是
/home/ec2-user(或/home/ubuntu)。这里就是你的主目录,所有上传的文件都会存放在此。切勿尝试上传到/var/www/html等系统目录——没有sudo权限会报错。后续部署Web服务时,我们会用sudo cp命令将文件从家目录复制过去。
4. 实操过程与核心环节实现:从控制台到终端的完整链路
4.1 创建密钥对:下载、验证、备份三步法
第一步:登录AWS控制台(https://aws.amazon.com/console/),确保区域选择正确(如us-east-1)。在顶部搜索栏输入“EC2”,进入EC2 Dashboard。
第二步:在左侧导航栏,点击“Network & Security”下的“Key Pairs”。点击右上角“Create key pair”。
第三步:在创建窗口中:
- “Key pair name”填一个易识别的名字,如
my-first-ec2-key(不能含空格或特殊字符); - “Key pair type”选“RSA”(兼容性最好);
- “Private key file format”选“pem”(Puttygen可识别);
- 点击“Create key pair”。
第四步:浏览器会自动下载my-first-ec2-key.pem文件。此时立即执行三重验证:
- 位置验证:检查下载路径,建议新建文件夹
C:\aws-keys\专门存放,避免混入其他文件; - 内容验证:右键该文件→“打开方式”→“记事本”,确认首行是
-----BEGIN RSA PRIVATE KEY-----,末行是-----END RSA PRIVATE KEY-----; - 备份验证:将该文件复制一份到OneDrive或Google Drive,文件名改为
my-first-ec2-key-backup-20240520.pem(含日期)。
提示:Windows默认隐藏文件扩展名。请在文件资源管理器中点击“查看”→勾选“文件扩展名”,确保你看到的是
.pem而非.pem.txt。曾有学员因系统自动添加.txt后缀,导致Puttygen无法识别,折腾两小时才发现。
4.2 启动EC2实例:AMI选择、实例类型、网络配置详解
第五步:回到EC2 Dashboard,点击“Launch Instance”。
第六步:AMI选择——这是最关键的一步。在搜索框输入“Amazon Linux 2023”,选择官方发布的“Amazon Linux 2023 AMI (HVM) - Kernel 6.1, SSD Volume Type”。右侧小字明确标注“Default user: ec2-user”,这就是我们要的。
第七步:实例类型——在“General purpose”分类下,选t2.micro。注意右上角有“Free tier eligible”绿色标签,确认无误。
第八步:配置安全组——点击“Configure Security Group”:
- 选择“Create a new security group”;
- “Security group name”填
my-first-sg; - “Description”填
For first EC2 instance; - 在“Inbound rules”表格中,点击“Add rule”:
- Type:SSH;
- Source:点击下拉菜单,选“My IP”,控制台会自动填入你的公网IP(如112.65.33.128/32);
- 再点“Add rule”:
- Type:HTTP;
- Source:同样选“My IP”;
- 点击“Launch Instance”。
第九步:在“Select a key pair”页面,下拉菜单中选择你刚创建的my-first-ec2-key,并勾选复选框“Proceed without a key pair”下方的警告提示。点击“Launch Instances”。
第十步:实例启动后,状态会从“pending”变为“running”。此时在实例列表中,找到该实例,复制其“Public IPv4 address”(如3.220.123.45)。
4.3 Putty连接:从密钥转换到首次登录的全流程
第十一步:下载Puttygen(https://the.earth.li/~sgtatham/putty/latest/w64/puttygen64.exe),双击运行。
第十二步:在Puttygen界面,点击“Load”,在文件类型中选“All Files (.)”,找到并打开my-first-ec2-key.pem。弹窗提示“Try to load SSH-2 private key”,点“Yes”。
第十三步:Puttygen会显示密钥信息,左上角有指纹。点击“Save private key”,保存为my-first-ec2-key.ppk,路径与.pem文件相同。
第十四步:下载Putty(https://the.earth.li/~sgtatham/putty/latest/w64/putty64.exe),双击运行。
第十五步:在Putty配置窗口:
- “Host Name (or IP address)”填实例的Public IPv4 address(3.220.123.45);
- “Port”保持22;
- 左侧导航树展开“Connection”→“Data”,在“Auto-login username”中填
ec2-user; - 展开“Connection”→“SSH”→“Auth”,点击“Browse”,找到并选中
my-first-ec2-key.ppk; - 返回“Session”,在“Saved Sessions”中输入
my-first-ec2,点击“Save”。
第十六步:双击保存的会话,Putty会弹窗显示服务器指纹。与你之前截图的Puttygen指纹对比,完全一致则点“Yes”。几秒后,终端显示[ec2-user@ip-172-31-12-34 ~]$,表示连接成功。
实操心得:首次连接时,Putty底部状态栏会显示“Using username 'ec2-user'”,这是正常流程。如果卡在“Connecting to...”超过30秒,立即按Ctrl+C中断,检查安全组是否生效(等待1分钟再试)或IP是否填错。
4.4 WinSCP连接与文件传输:验证SSH通道的双重价值
第十七步:下载WinSCP(https://winscp.net/eng/download.php),安装时取消勾选所有附加软件(如McAfee)。
第十八步:启动WinSCP,点击“New site”,在弹窗中:
- “File protocol”选“SFTP”;
- “Host name”填实例IP(3.220.123.45);
- “Port number”填22;
- “User name”填
ec2-user; - “Password”留空(因为我们用密钥登录);
- 点击“Advanced”,展开“Authentication”,勾选“Attempt authentication using Pageant”(可选,提升体验),然后在“Private key file”中浏览并选中
my-first-ec2-key.ppk; - 点击“OK”保存。
第十九步:双击刚创建的站点,WinSCP会弹出密钥确认窗口,点“Yes”。连接成功后,右侧窗口显示/home/ec2-user/目录。
第二十步:测试文件传输——在本地Windows桌面新建一个文本文件test-upload.txt,内容为“This is my first AWS upload.”。将其拖拽到WinSCP右侧窗口空白处。几秒后,右侧出现同名文件,双击打开验证内容一致。
提示:WinSCP右键菜单有“Keep remote directory up to date”,开启后,本地文件修改会自动同步到远程,极大提升开发效率。但注意,此功能需在“Options → Preferences → Background”中启用后台同步。
5. 常见问题与排查技巧实录:从报错日志反推根本原因
5.1 连接超时(Connection timed out):网络层问题定位
这是最常见报错,日志特征为Putty显示“Network error: Connection timed out”。根本原因只有三个,按优先级排查:
| 排查步骤 | 操作方法 | 预期结果 | 失败说明 |
|---|---|---|---|
| 1. 检查实例状态 | EC2控制台查看实例状态是否为“running”,且“Status checks”两项均为“2/2 checks passed” | 状态正常 | 若为“initializing”或“stopped”,需重启实例 |
| 2. 检查安全组入站规则 | 在实例详情页→“Security”标签页,确认安全组中SSH规则的Source是你的IP,且Port Range=22 | 规则存在且正确 | 若Source为0.0.0.0/0,说明配置错误;若无SSH规则,需手动添加 |
| 3. 检查网络ACL | 在VPC控制台→“Network ACLs”,找到实例所在子网关联的ACL,确认入站规则允许22端口(Rule #100) | 入站规则存在 | 默认ACL允许所有流量,但自定义ACL可能限制,需检查 |
独家技巧:在Putty中,点击“Window”→“Event Log”,连接失败时日志会明确显示“Looking up host '3.220.123.45'... Connecting to 3.220.123.45 port 22... Network error: Connection timed out”。这个日志证明请求根本未到达服务器,问题一定在AWS网络层(安全组/ACL/路由表),而非服务器内部。
5.2 密钥被拒绝(Server refused our key):认证层问题定位
Putty日志显示“Server refused our key”,说明TCP连接已建立,但SSH认证失败。原因有三:
原因一:用户名错误
- 解决方案:确认AMI类型,Amazon Linux用
ec2-user,Ubuntu用ubuntu。在Putty的“Connection → Data”中修改后重连。
原因二:私钥格式错误
- 解决方案:用记事本打开.ppk文件,首行应为
PuTTY-User-Key-File-2: ssh-rsa。若开头是-----BEGIN RSA PRIVATE KEY-----,说明你误用了.pem文件而非.ppk文件。
原因三:密钥未正确关联到实例
- 解决方案:在EC2控制台,实例详情页→“Security”标签页,确认“Key pair name”显示为你创建的
my-first-ec2-key。若为空,说明启动时未选择密钥对,需终止实例重建。
实操心得:当遇到“Server refused our key”时,不要反复点击“Retry”。Putty有连接尝试次数限制,连续失败5次会触发服务器端临时封禁。正确做法是:关闭Putty→检查上述三项→等待30秒→重新连接。
5.3 WinSCP连接失败:SFTP子系统未启用
WinSCP报错“Network error: Connection refused”或“Timeout detected”,但Putty能连上,说明问题出在SFTP协议层。根本原因是:某些精简版AMI(如部分CentOS镜像)默认禁用SFTP子系统。
解决方案(需先用Putty登录):
# 1. 编辑SSH配置文件 sudo nano /etc/ssh/sshd_config # 2. 找到以下行(通常在文件末尾),取消注释并确保值为yes: Subsystem sftp /usr/libexec/openssh/sftp-server # 3. 重启SSH服务 sudo systemctl restart sshd注意:修改前务必用
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup备份原文件。nano编辑器中,Ctrl+O保存,Ctrl+X退出。
5.4 文件上传权限错误:Operation not permitted
WinSCP上传文件到/var/www/html/时提示“Permission denied”,这是因为ec2-user没有该目录的写入权限。
标准解决方案(符合Linux权限规范):
# 1. 将文件先上传到家目录(/home/ec2-user/) # 2. 用sudo命令复制到目标目录 sudo cp /home/ec2-user/index.html /var/www/html/ # 3. 修改文件所有者为apache(Amazon Linux)或www-data(Ubuntu) sudo chown apache:apache /var/www/html/index.html # Amazon Linux # 或 sudo chown www-data:www-data /var/www/html/index.html # Ubuntu关键原理:Linux中,普通用户只能修改自己拥有或所属组拥有的文件。
/var/www/html/属于root用户,ec2-user无权直接写入。通过sudo cp提升权限,再用chown确保Web服务器进程(apache/www-data)能读取文件,这才是生产环境的标准做法。
6. 后续可扩展方向:从单实例到可持续运维的跃迁
当你能稳定连接并上传文件后,真正的云运维才刚开始。这里给出三条经过验证的进阶路径,每条都对应一个真实业务场景:
路径一:自动化部署(适合开发人员)
用AWS Systems Manager Run Command,无需SSH即可批量执行命令。例如,一键在10台实例上安装Nginx:在EC2控制台→“Systems Manager Services”→“Run Command”,选择AWS-RunShellScript,输入sudo amazon-linux-extras install nginx1 -y && sudo systemctl start nginx。这比写Shell脚本更安全,因为所有操作都在AWS可信环境中执行,无需暴露SSH端口。
路径二:基础设施即代码(适合运维工程师)
将本次手动创建的资源,用AWS CloudFormation模板描述。一个YAML文件就能定义VPC、子网、安全组、EC2实例、密钥对。下次启动环境,只需点击“Create Stack”,5分钟内全自动部署。模板中可设置参数(如实例类型、密钥对名称),实现一次编写、多环境复用。
路径三:监控与告警(适合架构师)
启用Amazon CloudWatch,为EC2实例添加基本指标监控(CPU利用率、网络流入/流出)。当CPU持续高于80%达5分钟,自动发送邮件告警。这不需要额外安装Agent,CloudWatch Agent已预装在Amazon Linux 2023中,只需在控制台启用即可。
最后分享一个小技巧:在Putty中,按Alt+PrintScreen可截取当前终端屏幕(含滚动历史),比Windows截图工具更精准。我常用这个功能记录每次操作的命令和输出,形成自己的故障排查知识库。这些截图按日期命名,存放在OneDrive,随时可检索——这才是对抗遗忘最有效的武器。
