Google Cloud 自动更换服务器公网 IP 教程(无需删除实例

Google Cloud 自动更换服务器公网 IP 教程(无需删除实例)

在数据采集、代理节点、测试环境等场景中,服务器公网 IP 可能会被目标网站限制。使用 Google Cloud Compute Engine 时,可以通过脚本自动更换实例的公网 IP(External IP),无需删除实例、无需重新配置环境。

原理说明

Compute Engine 实例的公网 IP 由网络接口的 Access Config 提供。只要执行:

  • 删除 Access Config(解绑外部 NAT 配置)
  • 重新添加 Access Config(系统重新分配临时公网 IP)

即可触发重新分配一个新的临时公网 IP(Ephemeral External IP)。实例本身不会删除或重启,因此已安装的软件与配置通常不会丢失。

准备工作

1)安装 Google Cloud CLI(gcloud)

sudo apt update
sudo apt install google-cloud-cli -y

2)登录并选择项目

gcloud auth login
gcloud config set project YOUR_PROJECT_ID

说明:本文以命令行方式演示。实际生产环境建议使用服务账号(Service Account)进行授权,以便自动化执行。

一键自动更换公网 IP 脚本

下面脚本会自动读取实例当前外部网卡配置名称(Access Config Name)、记录旧 IP、执行解绑与重新绑定,并输出新 IP(含等待与重试)。

创建脚本文件:

nano change_ip.sh

粘贴脚本内容(只需要修改 VM_NAMEZONE):

#!/usr/bin/env bash
set -euo pipefail

# ====== 修改这里 ======
VM_NAME="YOUR_VM_NAME"
ZONE="YOUR_ZONE"
# =====================

ACCESS_CONFIG_NAME="$(gcloud compute instances describe "$VM_NAME" \
  --zone="$ZONE" \
  --format="get(networkInterfaces[0].accessConfigs[0].name)")"

OLD_IP="$(gcloud compute instances describe "$VM_NAME" \
  --zone="$ZONE" \
  --format="get(networkInterfaces[0].accessConfigs[0].natIP)")"

echo "[INFO] VM=$VM_NAME"
echo "[INFO] ZONE=$ZONE"
echo "[INFO] old_ip=$OLD_IP"
echo "[INFO] access_config=$ACCESS_CONFIG_NAME"

echo "[INFO] deleting access config..."
gcloud compute instances delete-access-config "$VM_NAME" \
  --access-config-name="$ACCESS_CONFIG_NAME" \
  --zone="$ZONE"

# 给系统一点时间回收/重新分配
sleep 5

echo "[INFO] adding access config..."
gcloud compute instances add-access-config "$VM_NAME" \
  --access-config-name="$ACCESS_CONFIG_NAME" \
  --zone="$ZONE"

# 等待新IP出现(最多30秒)
NEW_IP=""
for i in {1..30}; do
  NEW_IP="$(gcloud compute instances describe "$VM_NAME" \
    --zone="$ZONE" \
    --format="get(networkInterfaces[0].accessConfigs[0].natIP)")" || true

  if [[ -n "$NEW_IP" ]]; then
    echo "[INFO] try#$i new_ip=$NEW_IP"
  fi

  if [[ -n "$NEW_IP" && "$NEW_IP" != "$OLD_IP" ]]; then
    break
  fi

  sleep 1
done

echo "[RESULT] old_ip=$OLD_IP"
echo "[RESULT] new_ip=$NEW_IP"

if [[ -z "$NEW_IP" ]]; then
  echo "[WARN] 未获取到新IP(异常)"
  exit 2
fi

if [[ "$NEW_IP" == "$OLD_IP" ]]; then
  echo "[WARN] 新IP与旧IP相同:可能被重新分配到相同地址。可稍后再次执行。"
  exit 3
fi

echo "[OK] IP changed: $OLD_IP -> $NEW_IP"

执行脚本

1)赋予执行权限

chmod +x change_ip.sh

2)运行脚本

bash change_ip.sh

执行成功后,会输出旧 IP 与新 IP,例如:

[RESULT] old_ip=34.xxx.xxx.xxx
[RESULT] new_ip=35.xxx.xxx.xxx
[OK] IP changed: 34.xxx.xxx.xxx -> 35.xxx.xxx.xxx

后台运行(可选)

如果希望脚本在后台运行并记录日志,可以使用 nohup:

nohup bash change_ip.sh > change_ip.log 2>&1 &

查看日志:

tail -n 200 change_ip.log

注意事项

  • 仅对临时公网 IP(Ephemeral)有效:如果实例绑定的是静态公网 IP(Reserved/Static),解绑再绑通常不会自动获得新 IP,需要先释放或更换静态地址策略。
  • 可能会分配到相同 IP:Google Cloud 在某些情况下可能会把同一个临时 IP 再次分配回来。出现这种情况可等待一段时间后再次执行脚本。
  • 不要高频调用:频繁更换 IP 可能触发平台限制或配额问题,建议按需、间隔执行。

适用场景

  • 代理节点公网 IP 轮换
  • 数据采集节点遇到限制时快速切换出口 IP
  • 测试环境快速刷新公网出口

以上方法的优点是:不删除实例、不重装环境,配置保留,只更换公网出口 IP,适合需要“快速换 IP”的自动化需求。

发布者:彬彬笔记,转载请注明出处:https://www.binbinbiji.com/linux/3799.html

(0)
彬彬笔记彬彬笔记
上一篇 11小时前
下一篇 2024年12月12日 16:38

相关推荐

发表回复

登录后才能评论
蜀ICP备14017386号-13