+86 189 8218 1436 周一至五 10:00-22:00

GCP VM 教学步骤三:连上 VM

TL;DR:用小白能懂的方式讲清 GCP VM 教学步骤三:通过 SSH 连接虚拟机,检查防火墙、权限与系统状态,并避开常见误操作。

它是什么

GCP VM 教學步驟三不是让你继续装东西。GCP VM 是运行在 Google Cloud 上的虚拟机,可理解为云上的一台 Linux 或 Windows 服务器,有 CPU、内存、硬盘和网卡。点完「创建实例」只是把机器开出来;GCP VM 教学步骤三通常指创建实例之后的连接与验收:用 SSH 登录、确认网络可达、检查账号权限。

为什么要先验收?因为状态 RUNNING 不代表你进得去。通道没通,后面装网站失败时,分不清是程序、防火墙还是账号问题。所以本步不是重装系统,也不是正式部署业务,而是先把远程管理通道跑通。

用 Console 右上角的 Cloud Shell 最省事,自带 gcloud。先看实例是否运行、有没有外部 IP:

gcloud compute instances list

若只有一台 Linux 测试机且状态为 RUNNING,再复制登录;它自动取第一台实例,少打错名字:

gcloud compute ssh "$(gcloud compute instances list --format='value(name)' | head -n 1)" --zone="$(gcloud compute instances list --format='value(zone.basename())' | head -n 1)"

前缀变成 VM 主机名,就说明 SSH 基本通了。接着在 VM 里执行下面几行:看账号和组、检查 sudo、看内网地址,并顺便看名称解析是否正常;sudo 退出码 0 表示可用。

whoami
id
sudo -n true
echo "sudo 检查退出码:$?"
hostname -I
getent hosts metadata.google.internal
getent hosts www.google.com

常见坑:

  • 列表为空,多半是项目、区域选错或没查看权限,别急着重开。
  • ping 不通不等于坏了,ICMP 常被挡;以 SSH,或 Windows 用 RDP 能否登录更可靠。
  • 没有外部 IP 时普通公网 SSH 可能进不去,不等于创建失败;可用 Cloud Shell、IAP 或放行 22 端口。
  • Permission denied 先查 IAM、OS Login、密钥和防火墙;登录账号通常不是 root,多台 VM 时自动取第一台也可能连错。

解决什么问题

刚建好 GCP VM,最稳登录入口是控制台 Compute Engine > VM 实例 > SSH。连不上多半是项目选错、没 RUNNING、没外部 IP、规则没匹配、密钥没注入或 IAM 不够。把只读命令复制进 Cloud Shell:先拿事实再改,越改越难判断。

gcloud auth list
gcloud config list
gcloud compute instances list --format="table(name,zone,status,networkInterfaces[0].accessConfigs[0].natIP,machineType)"
gcloud compute firewall-rules list --format="table(name,direction,priority,disabled,sourceRanges,allowed,targetTags)"
gcloud compute instances list --format=json
gcloud compute project-info describe --format=json
gcloud compute os-login describe-profile --format=json
gcloud projects get-iam-policy "$(gcloud config get-value project)" --format=json

按输出顺序串成一条线:

  1. 项目:核对账号和 project。坑:VM 在 A 项目,却在 B 项目找,列表当然空。
  2. 实例/状态:看 name、zone、status、machineType;只有 RUNNING 继续,STOPPED/TERMINATED 先处理。
  3. 外部 IP/防火墙规则:natIP 为空,本地 SSH 没目标;再看 disabled、sourceRanges、allowed、targetTags。坑:浏览器打不开 IP 只是没网站或没开 80/443;规则没生效常因 targetTags 不匹配。
  4. SSH 密钥:在实例、项目信息、OS Login 资料三段 JSON 里搜 ssh-keys、block-project-ssh-keys、enable-oslogin。控制台会临时处理密钥,本地连接要确认公钥位置。
  5. IAM 权限:按钮灰色或 permission denied,常是缺 compute.instances.get、OS Login 或 IAP 权限,不是网络坏;别用「加 Owner 最快」。

同时挡住三件事:

  • 费用:RUNNING 就计费,机器越大越贵;磁盘、静态外部 IP 不用也可能收费,用完停止并清理。
  • 权限过宽:看到 allUsers、allAuthenticatedUsers 或多人 Owner/Editor,先别照抄加权限。
  • 端口暴露:0.0.0.0/0 配 tcp:0-65535 或 all 是全网敞开。先试控制台 SSH/IAP;确需规则只开 tcp:22,来源写自己的 IP/32,别一上来开放全部端口。

怎么上手

进入 GCP 控制台,左侧菜单找「Compute Engine」→「虚拟机实例」,找到刚建好的 VM。确认「状态」是「正在运行」(RUNNING),刚启动就等几十秒再刷新;把「外部 IP」复制到记事本。这是 GCP VM 教學步驟三最容易漏的一步:连不上时要用它判断有没有公网入口,也避免连错机器。注意外部 IP 可能是临时的,关机再开会变;显示「无」时先别敲连接命令。

第一次连接优先点实例右侧的「SSH」按钮,浏览器会开终端,平台自动处理密钥和 IAM 授权,比自己配私钥省心。想用命令行,先在 Cloud Shell 选对项目,再复制整段执行,按提示输入实例名和 Zone;同样不用手动造密钥。

read -p "请输入实例名:" VM_NAME
read -p "请输入 Zone(例如 asia-east1-b):" VM_ZONE
gcloud compute ssh "$VM_NAME" --zone "$VM_ZONE"

小白常见坑是手动生成密钥或改 SSH 服务配置文件,权限一错就把自己锁在外面;初学阶段先别做。

看到命令行提示符后,先复制下面几条基础检查:

whoami
uname -a
df -h
systemctl status ssh

为什么查这些?第一条确认账号,第二条看内核和系统版本,第三条看磁盘是否快满,第四条看 SSH 服务是否显示 active (running)。它们能确认账号、内核、磁盘和 SSH 服务正常;磁盘满或服务异常,常会导致下次登录失败。若查看状态画面停住,按键盘上的 q 键退出;有些镜像服务名不同,若提示找不到服务,再试:

systemctl status sshd

如果连不上,按下面顺序排查,别一上来重装系统:

  1. 实例是否开机:回列表确认状态为「正在运行」,启动中先等它完成。
  2. 防火墙是否允许 22 端口:检查 VPC 防火墙规则,至少允许你当前公网 IP 访问 TCP 22;不要为了省事开放给 0.0.0.0/0。
  3. 账号是否有 IAM 登录权限:浏览器或命令行使用的 Google 账号,需要有 Compute OS Login 或 Compute Engine 实例管理相关权限;公司项目常由管理员分配。
  4. 外部 IP 是否存在:没有外部 IP,普通 SSH 就没有公网入口;确认创建时分配了外部 IP,或请管理员改用 IAP/内部连接。

按这个顺序查,通常能先排除最常见、也最容易修的问题。

与替代方案对比

在 GCP VM 教學步驟三里,先记住结论:第一次登录 Linux VM,最适合小白的是控制台实例列表里的「SSH」按钮。GCP 会在后台临时处理密钥、权限和浏览器连接,等于免手工管理密钥,你不用新建密钥、不用上传文件,也最不容易把私钥弄丢。常见坑是以为还要先下载密钥;其实不用,黑窗能输入命令就成功了。

如果要放进循环或脚本、一次连多台,下面这种 gcloud 登录方式更适合批量和脚本化运维:它读取当前项目和实例信息,自动创建或复用密钥,少做重复劳动。在 Cloud Shell 复制下面这段,先看项目是不是对的,再按列表输入 Linux 实例名和 zone。

gcloud config list
gcloud compute instances list --format='table(name,zone.basename(),status)'
read -r -p "Linux 实例名: " INSTANCE
read -r -p "zone(如 asia-east1-b): " ZONE
if [ -z "$INSTANCE" ] || [ -z "$ZONE" ]; then echo "实例名或 zone 不能为空"; else gcloud compute ssh "$INSTANCE" --zone="$ZONE"; fi

本地 SSH 客户端最灵活,可配合 VS Code、传文件工具、跳板机;但它要你自己生成密钥、配置元数据并保管私钥,任何一步漏了都连不上,出错概率更高。macOS/Linux 终端可复制下面命令;第一行输出要整行贴到「Compute Engine → 元数据 → SSH 密钥」或实例级 SSH 密钥,登录用户名就是 gcpuser。

mkdir -p "$HOME/.ssh"
KEY="$(mktemp "$HOME/.ssh/gcp_vm_ed25519_XXXXXX")"
rm -f "$KEY"
ssh-keygen -t ed25519 -f "$KEY" -C "gcp-vm" -N "" -q
chmod 600 "$KEY"
PUB="$(cat "$KEY.pub")"
echo "gcpuser:$PUB"
echo "私钥:$KEY"
  • 容易踩坑:项目选错会提示找不到实例;zone 不是项目 ID,而是 asia-east1-b 这种;VM 停止、没权限、没外部 IP 都会连不上。带 .pub 的是公钥,可以贴到 GCP;不带 .pub 的是私钥,不能发网盘、群聊或提交到 Git。空口令方便,但电脑丢失风险高。
  • 串口控制台:适合 VM 起不来、sshd 没启动、网络配错时看启动日志;它慢、交互差,不适合日常登录。小白别看到黑屏就判断死机,先确认是否启用了交互式串口,排查完记得关掉。
  • 远程桌面:更适合 Windows VM,因为图形界面和 RDP 是现成的;Linux 默认用命令行,硬装桌面再开端口,只会增加资源占用和安全风险,不是 Linux 首选。别把 3389 对全网开放。

简单选法:学习阶段用控制台 SSH;要批量化用 gcloud;熟了再玩本地 SSH;串口只救急,远程桌面主要留给 Windows。

最佳实践

GCP VM 教學步驟三连得上只是开始:最佳实践就四句话——人别混、门别大、配置能复原、账单别忘关。

人别混。每个要登录的人用自己的账号,只加 roles/compute.osLogin;走 IAP 再加 roles/iap.tunnelResourceAccessor。先查这四项发给管理员:

gcloud auth list --filter=status:ACTIVE --format='value(account)'
gcloud config list --format='value(core.project)'
gcloud compute firewall-rules list --format=json
gcloud organizations list --format='table(displayName,organizationId)' || echo "无组织权限时交给管理员即可"

别给 roles/owner,也别共用一个账号:日志只显示同一身份,误删都追不到人。第三段搜 0.0.0.0/0、"22";第四段交给管理员配组织级策略,统一禁「全网入站 22」,别的项目也挡得住。

门别大。别长期把 22 开给 0.0.0.0/0,扫描器几分钟就来撞。平时复制这条走 IAP(进 SSH 后输 exit 回来;默认第一台,多台先核对名字):

VM="$(gcloud compute instances list --format='csv[no-heading](name,zone.basename())' | head -n 1)"
gcloud compute ssh "${VM%,*}" --zone "${VM#*,}" --tunnel-through-iap

只有确实要直连时,才复制下面这块,只放行当前公网 IP:

MY_IP="$(curl -s https://ipinfo.io/ip)/32"
gcloud compute firewall-rules create allow-ssh-from-my-ip 
  --network=default --allow=tcp:22 --source-ranges="$MY_IP" 
  --description="临时 SSH:仅当前公网 IP" 
  || gcloud compute firewall-rules update allow-ssh-from-my-ip --source-ranges="$MY_IP"

坑:公网 IP 会变,连不上重跑这块,别改回全网;IAP 不需要把 22 暴露给公网,别多此一举加全网规则。

配置能复原,练完就收摊。按 Debian/Ubuntu 举例:脚本固化环境、快照留还原点、日志看结果。

cat > startup.sh <<'EOF'
#!/bin/bash
echo "booted at $(date)" >> /var/log/practice-boot.log
apt-get update
apt-get install -y nginx
systemctl enable nginx
EOF
VM="$(gcloud compute instances list --format='csv[no-heading](name,zone.basename())' | head -n 1)"
gcloud compute instances add-metadata "${VM%,*}" --zone "${VM#*,}" 
  --metadata-from-file=startup-script=startup.sh
DISK_URL="$(gcloud compute instances describe "${VM%,*}" --zone "${VM#*,}" --format='value(disks[0].source)')"
gcloud compute disks snapshot "$(basename "$DISK_URL")" --zone "${VM#*,}" 
  --snapshot-names="practice-$(date +%Y%m%d-%H%M%S)"
gcloud logging read 'resource.type="gce_instance"' --limit=20 --freshness=1h 
  --format='table(timestamp,resource.labels.instance_id,logName)'

坑:脚本每次开机都跑,别写删数据、改密码;换镜像要改安装命令;日志晚 1–2 分钟。结束先停:

VM="$(gcloud compute instances list --format='csv[no-heading](name,zone.basename())' | head -n 1)"
gcloud compute instances stop "${VM%,*}" --zone "${VM#*,}"

停止后磁盘、静态 IP 仍计费。只有快照已存且不再用才复制下面,它会删第一台,不可恢复:

VM="$(gcloud compute instances list --format='csv[no-heading](name,zone.basename())' | head -n 1)"
gcloud compute instances delete "${VM%,*}" --zone "${VM#*,}" --quiet

留记录。把真实命令、截图路径、结论写下来,复盘交接不靠回忆:

mkdir -p screenshots
VM="$(gcloud compute instances list --format='csv[no-heading](name,zone.basename())' | head -n 1)"
{
  echo "# GCP VM 教學步驟三 记录 $(date +%F)"
  echo "连接命令:gcloud compute ssh ${VM%,*} --zone ${VM#*,} --tunnel-through-iap"
  echo "异常截图:screenshots/,文件名带时间"
  echo "排查结论:现象 → 改了什么 → 是否恢复 → 下次谁接手"
} > vm-note.md
cat vm-note.md

坑:只存红字图不写结论,过两周自己也看不懂;有密钥、令牌先打码。

常见问题(FAQ)

步骤三一定要用 gcloud 吗?

不一定。小白先用控制台 SSH,熟悉后再用 gcloud 或本地客户端。

SSH 连不上最常见原因是什么?

多为实例未运行、没有外部 IP、防火墙拦住 22 端口或 IAM 权限不足。

开放 22 端口安全吗?

长期对全网开放不安全,建议用 IAP 或只放行自己的来源 IP。

练习完要不要删除 VM?

要。确认数据已备份后停止或删除,避免磁盘、IP 和实例继续计费。

不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。

查看代维服务 →

发表评论