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/zh-hant/linux/3799.html

(0)
彬彬筆記彬彬筆記
上一篇 15小時前
下一篇 2024年10月8日 17:37

相關推薦

發表回復

登錄後才能評論
蜀ICP備14017386號-13