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

使用远端SSH连线至GCP的设定入门

TL;DR:本文用小白能懂的步骤讲清 GCP VM 的远程 SSH 配置:防火墙、密钥、gcloud 登录、常见报错与安全加固。

它是什么:GCP 远程 SSH 连接配置

简单说,GCP 远程 SSH 连接配置就是给云服务器开一扇“带身份验证的门”:你在本地电脑用密钥或账号证明身份,安全进入 GCP VM 的命令行。密钥是一对,公钥放 VM 或项目元数据,私钥只留自己电脑;账号方式多指 Google 账号配合 IAM/OS Login,并非随便设密码。别人即使知道 IP 也进不来。

常见入口有三种:控制台的浏览器 SSH,平台临时处理密钥,最省事;本地终端的 gcloud 命令,适合看过程;本地终端 SSH 客户端直接连外部 IP,最接近传统 Linux。新手先用前两种。

完整设定通常看六件事:VM 状态、外部 IP、防火墙规则、项目权限、Linux 用户、密钥或 OS Login。为什么一起看?因为失败常只显示“连不上”,原因却可能是机器没开、门牌号变了、门被挡、保安不认人,或钥匙没放对。

第一次在本机使用,复制下面这段到已装 Google Cloud CLI 的终端;没装就用控制台 Cloud Shell。前两条会登录并选项目,按提示做;Cloud Shell 可从第三行开始。后面几条只查看,不改云服务器:

gcloud auth login
gcloud init
gcloud config list
gcloud compute instances list --format='table(name,zone.basename(),status,networkInterfaces[0].accessConfigs[0].natIP:label=EXTERNAL_IP)'
gcloud compute firewall-rules list --format='table(name,direction,allowed,sourceRanges)'
gcloud compute project-info describe --format='yaml(commonInstanceMetadata.items)'

这几行把项目、状态、外部 IP、防火墙和元数据打印出来,等于把门牌、门、保安、钥匙摆到桌面上。再复制下面这段试连,gcloud 会自动挑第一台 RUNNING 的 VM,并处理密钥和用户名:

VM_INFO="$(gcloud compute instances list --filter='status=RUNNING' --format='csv[no-heading](name,zone.basename())' | head -n 1)"
VM_NAME="$(printf '%s' "$VM_INFO" | cut -d, -f1)"
VM_ZONE="$(printf '%s' "$VM_INFO" | cut -d, -f2)"
gcloud compute ssh "$VM_NAME" --zone "$VM_ZONE"

小白最容易踩的坑:

  • 用错项目:列表为空,先核对当前项目,别以为 VM 消失了。
  • VM 停机、没有外部 IP,或重启后外部 IP 变了。
  • 删了默认防火墙、公司网络封了 TCP 22,或账号缺少 Compute Engine 权限。
  • 拿 root 直登被拒、私钥权限太开放、A 账号配钥匙却用 B 账号连接。
  • 若报“空实例名”或参数错误,多半是当前项目没有 RUNNING 实例;逐项回看,别急着重装系统。

解决什么问题:安全、可控地管理 VM

使用远程 SSH 连接 GCP,核心是安全、可控地管理 VM:不用跑到机房,也不用接显示器,在电脑前就能安装软件、查看日志、改配置、重启服务,正好适合网站和后台服务的日常运维。连进 Ubuntu/Debian VM 后,可先复制下面几行;第 4 行是改配置前的备份习惯,最后一行按已装 nginx 的网站服务器举例:

sudo apt update
sudo apt install -y curl
sudo journalctl -n 50 --no-pager
sudo cp /etc/hosts /etc/hosts.bak
sudo systemctl restart nginx

为什么先备份?配置少一个符号就可能启动失败。小白常见坑:系统不是 Ubuntu/Debian 时会提示 apt 找不到;没装 nginx 或服务名不同,重启会失败;别随便重启 SSH,否则可能把自己关在门外。

安全方面,别只靠密码。用密钥登录,再用防火墙白名单只允许自己的公网 IP 访问 22 端口,可以减少密码爆破、误开端口和多人共用账号的风险。每人一个账号和公钥,日志能追到谁改了什么;离职只删对应公钥。先在本机终端复制:

curl -s https://ipinfo.io/ip
cat "$HOME/.ssh/id_ed25519.pub"

如果没有 .pub 文件,再复制生成命令:

ssh-keygen -t ed25519 -C "gcp-vm-key" -f "$HOME/.ssh/gcp_vm_ed25519"
cat "$HOME/.ssh/gcp_vm_ed25519.pub"

只上传 .pub 公钥,私钥留本机;提示设置口令短语时设一个并记住,提示覆盖旧密钥要选 no。坑:Cloud Shell 里查到的是 Cloud Shell 的出口 IP,不是你电脑 IP;家里、公司、热点切换后公网 IP 会变,白名单也要更新。

在 GCP 控制台右上角打开 Cloud Shell,复制下面几行确认项目、VM 和防火墙规则:

gcloud config list --format="value(core.project)"
gcloud compute instances list --format="table(name,zone,status,EXTERNAL_IP)"
gcloud compute firewall-rules list --format="table(name,direction,sourceRanges,allowed)"

若来源范围是 0.0.0.0/0,表示全网都能敲 22 端口,别长期这样开。即使密钥放错、IP 变了或 sshd 写错,也能靠正确配置恢复访问:让有权限的人通过 Cloud Shell、控制台自带的串行控制台或 IAP 安全通道排错,临时加一条只放当前 IP 的规则,修好后删除临时规则;这样不用把 SSH 端口直接暴露给全网。

怎么上手:从小白可复制的步骤开始

使用远端 SSH 连线至 GCP 的设置,顺序别反:先让 VM 跑起来,用浏览器确认能进,再只给自己的 IP 开 22,最后本地连接并复查。这样出错能分清是实例、账号还是网络。

  1. 建 VM。控制台进「Compute Engine」→「VM 实例」→「创建实例」,选可用区、填实例名,镜像用默认 Debian/Ubuntu,保留外部 IP。创建后记下区域/可用区、实例名、外部 IP,确认状态为 RUNNING。坑:要 asia-east1-b 这种可用区,不是 asia-east1;选「无外部 IP」普通 SSH 连不上;临时 IP 重启可能变。

  2. 先浏览器登录。点「SSH」→「在浏览器窗口中打开」。能出现命令行,说明实例、账号、权限基本正常;弹窗被拦、网络挡 WebSocket、权限不足先处理。先验证再改防火墙,避免问题混在一起。

  3. 需要公网 22 才放行。下面按 macOS、Linux 或 WSL 写,同一终端别关。按提示输入项目 ID、实例名、可用区;它查你的公网 IP,建项目级 TCP 22 规则,配合目标标签就是实例级效果,并收紧常见默认规则。坑:旧规则或别的 22 规则仍含 0.0.0.0/0,就不算仅允许自己;自定义 VPC 要改网络名,换网络后 IP 变了要更新规则,PowerShell 语法不同。

    read -r -p "输入项目ID:" PROJECT
    read -r -p "输入实例名:" INSTANCE
    read -r -p "输入可用区(例如 asia-east1-b):" ZONE
    MY_IP="$(curl -s https://api.ipify.org)/32"
    echo "我的公网 IP:$MY_IP"
    gcloud auth login
    gcloud config set project "$PROJECT"
    if ! gcloud compute firewall-rules describe allow-ssh-from-my-ip >/dev/null 2>&1; then
      gcloud compute firewall-rules create allow-ssh-from-my-ip --network default --allow tcp:22 --source-ranges "$MY_IP" --target-tags ssh-from-my-ip
    fi
    gcloud compute instances add-tags "$INSTANCE" --zone "$ZONE" --tags ssh-from-my-ip
    if gcloud compute firewall-rules describe default-allow-ssh >/dev/null 2>&1; then
      gcloud compute firewall-rules update default-allow-ssh --source-ranges "$MY_IP"
    fi
  4. 本地连接或自管密钥。第一段最省心,Cloud SDK 临时建密钥;变量就是实例名和可用区。要自管密钥时,第二段生成密钥,把公钥写进实例元数据里的 Linux 用户,也可追加到该用户账号授权文件。坑:项目级元数据影响所有 VM,优先用实例级;覆盖 ssh-keys 会挤掉同事公钥;启用 OS Login 时元数据公钥可能被忽略。

    gcloud compute ssh "$INSTANCE" --zone "$ZONE"
    KEY="$HOME/.ssh/gcp_vm_ed25519"
    if [ ! -f "$KEY" ]; then
      ssh-keygen -t ed25519 -C "gcp-ssh" -f "$KEY"
    fi
    PUBKEY="$(cat "$KEY.pub")"
    gcloud compute instances add-metadata "$INSTANCE" --zone "$ZONE" --metadata "ssh-keys=alice:$PUBKEY"
    ssh -i "$KEY" "alice@$(gcloud compute instances describe "$INSTANCE" --zone "$ZONE" --format="get(networkInterfaces[0].accessConfigs[0].natIP)")"
  5. 登录后体检并重连。在远程窗口查 Linux 用户、用户组、sudo 权限、系统时间和磁盘空间。默认用户通常不是 root;时间偏了影响证书和日志,磁盘满会写不进授权文件。先在远程窗口退出,回本地终端再连一次;若关过终端,变量消失,要重跑第一块。

    whoami
    id
    sudo -n true && echo "sudo 可用" || echo "sudo 需要密码或不可用"
    timedatectl
    df -h
    exit
    gcloud compute ssh "$INSTANCE" --zone "$ZONE"

与替代方案对比:浏览器 SSH、gcloud、本地 SSH

做“使用远端 SSH 连接至 GCP 的设置”时,先别急着背命令:临时看一眼和天天管理,选法不一样。浏览器 SSH 最省事,在控制台点“SSH”即可,不用装软件、不用找密钥,适合临时排错、看日志、重启服务。因为 GCP 会在后台处理凭证和连接通道;缺点是依赖控制台和当前账号,网页断开要重来,自动化和文件传输体验偏弱。小白常误以为按钮能点就等于 22 端口已对全网开放,也容易把生产变更全靠手点,事后难复盘。

要批量登录或写脚本,用 gcloud 命令更顺手:它能自动生成/复用部分密钥,把项目、区域、实例名交给命令处理;代价是本机要先安装并登录 SDK。安装后复制执行:

gcloud init
PROJECT_ID="$(gcloud config get-value project)"
gcloud compute instances list --project "$PROJECT_ID" --format='csv[no-heading](name,zone.basename())' | while IFS=, read -r VM_NAME ZONE; do
  gcloud compute ssh "$VM_NAME" --zone "$ZONE" --project "$PROJECT_ID" --quiet --command 'uptime'
done

这段会对当前项目每台实例运行一次简单检查,先确认项目没选错。没装 SDK、账号没权限、OS Login 或防火墙没配好都会失败;团队环境还要留意 gcloud 可能把公钥写入项目/实例元数据,别把私钥或令牌提交仓库。

长期管理用本地 SSH 客户端最灵活,终端、VS Code、端口转发、文件同步都好配;但密钥、IP 白名单、端口、用户名和 sudo 权限都要自己维护。若已有 gcloud 生成的默认密钥,在 macOS、Linux 或 WSL 终端复制执行,按提示填外部 IP:

read -r -p "请输入 VM 的外部 IP: " EXTERNAL_IP
chmod 600 ~/.ssh/google_compute_engine
ssh -p 22 -i ~/.ssh/google_compute_engine "$(whoami)@$EXTERNAL_IP"

先收紧私钥权限,是因为 SSH 会拒绝“谁都能读”的密钥。常见坑:实例只有内网 IP、临时外部 IP 重启后变了、防火墙没放行你当前公网 IP、用户名不是本机用户名、误用 root 直登。若提示密钥不存在,先按团队方式生成并上传公钥;长期用建议固定 IP 或走 IAP/堡垒机,并给每个人单独密钥。

图形面板或第三方工具更直观,适合不熟悉命令行的人,但可能增加成本、权限边界和审计复杂度。选前问清:钱谁付、最小权限到哪一层、日志能否和 GCP 审计对上;不要把私钥上传到来路不明的工具。

最佳实践:少开权限、留好退路

连得上只是第一步,别让整台机器变成谁都能进的公共门。新手最常犯的错,是图方便把 .pem 私钥丢进微信群、顺手提交到代码仓库,或者防火墙填了 0.0.0.0/0。前者等于把家门钥匙拍照发朋友圈,后者等于直接把门拆了。更省心的做法是让 GCP 替你管人:开启 OS Login,用 IAM 发权限,谁离职就在控制台删账号,不用登进机器挨个清理 authorized_keys。下面这段在本地 Cloud SDK 直接复制跑,会自动读当前项目和你的登录邮箱,而且只给普通登录角色、不给管理员,正是「少开权限」:

export PROJECT_ID=$(gcloud config get-value project)
export MY_EMAIL=$(gcloud config get-value account)
gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE
gcloud projects add-iam-policy-binding "$PROJECT_ID" 
  --member="user:$MY_EMAIL" 
  --role="roles/compute.osLogin"

接着收紧防火墙。GCP 自带的 default-allow-ssh 默认放行全网,先查自己此刻的公网 IP,再改成只认这一条:

export MY_IP="$(curl -4 -s ifconfig.me)/32"
echo "只放行:$MY_IP"
gcloud compute firewall-rules update default-allow-ssh --source-ranges="$MY_IP"

这里有个大坑:家庭宽带 IP 隔几天就变,一变你就被自己锁在门外了。所以动防火墙之前,先去控制台点一次「在浏览器窗口中打开」的 SSH,确认这条应急通道能进去——它走 Google 中转,不依赖你刚改的 22 端口规则。确认能开再改,改完也别关旧窗口,另开终端测通了再退。以后换网络只要重跑上面两行更新 IP,千万别为了「先连上再说」又临时加回 0.0.0.0/0;真加过,事后一定回头清掉。

再从浏览器 SSH 里把机器本身锁死:禁密码、禁 root 直登。密码会被暴力猜,root 直登一旦出事连缓冲都没有。

sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart ssh 2>/dev/null || sudo systemctl restart sshd

最后一行是给小白留的兼容:Ubuntu 叫 ssh、CentOS 叫 sshd,两个都试一遍就不会报错。同样别关旧窗口。密钥建议每 3 个月轮换一次,OS Login 下重新生成本地密钥、旧的自然失效;再到控制台的 Cloud Audit Logs 看登录记录,默认就会记下谁、何时、从哪进来。改配置前顺手打份快照当后悔药,改崩了能回滚:

export ZONE=$(gcloud config get-value compute/zone 2>/dev/null)
if [ -z "$ZONE" ]; then ZONE=asia-east1-b; fi
export DISK_NAME=$(gcloud compute disks list --zones="$ZONE" --format='value(name)' | head -n 1)
gcloud compute disks snapshot "$DISK_NAME" --zone="$ZONE" --snapshot-names="ssh-backup-$(date +%F)"

记住两句话就够了:人走权收、私钥永不进聊天群;浏览器 SSH 先开、快照先打、旧窗口最后关。退路留好,才敢把权限收小。

常见问题(FAQ)

SSH 连不上 GCP VM,先查什么?

先查实例状态、外部 IP、防火墙 TCP 22、当前公网 IP、账号权限和日志报错。

没有外部 IP 还能远程连接吗?

可以,用内网 IP 配合堡垒机、IAP 隧道或 VPN,再限制来源与访问审计。

一定要放行 22 端口给所有人吗?

不建议。只放行自己的 IP 或跳板机网段,并配合密钥、OS Login 与日志。

浏览器 SSH 和 gcloud 命令选哪个?

临时登录选浏览器 SSH,批量操作或脚本化选 gcloud,长期管理可用本地 SSH。

把私钥放在项目元数据里安全吗?

仅适合临时测试。生产环境建议用 OS Login 或 IAM 统一管理并定期轮换。

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

查看代维服务 →

发表评论