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