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_NAME 与 ZONE):
#!/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