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)。讀結果時按下面的順序看:
- 國家是否一致。國家一級通常比城市一級穩定,如果出現分歧,優先懷疑代理、雙棧或剛易手的地址段。
- 省份是否多數一致。11 個庫裡多數給同一個省,少數給鄰省,可以基本認定多數意見;少數派往往是舊記錄。
- 城市分散時,看是否集中在一個大區。行動網路和 CGNAT 地址常見這種情況,這時城市級結果本身就不可靠,置信度也會偏低。
- 對照 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 地址到底暴露了什麼。