IP歸屬地為什麼不準:地理庫原理、手機流量顯示外省與多庫判斷方法

部落格 / IP 與隱私

IP歸屬地為什麼不準:地理庫原理、手機流量顯示外省與多庫判斷方法

IP歸屬地為什麼不準?因為它根本不是定位。網站拿到的只是你的出口 IP,再去一張“IP 地址段對應哪個地區”的表裡查一下,查到什麼就顯示什麼。這張表由不同的資料商各自維護,更新有快有慢;運營商也可能把一段地址挪到別的城市使用,或者讓很多使用者從同一個出口上網。表和現實對不上,歸屬地就會偏,偏到外省也不奇怪。

IP歸屬地到底是怎麼查出來的?

伺服器看到的是 TCP 連線的源地址,也就是你的出口 IP。它不知道你的 GPS,也不知道你的基站。拿到 IP 後,它去查一個地理定位資料庫,庫裡大致是這樣的記錄:

地址段國家省份城市運營商
某個 /20 網段中國某省某市某運營商

這些記錄的來源通常有幾類:

  • 註冊資訊:地址段由區域網際網路序號產生器構分配給運營商或企業,註冊資訊裡有組織名和登記地址,可以透過 RDAP 或 whois 查到。登記地址往往是公司總部,跟實際使用的城市不一定是一回事。
  • 運營商提供的資料:有的資料商和運營商有合作,這部分地址的標註通常更準。
  • 測量推斷:從多個探測點測延遲、看路由,推算地址段大概在哪個區域。
  • 使用者側資料:例如某些應用在使用者授權定位後,把“這個 IP 當時在哪”回傳給資料商。

每家資料商用的來源和權重不同,更新週期也不同。所以同一個 IP 在不同庫裡查到不同城市很常見。這部分細節可以看 為什麼 11 個 IP 庫給出不同位置:地理定位資料從哪來。

為什麼會偏到外省?

常見原因有下面幾類,一個 IP 可能同時佔好幾條。

運營商在省之間調配地址池

運營商拿到的地址段並不是永久繫結某個城市。某個省地址緊張時,可能把另一個省閒置的段調過去用。資料庫如果還按舊記錄走,就會把你顯示成原來那個省。寬頻使用者換了一個新分配的地址後,歸屬地突然變了,多半是這個原因。

手機流量從集中出口上網

行動網路的資料流量不是在你身邊的基站直接出公網,而是先回到運營商的核心網,再從數量有限的閘道器出去。一個閘道器可能服務好幾個城市甚至一個大區,於是同一片地址段下的使用者分佈很廣,資料庫只能標一個城市。

漫遊時更明顯。資料漫遊的流量通常會回到號碼歸屬地的核心網再出公網,所以人在外地出差,手機流量顯示的仍是號碼所在省。反過來,如果資料庫把某個大區閘道器的地址段標成了鄰省,你人在本省也會顯示成外省。

CGNAT:很多人共用一個公網 IP

IPv4 地址不夠用,運營商會讓大量使用者共享一個公網地址(運營商級 NAT)。這時“這個 IP 在哪”本來就沒有唯一答案,資料庫給出的只是一個近似。共享地址還會影響信譽判斷,見 共享 IP 與 CGNAT 會影響 IP 信譽嗎。

資料庫更新滯後

地址段易手、重新分配之後,資料商要過一段時間才會改。各平臺用的庫版本不同,同一天裡一個平臺顯示新位置、另一個還是舊位置,這種情況很常見。

你走的根本不是本地出口

公司網路常常統一從總部出口上網,異地分支的員工會顯示成總部所在城市。開了代理或 VPN,看到的是代理伺服器的位置。還有一種容易忽略的情況:代理只接管了 IPv4,IPv6 仍然直連,不同網站走了不同的協議,查到的歸屬地就互相矛盾。排查方法見 IPv6 代理不生效:雙棧網路下 IPv4 與 IPv6 出口不一致的原因與排查。

各平臺用的資料來源不同

社交平臺、查詢網站、雲服務商的風控,各自接的是不同資料商,有的還疊加了自己的修正規則。所以拿 A 網站的結果去對 B 平臺的顯示,對不上並不說明哪一邊錯了。

對照表:現象、原因、怎麼驗證

你看到的現象最可能的原因怎麼驗證
家裡寬頻,歸屬地突然從本市變成鄰省運營商調配了地址池,資料庫還是舊記錄查 RDAP 看地址段登記的組織;多庫對比,看是否只有少數庫給了外省
手機流量顯示號碼所在省,人卻在外地漫遊流量回到歸屬地核心網出公網切到當地 Wi-Fi 再查一次;兩次出口 IP 和運營商應當不同
手機流量在本省也顯示外省移動閘道器覆蓋大區,資料庫標註偏差多庫對比;看各庫給出的城市是否集中在同一大區
公司網路顯示成總部城市企業統一出口查出口 IP 的 ASN 和組織名,通常是企業專線或總部所在地
一個網站顯示國內,另一個顯示國外雙棧出口不一致,或分流規則不同分別查 IPv4 和 IPv6 出口;看國內網站讀到的 IP
同一 IP 在不同網站城市不同各平臺資料來源和版本不同多庫投票,看多數意見和置信度
顯示的是機房或雲服務商所在地正在透過代理、VPN 或雲主機上網查 IP 型別,機房 IP 和家寬 IP 的判斷見下文連結

怎樣自己查清楚:可以照做的步驟

第一步:確認真實出口 IP,分 IPv4 和 IPv6

在終端執行:

# 只走 IPv4
curl -4 -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc)='
# 只走 IPv6(沒有 IPv6 會報錯,屬正常)
curl -6 -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc)='

ip= 是出口地址,loc= 是 Cloudflare 判斷的國家。兩次結果如果國家不同,先解決雙棧不一致,再談歸屬地。

第二步:查地址段登記給了誰

whois 你的IP | grep -iE 'netname|descr|country|org'
# 或者用 RDAP(亞太地區的地址可直接查 APNIC)
curl -s https://rdap.apnic.net/ip/你的IP | python3 -m json.tool | grep -E '"name"|"country"|"handle"'

這裡能看到地址段的網段範圍、登記組織和國家。注意它告訴你的是“誰持有這段地址”,不是“這個 IP 現在在哪個城市”。

第三步:多庫對比,而不是隻信一個

開啟 cdnping 的 IP 與環境檢測,“出口 IP 情報”一欄會用 11 個地理庫投票給出位置,並附上置信度,同時顯示 RDAP 註冊資訊和 IP 型別(機房、家寬、移動、Tor)。讀結果時按下面的順序看:

  1. 國家是否一致。國家一級通常比城市一級穩定,如果出現分歧,優先懷疑代理、雙棧或剛易手的地址段。
  2. 省份是否多數一致。11 個庫裡多數給同一個省,少數給鄰省,可以基本認定多數意見;少數派往往是舊記錄。
  3. 城市分散時,看是否集中在一個大區。行動網路和 CGNAT 地址常見這種情況,這時城市級結果本身就不可靠,置信度也會偏低。
  4. 對照 IP 型別。顯示為機房 IP,說明你走的是伺服器出口,歸屬地反映的是伺服器所在地,和你本人位置無關。區別見 機房 IP 和家寬 IP 有什麼區別。

第四步:換一個網路再查一次

手機流量和 Wi-Fi 各查一次,對比出口 IP、運營商和多庫結果。如果換網路後歸屬地正常了,問題出在那條網路的出口,而不是你的裝置。

第五步:看國內網站讀到的是哪個 IP

開了分流規則時,國內網站和國外網站看到的出口可能不同。cdnping /ip 的“大陸分流檢測”會讀取多家國內 CDN 回傳的客戶端 IP,告訴你當前屬於“大陸分流 / 全域性代理 / 國內直連”中的哪一種。原理見 國內網站如何看到你的真實 IP,分流的概念可以看 分流(split tunneling)是什麼。

多個庫給出不同城市,到底信哪個?

幾條經驗:

  • 多數意見通常比單一來源可靠,但不是絕對。地址段剛被調配時,可能大多數庫都還沒更新,少數更新快的反而是對的。這時可以結合 RDAP 的登記變化和你自己換網路的結果一起判斷。
  • 置信度低時,別在城市一級較真。行動網路、CGNAT、企業出口這類地址,城市級結果本來就難以準確,能看的主要是省份。
  • 原生 IP 和廣播 IP 要分開看。有些地址段在一個國家註冊,卻被宣告到另一個地方使用,資料庫容易按註冊地標註。判斷方法見 原生 IP 與廣播 IP。
  • 平臺顯示的屬地以平臺為準,但不等於你的真實位置。平臺展示的是它所用資料來源的查詢結果,你在第三方工具上查到不同城市,兩者都可能“各自正確”。

關於“IP屬地顯示外省”的幾點提醒

  • 開關飛航模式後,手機流量可能會分到一個新的出口地址,歸屬地有時隨之改變,但這只是換了一條地址段,並沒有解決資料庫本身的偏差,下次還可能再出現。
  • 平臺展示 IP 屬地有其規則和監管背景,本文只解釋技術原因,不討論如何改變平臺顯示的屬地。請遵守平臺的服務條款和當地法規。
  • 如果你只是想知道自己的 IP 暴露了哪些資訊(位置精度、運營商、型別、信譽),可以讀 你的 IP 地址到底暴露了什麼。

相關文章

繼續閱讀