Subject: IP xxx.xx.xx.xx geolocated as China by Google
Hello,
Google services (Gemini, YouTube) geolocate my VPS IP 192.67.63.55
as China (CN), while all other databases show Singapore.
Could you please assign me a different IPv4 that Google geolocates
as Singapore, and/or submit a geolocation correction / geofeed
update to Google for this range?
Thank you.
#!/usr/bin/env bash
# geocheck.sh — как разные сервисы видят геолокацию IP вашего VPS
# Запуск: bash geocheck.sh (IPv4)
# bash geocheck.sh -6 (IPv6)
# bash geocheck.sh 1.2.3.4 (проверить конкретный IP, без тестов Google)
set -u
FAM="-4"; TARGET=""
case "${1:-}" in
-6) FAM="-6" ;;
-4|"") ;;
*) TARGET="$1" ;;
esac
UA="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36"
C="curl $FAM -s --max-time 10 -A \"$UA\""
need() { command -v "$1" >/dev/null 2>&1; }
if ! need jq || ! need whois; then
echo "Ставлю jq и whois..."
if need apt-get; then apt-get update -qq && apt-get install -y -qq jq whois >/dev/null
elif need dnf; then dnf install -y -q jq whois >/dev/null
elif need yum; then yum install -y -q jq whois >/dev/null
elif need apk; then apk add -q jq whois >/dev/null
fi
fi
g() { eval "$C \"$1\""; }
row() { printf "%-22s %-6s %-22s %s\n" "$1" "${2:-?}" "${3:-}" "${4:-}"; }
# ISO alpha-3 -> alpha-2 для стран, которые чаще всего встречаются в проверках
a3to2() {
case "$1" in
SGP) echo SG;; RUS) echo RU;; CHN) echo CN;; HKG) echo HK;; MAC) echo MO;;
IRN) echo IR;; PRK) echo KP;; CUB) echo CU;; SYR) echo SY;; BLR) echo BY;;
NLD) echo NL;; DEU) echo DE;; FIN) echo FI;; FRA) echo FR;; GBR) echo GB;;
USA) echo US;; CAN) echo CA;; JPN) echo JP;; KOR) echo KR;; TWN) echo TW;;
CYP) echo CY;; TUR) echo TR;; KAZ) echo KZ;; ARM) echo AM;; GEO) echo GE;;
POL) echo PL;; SWE) echo SE;; CHE) echo CH;; AUT) echo AT;; LVA) echo LV;;
LTU) echo LT;; EST) echo EE;; MDA) echo MD;; UKR) echo UA;; ARE) echo AE;;
IND) echo IN;; IDN) echo ID;; MYS) echo MY;; THA) echo TH;; VNM) echo VN;;
*) echo "$1";;
esac
}
# Регионы, где Gemini официально не работает
GEMINI_BLOCKED=" RU CN HK MO IR KP CU SY BY "
IP="${TARGET:-$(g https://api.ipify.org)}"
[ -z "$IP" ] && { echo "Не удалось определить внешний IP"; exit 1; }
echo "============================================================"
echo " IP: $IP"
echo "============================================================"
printf "%-22s %-6s %-22s %s\n" "Источник" "Страна" "Город" "ASN / Организация"
echo "------------------------------------------------------------"
# ipinfo.io (собственная база)
j=$(g "https://ipinfo.io/$IP/json")
row "ipinfo.io" "$(jq -r .country <<<"$j" 2>/dev/null)" "$(jq -r .city <<<"$j" 2>/dev/null)" "$(jq -r .org <<<"$j" 2>/dev/null)"
# ip-api.com (бесплатно только http)
j=$(g "http://ip-api.com/json/$IP?fields=countryCode,city,as,isp")
row "ip-api.com" "$(jq -r .countryCode <<<"$j" 2>/dev/null)" "$(jq -r .city <<<"$j" 2>/dev/null)" "$(jq -r .as <<<"$j" 2>/dev/null)"
# ifconfig.co — использует базу MaxMind GeoLite2
j=$(g "https://ifconfig.co/json?ip=$IP")
row "MaxMind (ifconfig.co)" "$(jq -r '.country_iso // empty' <<<"$j" 2>/dev/null)" "$(jq -r '.city // empty' <<<"$j" 2>/dev/null)" "$(jq -r 'if .asn then "\(.asn) \(.asn_org // "")" else empty end' <<<"$j" 2>/dev/null)"
# ipapi.co
j=$(g "https://ipapi.co/$IP/json/")
row "ipapi.co" "$(jq -r .country_code <<<"$j" 2>/dev/null)" "$(jq -r .city <<<"$j" 2>/dev/null)" "$(jq -r '"\(.asn // "") \(.org // "")"' <<<"$j" 2>/dev/null)"
# ipwho.is
j=$(g "https://ipwho.is/$IP")
row "ipwho.is" "$(jq -r .country_code <<<"$j" 2>/dev/null)" "$(jq -r .city <<<"$j" 2>/dev/null)" "$(jq -r '"AS\(.connection.asn // "") \(.connection.org // "")"' <<<"$j" 2>/dev/null)"
# ip.sb
j=$(g "https://api.ip.sb/geoip/$IP")
row "ip.sb" "$(jq -r .country_code <<<"$j" 2>/dev/null)" "$(jq -r '.city // ""' <<<"$j" 2>/dev/null)" "$(jq -r '"AS\(.asn // "") \(.organization // "")"' <<<"$j" 2>/dev/null)"
# WHOIS — страна, на которую зарегистрирован блок
W=$(whois "$IP" 2>/dev/null)
row "WHOIS (регистрация)" "$(grep -im1 '^country:' <<<"$W" | awk '{print toupper($2)}')" "" "$(grep -im1 -E '^(netname|descr):' <<<"$W" | cut -d: -f2- | xargs)"
if [ -z "$TARGET" ]; then
echo "------------------------------------------------------------"
echo " Как видят реальные сервисы (с этого VPS):"
# Cloudflare
loc=$(g https://www.cloudflare.com/cdn-cgi/trace | awk -F= '/^loc=/{print $2}')
row "Cloudflare" "$loc"
# YouTube — регион Google по этому IP
yt=$(g "https://www.youtube.com/premium" | grep -o '"countryCode":"[A-Z]\{2\}"' | head -1 | cut -d'"' -f4)
row "YouTube (Google)" "${yt:-нет данных}"
# Gemini: регион берём из страницы (alpha-3), решение — по списку
# неподдерживаемых стран. Старый маркер 45631641 — только как доп. признак.
gm=$(eval "curl $FAM -sL --max-time 15 -A \"$UA\" -H 'Accept-Language: en-US,en;q=0.9' https://gemini.google.com/app")
gc3=$(grep -o ',2,1,200,"[A-Z]\{3\}"' <<<"$gm" | head -1 | grep -o '[A-Z]\{3\}')
gc=""; [ -n "$gc3" ] && gc=$(a3to2 "$gc3")
if [ -z "$gm" ]; then
gs="нет ответа"
elif grep -qiE "not (yet )?available in your (country|region)|isn.t (yet )?available in your (country|region)|недоступ.{0,6} в вашей (стране|регионе)" <<<"$gm"; then
gs="НЕДОСТУПЕН"
elif [ -n "$gc" ] && [[ "$GEMINI_BLOCKED" == *" $gc "* ]]; then
gs="НЕДОСТУПЕН (регион)"
elif grep -q '45631641,null,true' <<<"$gm" || [ -n "$gc" ]; then
gs="доступен"
else
gs="не определено"
fi
row "Gemini" "${gc:-?}" "$gs" "${gc3:+(код Google: $gc3)}"
fi
echo "============================================================"
echo "Если базы показывают SG, а YouTube/Gemini — RU/CN/HK и т.п.:"
echo "виновата геолокация Google -> просите провайдера сменить IP"
echo "или подать исправление (geofeed / форма Google)."
echo "Если WHOIS = CN/RU: блок зарегистрирован там, надёжнее сменить IP."
echo "Gemini также смотрит страну Google-аккаунта, не только IP."