SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Tailscale IP 為什麼是 100 開頭?CGNAT 共享位址

你的電腦出現 100.101.x.x 這種位址,它不是公網 IP,也不是 192.168 那類私有位址。本文說明 RFC 6598 共享位址空間、Tailscale 為何選它,以及如何自己判斷這個 100 開頭位址是 tailnet 還是電信商 NAT,並檢查它會不會和你家的網段相撞。

100 開頭的位址是什麼

Tailscale IP 之所以是 100 開頭,是因為 Tailscale 從 100.64.0.0/10 這個網段,配一個固定位址給你 tailnet 裡的每一台機器。像 100.101.x.x 這樣的位址就落在這個範圍內。它不是公網 IP,公開網際網路上沒有任何裝置連得到它。它也不是 192.168.0.0/16 或 10.0.0.0/8 那種你熟悉的私有位址。

它屬於第三類:RFC 6598 定義的共享位址空間(Shared Address Space)。這份標準把 100.64.0.0/10 保留下來,實際範圍是 100.64.0.0 到 100.127.255.255。請記住第二段數字的界線,因為判斷全靠它:100.64.x.x 到 100.127.x.x 在這個網段裡,100.200.x.x 不在。

如果你只想要結論:這是你 tailnet 的內部位址,只在你自己的 tailnet 裡可以路由,屬於正常現象,不需要修。接下來的篇幅處理四件事:它為什麼長這樣、怎麼和電信商的 CGNAT 位址分辨、什麼情況下會真的撞到、撞到之後怎麼辦。以下引用的官方說明,是 2026 年 9 月的 tailscale.com 文件內容。

RFC 6598 共享位址空間和 RFC 1918 私有位址差在哪

RFC 1918 那三段位址(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)的用途是「一個組織在自己內部隨意使用」。共享位址空間的原始用途不一樣:它是要拿來編號 CGN(carrier grade NAT,電信級網路位址轉換)裝置和 CPE(customer premises equipment,用戶端設備,也就是你家那台路由器或光貓)之間那一段線路。

差別在「誰可以重複使用」。RFC 6598 的原文這樣寫:

Packets with Shared Address Space source or destination addresses MUST NOT be forwarded across Service Provider boundaries.

意思是:來源或目的位址落在這個網段的封包,不得跨越服務供應商的邊界被轉送。所以這個網段不可全球路由,而且可以被多套彼此不相干的設備同時使用。同一個 100.64.1.5,可以同時存在於台灣某家業者的網路裡、香港另一家業者的網路裡,以及你的 tailnet 裡。三者互不影響,因為封包本來就不會跨過去。

那為什麼電信商不直接拿 10.0.0.0/8 來做 CGNAT?RFC 6598 講得很清楚:CGN 服務要求家用 NAT 和 CGN 的兩側使用不重疊的位址空間。而使用者家裡幾乎都已經在用 10.x 或 192.168.x,所以需要另外一段乾淨的位址。這個理由很重要,因為它也是 Tailscale 的理由。

Tailscale 為什麼挑這個網段

Tailscale 的文件寫得直白:選 CGNAT 範圍,是因為這些位址不會和常見的私有網段衝突,例如 10.0.0.0/8 和 192.168.0.0/16。

VPN 最怕的狀況是:你分配的隧道網段,剛好等於使用者家裡的 LAN 網段。這時候本機那條區域網路路由比較具體,封包永遠不會進隧道,而且沒有任何錯誤訊息,連線看起來一切正常,服務就是連不到。同樣的道理也適用於自己手動架的 WireGuard,這也是為什麼WireGuard 用 AllowedIPs 做加密金鑰路由時,第一步就是挑一個不會撞的網段。Tailscale 幫你做了這個決定,代價是它借用了電信商的地盤。

Tailscale 在這個網段裡保留的位址

官方文件列出的保留項目,設定 IP pool 或內部服務時要避開:

  • 100.64.0.0/10:Tailscale 配給裝置的 IPv4 範圍。
  • 100.100.100.100:稱為 Quad100,是裝置本機的服務位址,提供 DNS 與裝置管理。
  • 100.100.0.0/24、100.100.100.0/24、100.115.92.0/23:保留給內部使用,不可用於 IP pool。
  • 100.101.102.103:保留給 tshello 範例服務。
  • fd7a:115c:a1e0::/48:Tailscale 配給裝置的 IPv6 唯一區域位址前綴。
  • fd7a:115c:a1e0::53:Quad100 的 IPv6 對應位址。

怎麼分辨 tailnet 位址和電信商的 CGNAT 位址

兩邊都是 100 開頭,光看位址無法分辨。要分辨就要問「誰配這個位址給我」。最快的方法是問 Tailscale 自己:

tailscale ip -4
tailscale status
ip -4 addr show tailscale0

tailscale ip -4 印出的是這台機器的 tailnet IPv4 位址。tailscale status 列出 tailnet 裡的每一台裝置以及它們的位址。你手上那個 100.x 位址,如果出現在這份清單裡,它就是 tailnet 位址,判斷結束。在 Linux 上,ip -4 addr show tailscale0 會把同一個位址顯示在 Tailscale 建立的網路介面上;macOS 是 utun 開頭的介面,Windows 則是名為 Tailscale 的介面,所以跨平台時用 tailscale ip -4 最保險。

反過來說,如果某個 100.x 位址掛在你的實體網路介面上(例如 enp1s0 或 ens3),或是出現在 ip route show default 的預設閘道上,那它就和 Tailscale 無關,是上游網路配給你的。關於 tailnet 位址在整體架構中的角色,Tailscale 的控制平面與資料平面分工那篇講得更完整。

你的固網或行動網路是不是也在 100.64.0.0/10 裡

不要相信「某家業者一定會」或「某家一定不會」這種說法。同一家業者在不同方案、不同區域、IPv4 與 IPv6 雙軌並行的設定都不一樣,而且會改。自己量一次就有答案,步驟只有三個。

  1. 登入路由器的管理頁面,找 WAN 或「外部網路」那一欄的 IP 位址,把它記下來。
  2. 在同一個網路下的電腦執行 curl -4 https://api.ipify.org,這個服務會回傳外界看到你的那個 IPv4 位址。
  3. 比對這兩個值。

三種結果,三種判斷。兩個值相同,代表你的路由器直接拿到真實公網 IP。路由器 WAN 落在 100.64.0.0 到 100.127.255.255 之間,而第 2 步印出的是另一個位址,代表你在電信商的 CGNAT 後面,那段 100.x 是業者內部的線路編號。路由器 WAN 是 10.x 或 192.168.x 而第 2 步印出的是別的位址,那同樣是被業者 NAT 掉了,只是他們用的是 RFC 1918 而不是共享位址空間。

用手機熱點或 4G/5G 路由器上網的人,多半會看到第二或第三種結果。手機熱點通常只給你一個 192.168.x 的位址,看不到 WAN 那一層,所以這種環境只能靠第 2 步的比對來推斷。想從外部再確認一次,可以在一台有公網 IP 的 VPS 上執行 tailscale netcheck,它會報告這台機器對外被對應到的位址與各中繼點的延遲,用來檢查 NAT 行為。

被 CGNAT 包住最直接的後果是:你沒有一個可以對外接受連線的位址,所以路由器上的連接埠轉發做不起來,家裡的服務沒辦法從外面連進來。這件事有兩條路可走。一條是用一台 VPS 建反向隧道,把服務從 CGNAT 後面帶出來。另一條就是 Tailscale 這類工具,它從設計上就不要求你有公網 IP,兩端各自主動對外連出去再打洞。它和傳統 VPN 的界線在哪,Tailscale 到底算不算一個 VPN那篇有完整比較。

兩邊都是 100.64.0.0/10 時會撞到什麼

電信商用這個 /10,Tailscale 也用這個 /10。多數人不會有問題,因為那個 100.x 的 WAN 位址在路由器的外側,你的電腦本身不會對它發封包,一般上網和 tailnet 互不干涉。會出事的是兩種情況,官方文件都有記錄。

第一種是本機已經有服務住在這個網段。Linux 版的 Tailscale client 會裝一條防火牆規則,把落在 100.64.0.0/10、但不是合法 Tailscale 流量的封包丟掉。這條規則的目的是保護這個範圍,但如果你本來就有東西用這裡的位址,例如自架的內部網路系統,或是 API server 位址落在這個範圍的 Kubernetes 叢集,那條規則就會擋住它們。文件描述的症狀是「devices cannot reach local CGNAT-addressed services while Tailscale is running」,也就是 Tailscale 跑起來的時候,裝置就連不到這些本地服務。先用 ip -4 addr 和 ip route 確認這台機器自己是不是真的在這個網段上有位址或路由,再決定要不要動設定。官方提供的開關是節點屬性 disable-linux-cgnat-drop-rule,關掉之後這些裝置就能同時使用 Tailscale 和內部的 CGNAT 位址服務。

第二種是 subnet router 宣告的路由撞到 tailnet 自己的位址。當你執行類似下面這行指令,把一段內網路由推送給整個 tailnet:

sudo tailscale set --advertise-routes=192.0.2.0/24,198.51.100.0/24

如果你宣告的網段落在 100.64.0.0/10 裡面,tailnet 裝置本身的位址和你宣告的那段路由就會搶同一塊位址空間,結果是封包送到哪一邊變成看路由具體程度決定,而不是看你的意圖。宣告路由前先確認範圍,做法可以參考在 VPS 上架 subnet router 對外宣告私有網段。

官方文件給了兩個正式解法。第一個是 IP pool:在 tailnet policy file 裡指定 Tailscale 只能用這個 /10 的某個小子集,把剩下的留給你自己。

{
  "nodeAttrs": [
    {
      "target": ["autogroup:admin"],
      "ipPool": ["100.81.0.0/16"]
    }
  ]
}

指定的範圍必須落在 100.64.0.0/10 之內,而且不能碰到前面列出的三段保留網段。第二個解法是節點屬性 disable-ipv4,把 tailnet 改成只走 IPv6,位址就從 fd7a:115c:a1e0::/48 配發,完全離開這場衝突。文件同時標明了代價:關掉 IPv4 之後,你就連不到網路上只有 IPv4 的資源。這個 target 可以指向特定裝置,也可以寫 ["*"] 套用到整個 tailnet。

100.x 位址只在 tailnet 內可達,這正是重點

Tailscale 文件對這件事只有一句話:「Tailscale IP addresses aren't exposed to the public internet.」你的 100.x 位址沒有公開的 DNS 紀錄,沒有對外的路由宣告,而且照 RFC 6598 的規定,沒有任何服務供應商會把這個網段的封包轉送出去。有人拿掃描器掃你的公網 IP,看不到任何綁在 100.x 上的東西,因為那條路徑不存在。

這個設計和 127.0.0.1 是同一種思路:位址本身就界定了「誰有資格連進來」。127.0.0.1 界定的是「只有這台機器」,100.x 的 tailnet 位址界定的是「只有加入這個 tailnet、並且通過 ACL(access control list,存取控制清單)的裝置」。差別在於 tailnet 的成員可以分散在不同的國家和不同的網路裡,中間走的是點對點的加密隧道。

實務上的意義是:把服務綁在 100.x 位址上,等於把它從公開網際網路上拿掉,而不是在前面加一層保護。反向代理、fail2ban、複雜的防火牆規則都不需要,因為沒有人可以送封包到那個位址。你要付出的是另一種代價,那就是連線品質不再由你掌握,而 Tailscale 的控制平面會決定哪些節點認得彼此。這條界線值得先讀懂:Tailscale 拿不到你的加密金鑰,但它決定誰能發現誰。

最後兩件延伸設定值得一起看。如果你想讓整台機器的對外流量都從某個地點出去,那不是用 100.x 位址就能做到的,要設定 exit node,做法在把 VPS 設成 Tailscale exit node。如果兩台裝置之間的 100.x 位址連得到但速度很差,問題通常不在位址,而在於連線是直連還是經過中繼伺服器,直連和 DERP 中繼的速度差距以及怎麼判斷列出了判斷步驟。

FAQ:常見問題

100.101.x.x 是公網 IP 嗎?

不是。它落在 100.64.0.0/10,也就是 RFC 6598 的共享位址空間,範圍是 100.64.0.0 到 100.127.255.255。RFC 6598 規定,來源或目的位址在這個網段的封包不得跨越服務供應商的邊界被轉送,所以它無法在公開網際網路上路由。Tailscale 的文件也明確寫出 Tailscale 的位址不會暴露在公開網際網路上。它同時也不是 RFC 1918 的私有位址,10.0.0.0/8 和 192.168.0.0/16 才是。

怎麼判斷這個 100 開頭位址是 tailnet 給的,還是電信商給的?

執行 tailscale ip -4 和 tailscale status。前者印出這台機器的 tailnet 位址,後者列出 tailnet 裡所有裝置的位址。你在查的那個位址如果出現在這份清單裡,它就是 tailnet 位址。如果它反而是掛在實體網路介面上,或出現在 ip route show default 的預設閘道,那就是上游網路配給你的。

怎麼確認我家的網路是不是在電信商 CGNAT 後面?

登入路由器管理頁面記下 WAN 欄位的 IP,然後在同一個網路下執行 curl -4 https://api.ipify.org,比對兩個值。相同代表你有真實公網 IP。WAN 落在 100.64.0.0 到 100.127.255.255 之間而兩個值不同,代表你在業者的 CGNAT 後面。WAN 是 10.x 或 192.168.x 而兩個值不同,也是被業者 NAT,只是用的是 RFC 1918。自己量,不要依賴別人說某家業者的做法。

我的網路也用 100.64.0.0/10,Tailscale 還能用嗎?

多數情況可以,因為業者的那段位址在路由器外側,你的機器不會直接對它發封包。會出問題的是兩種狀況:這台 Linux 機器本身要連到位址落在這個範圍的本地服務,因為 Linux client 會裝一條規則丟掉這個網段裡非 Tailscale 的流量;或是你用 subnet router 宣告的路由也落在這個 /10。官方解法有三個:節點屬性 disable-linux-cgnat-drop-rule 關掉那條規則、用 policy file 的 ipPool 把 Tailscale 限制在一個更小的子網段、或用 disable-ipv4 讓 tailnet 只走 IPv6。

我的 Tailscale 位址會不會自己變掉?

不會因為你換網路而變。官方文件說明 Tailscale 為 tailnet 裡的每台裝置配發一個唯一位址,而這個位址不隨裝置的實體位置改變,所以筆電從辦公室帶回家,100.x 位址是同一個。這正是這類位址好用的地方:設定檔和連線指令可以直接寫死這個位址。如果你需要限制系統從哪個範圍配發位址,用 policy file 裡的 ipPool 指定一個 100.64.0.0/10 內的子網段,避開 100.100.0.0/24、100.100.100.0/24 與 100.115.92.0/23 這幾段保留範圍。

#tailscale#cgnat#rfc6598#ip-addressing#networking