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

小白教程:4. 配置VPC网络

TL;DR:用控制台和 gcloud 建好自定义 VPC、子网与防火墙规则,再让 VM 安全连通并学会检查结果。

开始前你需要准备

先准备一个可用的 GCP 项目:VPC、子网、防火墙和 VM 都挂在项目里,也会计费,所以要确认结算账号已启用;没有项目就先“新建项目”。坑是项目选错或没绑账单,后面会以为权限坏了,资源也找不到。

gcloud init
gcloud projects list
gcloud beta billing projects describe "$(gcloud config get-value project)"

命令可直接复制:初始化并选项目、查看项目、查当前项目结算;看到 billingEnabled: true 再继续。

账号至少要有创建网络、子网、防火墙规则和 VM 的权限;公司项目请管理员授权,常用 Compute Network Admin 加 Compute Instance Admin。只看得到项目不等于能建资源,Viewer 常到最后才报 Permission denied。

再在文档里写下规划,别边点边想:

  • 用途:测试环境,只验证内网连通。
  • 区域:只用一个,如 asia-east1,避免跨区流量费。
  • 子网网段:一个私有网段,如 10.10.0.0/24,别和公司内网或其他 VPC 重叠。
  • 名称规则:小写加短横线,如 vpc-demo、subnet-demo、fw-ssh、vm-a,后面少写错。

操作环境二选一:浏览器打开 console.cloud.google.com,或用上面初始化好的 gcloud 命令行。后续计划一到两台 Linux VM 放同一 VPC 中,用内网连通、远程登录验证;先别开公网 IP,更安全,也方便判断防火墙是否生效。

整体思路

把 VPC 想成项目里的“虚拟大网”:它管边界和网段;子网按区域划分,例如 asia-east1。创建 VM 时再选 VPC 和子网。坑:子网不是可用区,VM 建好后也不能随手换 VPC。

推荐自定义模式 VPC,因为自动模式会预铺很多子网,容易选错。入站规则按最少开放原则配:先让内部互通和 SSH 可用,再逐步扩展。

gcloud services enable compute.googleapis.com iap.googleapis.com
gcloud compute networks create vpc-demo --subnet-mode=custom
gcloud compute networks subnets create subnet-a --network=vpc-demo --region=asia-east1 --range=10.10.0.0/24
gcloud compute firewall-rules create vpc-demo-allow-internal --network=vpc-demo --allow=tcp,udp,icmp --source-ranges=10.10.0.0/24
gcloud compute firewall-rules create vpc-demo-allow-ssh --network=vpc-demo --allow=tcp:22 --source-ranges=35.235.240.0/20 --target-tags=ssh

这样配边界清楚。SSH 只给 IAP 固定来源段,别把 22 开给 0.0.0.0/0;创建 VM 要加 ssh 标签,否则规则不生效。加子网要补来源范围。

网络连通主要看三件事:

  1. 路由是否可达:默认路由通常足够,别乱删或重复加。
  2. 防火墙是否放行:规则没命中,包会被丢。
  3. 目标 VM 上服务是否监听:端口没起,前面都开了也没用。

按顺序查少走弯路。若 VM 没有外部地址又要访问互联网,再按需引入 Cloud NAT;它只管出站,不会让外网主动连进来,也不能替代防火墙。

详细步骤一:创建自定义 VPC 与子网

在控制台进入「网络 > VPC 网络 > VPC 网络」页面,点「创建 VPC 网络」。名称填 vpc-demo-custom,模式选「自定义」,别直接用「自动模式」:它会在每个区域自动建子网,网段难控,以后连本地机房或其他 VPC 易撞段。

  1. 在「子网」点「添加子网」,可加一条或多条;名称写清用途,如 subnet-mgmt 管理、subnet-app 应用、subnet-data 数据。
  2. 每条都选区域(如 asia-east1)、填私有地址网段(如 10.10.0.0/24),并开启或关闭网络流日志:管理可开,应用/数据先关,省日志费。

网段用 10/8、172.16/12、192.168/16 这类私网,避开本地机房、其他 VPC 和互联网段(公网地址)。重叠会让 VPN、Peering、路由出问题,改起来常要重建;区域选错、流日志全开、复制示例不改名也都是常见坑。

在 Cloud Shell 用 gcloud 时保持同样参数。先把项目编号、区域和名称换成自己的,避免复制示例导致重名,再整段复制执行:

export PROJECT_ID="123456789012"
export REGION="asia-east1"
export VPC_NAME="vpc-demo-custom"
export MGMT_SUBNET="subnet-mgmt"
export APP_SUBNET="subnet-app"
gcloud compute networks create "$VPC_NAME" --project="$PROJECT_ID" --subnet-mode=custom
gcloud compute networks subnets create "$MGMT_SUBNET" --project="$PROJECT_ID" --network="$VPC_NAME" --region="$REGION" --range=10.10.0.0/24 --enable-flow-logs
gcloud compute networks subnets create "$APP_SUBNET" --project="$PROJECT_ID" --network="$VPC_NAME" --region="$REGION" --range=10.20.0.0/24

新建时不加 --enable-flow-logs 即关闭流日志;页面改了网段或区域,脚本也要同步改。

详细步骤二:配置防火墙规则与路由

下面按上一节示例名 my-vpc、子网 10.10.0.0/16、区域 asia-east1 写;若改过名称,把命令里对应文字替换。先别开全网,按“够用就行”的顺序做。

  1. 先建内部互通规则:只让同一 VPC 的私有网段互访,业务机能通信,公网进不来。多个子网就把多个 CIDR 用逗号写进 –source-ranges,别图省事写 0.0.0.0/0。防火墙是 VPC 级的,先收紧来源更安全。这里用 –target-tags=private-vm 限定范围,创建 VM 时要打同名网络标签,否则规则建了也不生效。

    gcloud compute firewall-rules create allow-internal-private 
      --network=my-vpc 
      --direction=INGRESS 
      --priority=1000 
      --action=ALLOW 
      --rules=tcp,udp,icmp 
      --source-ranges=10.10.0.0/16 
      --target-tags=private-vm
  2. 再建管理规则:普通 SSH 远程登录只放行管理员当前公网 IP,脚本会自动取 IP 并补 /32;宽带或代理出口变了要更新。也可二选一用 IAP:只放行 35.235.240.0/20,并给账号 IAP-Secured Tunnel User;不建议开放 0.0.0.0/0。管理规则同样要给 VM 打对应标签;IAP 走 Google 隧道,换网络不用改来源。

    ADMIN_ADDR="$(curl -fsS https://ipinfo.io/ip | tr -d 'n')"
    gcloud compute firewall-rules create allow-ssh-admin 
      --network=my-vpc 
      --direction=INGRESS 
      --priority=900 
      --action=ALLOW 
      --rules=tcp:22 
      --source-ranges="${ADMIN_ADDR}/32" 
      --target-tags=ssh-vm
    gcloud projects add-iam-policy-binding "$(gcloud config get-value project)" 
      --member="user:$(gcloud config get-value account)" 
      --role=roles/iap.tunnelResourceAccessor
    gcloud compute firewall-rules create allow-ssh-iap 
      --network=my-vpc 
      --direction=INGRESS 
      --priority=950 
      --action=ALLOW 
      --rules=tcp:22 
      --source-ranges=35.235.240.0/20 
      --target-tags=iap-vm
  3. 理解默认行为:入站默认拒绝、出站默认允许;规则按优先级匹配,数字越小越优先。除目标标签外,也可用 –target-service-accounts 指定服务账号限定 VM 范围,但别和标签混用。

  4. 路由一般不用手改,系统默认路由一般够用,改错容易把流量带进黑洞。只有 VM 没有外部地址却要 apt/yum 下载更新时,再配 Cloud NAT,并检查是否仍有 0.0.0.0/0 默认路由。出站允许不等于无外网 IP 能上网,NAT 负责地址转换。Cloud NAT 只管出站,不会把公网 SSH 放进来。

    gcloud compute routers create my-vpc-router 
      --network=my-vpc 
      --region=asia-east1
    gcloud compute routers nats create my-vpc-nat 
      --router=my-vpc-router 
      --region=asia-east1 
      --nat-all-subnet-ip-ranges 
      --auto-allocate-nat-external-ips
    gcloud compute routes list

详细步骤三:给 VM 绑定网络并准备测试

先确认项目 ID 没选错,再进 Compute Engine 创建 Linux 实例。展开“网络接口”,网络选刚建好的 VPC,子网选同区域子网,VM 可用区也要落在该区域。创建页常默认填 default,这是最常见的坑;选错后,后面的防火墙和测试都会测错地方。

  1. 外部 IP 按需给。练习安全配置先不分配,少暴露在公网;别以为没公网 IP 就管不了,用 IAP(需提前授权)或堡垒机管理。要公网再分配。命令会提示输入前几步记下的值,整段复制执行;–no-address 不给公网 IP,–tags=lab-test 贴标签,让防火墙只管指定机器。
    read -r -p "输入项目 ID:" PROJECT_ID
    gcloud config set project "$PROJECT_ID"
    read -r -p "输入刚建好的 VPC 名称:" VPC_NAME
    read -r -p "输入对应区域的子网名称:" SUBNET_NAME
    read -r -p "输入可用区(如 asia-east1-a):" ZONE
    gcloud compute instances create vm-vpc-test 
      --network="$VPC_NAME" 
      --subnet="$SUBNET_NAME" 
      --zone="$ZONE" 
      --machine-type=e2-micro 
      --image-family=debian-12 
      --image-project=debian-cloud 
      --no-address 
      --tags=lab-test
  2. 建好后马上记录。名称、区域/可用区、内部 IP 和标签要抄到笔记里,顺便核对网络不是 default。执行:
    gcloud compute instances list 
      --filter="name=vm-vpc-test" 
      --format="table(name,zone,networkInterfaces[0].networkIP,networkInterfaces[0].network,networkInterfaces[0].subnetwork,tags.items)"
  3. 旧 VM 别硬改。若已在错误网络,先别强行改配置;GCP 网络接口通常创建时绑定,先备份,再用快照或镜像重建、迁移更稳。

验证结果

别只看“创建成功”。控制台进 VPC 网络、子网、防火墙,或复制第一条命令列出结果,按设计表对 名称、区域、网段和方向(ingress/egress)都要一致。新手常选错项目/区域,或把入站写出站、来源范围写太宽。

gcloud compute networks list
gcloud compute networks subnets list
gcloud compute firewall-rules list --format="table(name,network.basename(),direction,priority,sourceRanges.list():label=SRC,targetTags.list():label=TAGS,allowed,denied)"

再打开 VM 详情页,看“网络接口”是否属于目标 VPC、子网,并核对内部地址和网络标签;也可跑第二条命令。坑是把外部 IP 当内部地址,或规则带标签但 VM 没打标签,规则就不会命中。

gcloud compute instances list --format="table(name,zone.basename(),networkInterfaces[0].network.basename():label=VPC,networkInterfaces[0].subnetwork.basename():label=SUBNET,networkInterfaces[0].networkIP:label=INTERNAL_IP,tags.items.list():label=TAGS)"

连通测试用同子网两台 VM。在授权来源的浏览器 SSH 窗口执行第三条,按提示填另一台内部地址和用户名;能 ping 通、SSH 登录成功,换未授权来源应被拒绝,才符合预期。若两边都通,查残留的“全内网放行”规则;只 ping 不通先查路由。

read -p "粘贴目标 VM 的内部地址: " IP
read -p "粘贴登录用户名: " USER
ping -c 4 "$IP"
ssh -o BatchMode=yes -o ConnectTimeout=5 "$USER@$IP" 'echo SSH-OK' || echo "SSH 未成功"

若开了流日志,用第四条看最近 ALLOW/DENY:无记录多半没发流量或路由不对,DENY 查防火墙优先级,ALLOW 仍失败查 sshd 是否监听、账号密钥,就能快速判断问题在哪。

gcloud logging read 'logName:"compute.googleapis.com/vpc_flows" AND (jsonPayload.disposition="ALLOW" OR jsonPayload.disposition="DENY")' --limit=20 --freshness=10m --format="table(timestamp,jsonPayload.connection.src_ip,jsonPayload.connection.dest_ip,jsonPayload.connection.dest_port,jsonPayload.disposition)"

常见坑与解决办法

配置VPC网络时,别直接选自动模式:它会在各区域自动生成很多子网,容易网段冲突;和本地机房、其他 VPC 重叠还会影响后续互联。新项目改用自定义模式,创建前先做地址规划,冲突时迁移 VM 后删除重建子网,因为 GCP 不能改子网网段。电脑终端先执行,确认项目没选错:

gcloud config list project
gcloud compute networks subnets list --format="table(name,region,network,ipCidrRange)"
gcloud compute networks create vpc

常见问题(FAQ)

小白该用自动模式还是自定义模式?

建议自定义模式,便于控制区域、网段和后续扩展,生产环境更清晰。

VM 没有外部地址还能访问互联网吗?

默认不能,可配置 Cloud NAT,或用 IAP 仅做管理连接。

防火墙规则已开放,为什么 SSH 还是失败?

检查目标标签、来源地址、优先级、VM 系统防火墙和组织策略。

创建后还能把 VM 换到另一个 VPC 吗?

通常不能直接换,建议重建 VM 或先规划迁移方案。

一个 VPC 可以跨多个区域使用吗?

可以,VPC 是全局资源,子网才按区域划分并承载 VM。

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

查看代维服务 →

发表评论