開啟 3 天免費試用
註冊即可免費體驗全部高級功能。
*只限新用戶;每位用戶只可獲得一次試用。


要讓自建代理經 VPS IPv6 出站,伺服器需要一個可用的全球 IPv6 地址和預設路由,代理本身亦要知道解析目標時優先使用哪個地址族。先確認服務商的分配方式,再依次設定系統、防火牆和 sing-box,並保留已測試的 IPv4 作為後備。本文依據文末所列官方來源整理,未完成完整端到端實測。
關鍵要點
- 可以設定甚麼取決於服務商的分配方式,動手修改前先弄清楚。
- 鄰居探索(Neighbor Discovery)依賴 ICMPv6,全面封鎖可能令 IPv6 路徑失效。
- 在 sing-box 1.12 或以後版本,IPv6 優先設定寫在
domain_resolver,而不是已棄用的domain_strategy。- 本文只使用一個固定 IPv6 地址,不涉及輪換地址以規避封禁或限速。
代理伺服器會代表客戶端,向每個目標建立新連線。客戶端送來域名時,由代理解析並選擇 IPv4 或 IPv6 地址;客戶端直接送來 IP 時,地址族已經確定。在 sing-box 中,這個選擇由撥號欄位(dial fields)控制,它們亦可把出站連線綁定到指定的本機 IPv6 地址。[1]
所以伺服器需要兩樣東西:在作業系統層面可用的 IPv6 路徑,以及會使用這條路徑的代理設定。較完整的維運責任可參考自建服務規劃指南。如果你對地址族仍未熟悉,建議先讀IPv4 與 IPv6 定址方式的分別,因為下面的檢查假設你能看懂 IPv6 前綴。
這是伺服器端的改動。客戶端裝置讓 IPv6 繞過隧道送出,是另一個問題,詳見IPv6 洩漏的原理說明。
服務商通常採用幾種常見分配方式,每一種之下「加入一個地址」的意思都不同。如果是鏈路內(on-link)前綴,上游路由器會透過鄰居探索找到你的地址:它發出鄰居請求(Neighbor Solicitation),只有真正設定在你網絡介面上的地址才會回應。[2] 如果是路由前綴,服務商會把整個前綴轉發到你已持有的某一個地址。
| 分配方式 | 路由器的預期 | 需要設定甚麼 | 主要風險 |
|---|---|---|---|
| 單一 /128 | 一個地址回應 ND | 該地址及指定閘道 | 地址或閘道打錯 |
| 鏈路內 /64 | 鏈路上的地址回應 ND | 從前綴選定的一個地址 | 使用了從未設定的地址 |
| 路由 /64 | 前綴轉發到鏈路地址 | 鏈路地址加前綴用法 | 漏掉獨立的鏈路地址 |
| 透過 RA 的 SLAAC | 鏈路上的路由器通告 | 接受 RA,避免靜態重複 | 開啟轉發後 RA 被忽略 |
準確的地址、前綴長度和閘道請以服務商控制台或文件為準;有些服務商使用 fe80::1 之類的鏈路本地閘道。本文其餘部分只使用一個固定地址。為繞過平台封鎖或限制而按連線輪換大量地址,不屬本文範圍,亦可能違反服務商或目標服務的條款。
先經 IPv4 登入,這樣 IPv6 設定出錯也不會令你無法連線。記錄目前狀態:
ip -6 addr show scope global
ip -6 route show default
sysctl net.ipv6.conf.all.forwarding
sysctl net.ipv6.conf.eth0.accept_ra
curl -6 -sS -o /dev/null -w '%{http_code}\n' https://example.com
把 eth0 換成你的網絡介面名稱。如果有全球地址、有預設路由,而且 curl -6 成功,代表系統層面的路徑已可用,可直接跳到步驟 3。有全球地址但沒有預設路由,或者根本沒有全球地址,就需要做步驟 2。
accept_ra 的值對同時轉發流量的代理伺服器(例如 VPN 端點)很重要。accept_ra 為 1 時,核心只在轉發關閉的情況下接受路由器通告;為 2 時,即使開啟轉發亦會接受。[3] 如果服務商依賴 RA 而你開啟了轉發,預設路由可能會靜靜消失。
在使用 Netplan 的 Ubuntu 伺服器上,新增一個獨立檔案,不要直接修改服務商產生的檔案,並備份 /etc/netplan/ 下每個現有檔案。以下示例設定一個地址和一條 Netplan IPv6 預設路由,使用文件專用前綴 2001:db8::/32;請把地址、前綴長度、閘道和介面換成服務商提供的值。
network:
version: 2
ethernets:
eth0:
addresses:
- "2001:db8:1234:5678::10/64"
routes:
- to: "::/0"
via: "fe80::1"
on-link: true
Netplan 的 addresses 會在 DHCP 或 RA 取得的地址之外追加靜態地址,routes 至少要寫 to,而每個地址族、每張路由表只能定義一次預設路由。[4] on-link: true 告訴系統閘道是直接連接的,當閘道不在你的前綴範圍內時尤其重要。如果服務商用的是 RA,就設定 accept-ra: true 並省略靜態路由,以免出現兩條互相競爭的預設路由。[4]
以帶安全計時的方式套用:
sudo netplan try
netplan try 會先套用設定,如果你沒有在預設的 120 秒內確認,便自動還原;逾時或取消後,要檢查舊狀態是否真的回復。[5] 確認之前,再執行一次步驟 1 的指令。
鄰居探索運行在 ICMPv6 之上,所以封鎖全部 ICMPv6 的防火牆,可能令設定正確的地址也無法連上。[2] 請放行防火牆工具標示為 IPv6 必需的 ICMPv6 類型,而不是寫一條一刀切的拒絕規則。
然後檢查對外暴露的範圍。監聽在 [::] 的代理會接受 IPv6 連線,所以你為 IPv4 寫的入站規則亦需要對應的 IPv6 規則。把 ss -lntup 的輸出與防火牆的 IPv6 規則清單對照,確認管理連接埠和只供本機使用的監聽在兩個地址族上都沒有向互聯網開放。
由 sing-box 1.12.0 起,撥號欄位 domain_strategy 已被棄用,預計在 1.14.0 移除;取代方案是一個指定 DNS 伺服器和策略的 domain_resolver 物件。[1][6] 策略可選值為 prefer_ipv4、prefer_ipv6、ipv4_only 和 ipv6_only。[7]
以下片段只保留關鍵部分:一個透過主機系統解析的 local DNS 伺服器、一個優先使用 IPv6 的直連出站,以及一個綁定在回送地址的測試入站,藉此實現 sing-box IPv6 優先。[8] 請把它合併到現有設定,不要取代你正在使用的入站。
{
"dns": {
"servers": [{ "type": "local", "tag": "local" }]
},
"inbounds": [
{ "type": "mixed", "tag": "test-in", "listen": "127.0.0.1", "listen_port": 2080 }
],
"outbounds": [
{
"type": "direct",
"tag": "direct-out",
"inet6_bind_address": "2001:db8:1234:5678::10",
"domain_resolver": { "server": "local", "strategy": "prefer_ipv6" }
}
],
"route": { "final": "direct-out" }
}
inet6_bind_address 會把 IPv6 連線固定到你在步驟 2 設定的地址;如果只有一個全球地址,可以省略。[1] 執行 sing-box check -c /etc/sing-box/config.json,檢查通過後才重新啟動服務。
| 策略 | 目標同時有 A 和 AAAA | 只有 IPv4 的目標 | 適用情況 |
|---|---|---|---|
prefer_ipv4 | 使用 IPv4 | 使用 IPv4 | IPv6 剛設定、尚未測試 |
prefer_ipv6 | 使用 IPv6 | 退回 IPv4 | 希望有 IPv6 時便使用 |
ipv6_only | 使用 IPv6 | 連線失敗 | 單獨測試 IPv6 路徑 |
ipv4_only | 使用 IPv4 | 使用 IPv4 | 快速還原 |
在伺服器本機經回送入站測試。--socks5-hostname 會把域名交給代理,由 sing-box 完成解析並套用策略。
curl -sS --socks5-hostname 127.0.0.1:2080 -o /dev/null -w '%{remote_ip}\n' https://example.com
下表為預期現象,實際結果請自行記錄。
| 檢查方法 | 預期現象 | 失敗時處理 |
|---|---|---|
| 經測試入站瀏覽雙棧網站 | 經 IPv6 建立連線 | 覆查步驟 1 和綁定地址 |
prefer_ipv6 下瀏覽只有 IPv4 的網站 | 連線退回 IPv4 | 確認沒有設成 ipv6_only |
| 客戶端裝置經正式入站連線 | IP 檢測顯示伺服器的 IPv6(經 IPv6 路徑時) | 比對客戶端 DNS 和代理規則 |
| 掃描 IPv6 上的公開連接埠 | 只有預期連接埠回應 | 補上欠缺的 IPv6 規則 |
在連接到你代理的客戶端上,查看外界見到的是哪個地址。結果是 IPv6,代表網頁請求走了新路徑;結果是 IPv4 亦可能正常,因為網站本身或客戶端自己的解析選擇了 IPv4。測試完成後刪除測試入站。
還原期間保持 IPv4 工作階段不中斷。刪除或移走你新增的 Netplan 檔案,執行 sudo netplan apply,確認 ip -6 route show default 與步驟 1 的記錄一致。在 sing-box 把策略改為 prefer_ipv4 或 ipv4_only,刪除 inet6_bind_address,執行設定檢查後重新啟動。
如果伺服器無法連上,用服務商的網頁主控台刪除新增的檔案。不要第一時間就在核心層面全面停用 IPv6;ip-sysctl 文件指出,寫入 disable_ipv6 的 all 值會一次過改動所有介面。[3]
IPv6 出站改變的是伺服器所走的路徑,而不是你的身份。目標見到的仍然是一個與你的 VPS 綁定的固定地址。如果你的目的是不想承擔營運者的責任,託管服務可能比自行維護的伺服器更合適。
當目標沒有 IPv6、服務商的 IPv6 路徑不穩定,或者你需要按用戶分配地址時,它同樣不是合適工具。這些情況下保持 prefer_ipv4,待服務商修好路徑後再評估。家用路由器取得委派前綴則是另一套流程,見OpenWrt 前綴委派指南。
netplan try 加入一個地址和一條預設路由,同時保持 IPv4 存取。prefer_ipv6 的 domain_resolver,再同時測試 IPv6 和 IPv4 後備。不需要。一個可用的全球地址加一條預設路由,已足以讓代理連上 IPv6 目標。/64 只是讓你有更多地址可以選擇。
通常是預設路由缺失,或者指向錯誤的閘道。把 ip -6 route show default 與服務商提供的閘道對照,並檢查防火牆有沒有丟棄 ICMPv6。
1.12 或以後版本不應再用。該欄位在這些版本已被棄用,預計在 1.14.0 移除,請把優先設定轉移到帶策略值的 domain_resolver 物件。
不會。使用 prefer_ipv6 時,沒有 AAAA 記錄的目標仍會經 IPv4 連上;只有 ipv6_only 才會令這類連線失敗。
accept_ra 為 1 時,一旦開啟轉發,核心便會忽略路由器通告。請在該介面把 accept_ra 設為 2,或者改為設定靜態預設路由。
本文不涉及這種做法。為繞過封鎖或限制而輪換地址,可能違反服務商和網站的條款,本文的流程一直只使用一個固定地址。
不會。它只改變承載流量的地址族。目標見到的仍是登記在你 VPS 名下的地址,私隱程度依然取決於原來的營運者和日誌選擇。
免責聲明: 本文僅供一般資訊參考,不構成法律、技術或其他專業建議。我們不保證內容的準確性、完整性或時效性。請遵守託管服務商的可接受使用政策,以及你所連接服務的條款。
來源:
Sources checked 2026 年 10 月 14 日。
延伸閱讀:
註冊即可免費體驗全部高級功能。
*只限新用戶;每位用戶只可獲得一次試用。