subconverter 自建:在本機轉換訂閱,不交給公共轉換網站

subconverter 自建:在本機轉換訂閱,不交給公共轉換網站

Marcus Reid
2026年10月14日· 7 分鐘讀完

subconverter 自建,即是在自己的電腦把代理訂閱轉換成另一種客戶端格式,而不把訂閱連結交給公共轉換網站。本文執行固定版本的 tindy2013/subconverter:0.9.0 Docker 映像,只發佈到 127.0.0.1,讓連結不會進入 shell 記錄及容器日誌,並在任何客戶端匯入前核對輸出。[1][2]

關鍵要點

  • 訂閱連結就是登入憑據,公共轉換網站會取得它的完整內容。
  • 容器要發佈到 127.0.0.1,因為 Docker 預設在主機所有地址發佈端口。
  • 替換預設 API 令牌並關閉容器日誌:在預設級別下,日誌會記錄所擷取的連結。
  • 0.9.0 版能解析 ss、ssr、vmess、trojan、socks 及 HTTP 連結,沒有 VLESS 連結解析器。
  • 信任轉換結果前,先核對節點數目、TLS、傳輸方式及 UDP 欄位。

本文按文末官方來源整理,未完成完整端到端實測。範圍只限你自行控制的一部電腦,不涉及公共或共用的轉換服務。可先參考自建任務及復原清單,判斷本機工具是否適合你的情況。

公共轉換網站能看到甚麼?

轉換介面透過 /sub 的 url 查詢參數接收訂閱地址,並附上目標格式及可選的外部設定。[1] 因此營運該介面的人會取得完整連結,之後還可再次擷取,並看到連結傳回的每部伺服器、端口及密鑰。該網站的日誌、分析及快取層亦可能保存你永遠不會知道的副本。

請求中的內容使用公共網站時誰會知道使用本機容器時誰會知道
訂閱連結及其中的令牌網站營運者及其日誌只有你的電腦,以及訂閱提供者
節點地址、端口及密鑰網站營運者(擷取連結後)只有你的電腦
轉換時你的 IP 地址網站營運者;提供者看到的是網站地址只有訂閱提供者
轉換後的輸出檔案網站營運者(產生過程中)只有你的電腦

所以訂閱連結應像密碼一樣保存及撤銷。如果你已把連結貼到公共轉換網站,請先要求提供者重設連結,再按本文操作。如果為大量節點修改轉換後設定所需的維護超出實際需要,亦可先權衡自建伺服器與託管 VPN。

應執行哪個 subconverter 版本?

最新附標籤的發佈是 v0.9.0,Docker Hub 亦有對應的 0.9.0 映像標籤;latest 標籤則跟隨主分支較新的建置。[2][3] 固定使用 0.9.0,確保你審閱過的程式碼就是實際執行的程式碼,並在每次使用前到儲存庫查看有否新標籤。

轉換前先了解解析器的限制。在 v0.9.0,連結解析器辨認 ssr://、vmess://、ss://、trojan://、socks 及 Telegram 式 HTTP 連結,以及 Netch://;並沒有處理 vless://、Hysteria2 或 TUIC 連結的分支。[4] 不受支援格式的節點會直接從輸出消失,而不是被轉換。文件列出的目標格式包括 clash、surge、quanx、loon 及 v2ray;v0.9.0 的請求處理程式碼另有一個 README 表格未列出的 singbox 目標。[1][5]

步驟 1:準備私人工作目錄及令牌

建立一個只有你的用戶能讀取的目錄,並產生新的存取令牌,不要沿用預設令牌。範例設定檔附帶 api_access_token=password,程式亦會從環境變數讀取 API_MODE 及 API_TOKEN。[6][7]

mkdir -m 700 -p ~/subconv && cd ~/subconv
umask 077
printf 'API_MODE=true\nAPI_TOKEN=%s\n' "$(openssl rand -hex 24)" > subconv.env

API_MODE=true 會阻止服務載入本機訂閱或直接提供本機檔案。[6] subconverter 的 API 令牌保護設定更新介面,Docker README 呼叫該介面時附有 token 參數。[3] 把兩者放在環境檔內,可避免令牌出現在指令列上,免得被 shell 記錄及程序列表暴露。

步驟 2:只在本機回環上執行固定映像

如不指定地址,Docker 會在主機所有地址(0.0.0.0 及 [::])發佈容器端口,等於把服務暴露給你所在的網絡。[8] 請明確綁定回環地址,完成 subconverter Docker 部署:

docker run -d --name subconv-local --restart unless-stopped \
  --log-driver none --memory 256m \
  --cap-drop ALL --security-opt no-new-privileges \
  --env-file ./subconv.env \
  -p 127.0.0.1:25500:25500 \
  tindy2013/subconverter:0.9.0

以 curl -fsS http://127.0.0.1:25500/version 檢查;按 Docker README 所述,輸出應包含 subconverter 後端名稱及版本。[3] 再以 sudo ss -lntp | grep 25500 確認主機只監聽 127.0.0.1:25500,這個本機綁定正是擋住其他裝置的關鍵。

在 28.0.0 之前的 Docker Engine 版本,同一第二層網段內的主機可以存取發佈到 localhost 的端口。[8] 在共用網絡依賴回環綁定前,先執行 docker version 檢查並升級。

步驟 3:轉換一次,不讓連結進入 shell 記錄

以隱藏輸入把連結寫入私人檔案,再讓 curl 對檔案內容進行 URL 編碼:

read -rs SUB_URL && printf '%s' "$SUB_URL" > sub.txt && unset SUB_URL
curl -fsS -G http://127.0.0.1:25500/sub \
  --data-urlencode target=clash \
  --data-urlencode url@sub.txt \
  -o converted.yaml
rm sub.txt

進行 subconverter 訂閱轉換時,訂閱由容器自行擷取。範例設定中的 proxy_subscription=NONE 表示這次擷取直接發出,不經設定的代理。[6] 因此訂閱提供者看到的是你電腦的地址,與客戶端更新連結時一樣。

為何要關閉容器日誌

在 v0.9.0,處理程式碼會寫入一條 info 級別日誌,內容包括它擷取的每條訂閱連結。[5] 若使用 Docker 預設日誌,這一行便會留在 docker logs 的輸出中。none 日誌驅動程式不保存容器日誌,docker logs 不會傳回任何內容。[9] 除錯時如確實需要日誌,可臨時執行一個開啟日誌的容器,用完即刪除。

步驟 4:逐個欄位核對輸出

HTTP 請求成功,並不代表每個節點都轉換正確。以本機編輯器開啟 converted.yaml,按提供者對每個節點的說明逐項核對。

欄位核對內容出現以下情況便停止
節點數目與來源相同,減去你刻意排除的節點節點無故缺失
協議類型與來源節點一致節點改了協議或消失
伺服器及端口與來源完全相同任何地址或端口不同
TLS 及伺服器名稱TLS 仍開啟、SNI 相同、沒有新增 skip-cert-verify: true證書驗證被關閉
傳輸及路徑WebSocket 或其他傳輸的路徑及主機相同路徑或主機為空或不同
UDP 標記與伺服器實際支援一致為不支援 UDP 的伺服器開啟了 UDP

範例設定訂明 exclude_remarks=(到期|剩余流量|时间|官网|产品|平台),會丟棄名稱含有其中任何一詞的節點。[6] 它針對部分提供者加入的資訊條目,但名稱剛好吻合的真實節點也會消失。預設設定亦會加入代理組及規則集,所以除代理條目外,還要檢查路由規則。

把 converted.yaml 視為機密:它包含訂閱內的全部登入憑據。匯入時參考匯入設定而不洩漏憑據中的注意事項;如客戶端會保存自己的副本,便刪除本機檔案。

如何長期保持 subconverter 自建服務的私密性?

只有本機程序能連接發佈在回環地址的端口,但這包括本機所有用戶及應用程式。請在單一用戶的電腦上執行,轉換完成後停止容器。同一道理亦適用於其他本機控制介面,例如 Mihomo 控制器 API:回環地址限制誰能連接,強密鑰則限制連上的程序能做甚麼。

讓 subconv.env 及工作目錄保持 0700 或 0600 權限。不要為了讓其他裝置存取而加入反向代理、端口轉發或隧道,否則私人工具會重新變成持有所有人連結的轉換服務。如客戶端需要自動更新,便在同一部電腦定時轉換,讓客戶端讀取本機檔案。

如何更新或移除?

更新時,到儲存庫查看新發佈並細閱說明,再下載新的固定標籤。以 docker rm -f subconv-local 停止並刪除舊容器,以同一指令啟動新標籤,然後重複 /version、監聽地址及輸出核對。

徹底移除時,執行 docker rm -f subconv-local,以 docker image rm tindy2013/subconverter:0.9.0 刪除映像,再刪除 ~/subconv。如訂閱連結曾經過任何共用或公共系統,事後請要求提供者重設。

總結

  • 本機轉換讓訂閱連結及輸出都留在你控制的電腦上。
  • 固定映像版本、綁定 127.0.0.1、替換令牌,並關閉會記錄連結的日誌。
  • 0.9.0 版無法轉換 VLESS、Hysteria2 及 TUIC 連結,要檢查輸出有否缺少節點。
  • 匯入前核對 TLS、傳輸及 UDP 欄位,並把結果當作機密保存。

常見問題

在本機執行 subconverter,訂閱連結便完全安全嗎?

它把公共網站從鏈路中移除,但你的電腦、本機其他用戶及訂閱提供者仍然是風險所在。工作檔案及日誌同樣需要保護,不能只顧轉換這一步。

為何固定 0.9.0,而不用 latest?

固定標籤讓你可細閱對應的發佈說明,清楚自己執行的是哪個解析器及哪些預設設定。latest 標籤可能在兩次轉換之間悄悄改變,令審閱過的內容失效。

為何轉換後我的 VLESS 節點不見了?

0.9.0 版的連結解析器沒有處理 vless 連結的分支,所以這些條目會被略過。請改用能直接讀取原始訂閱格式的客戶端,不要依賴轉換結果。

端口只在本機,還需要更改預設 API 令牌嗎?

需要。本機任何程序都能存取這個端口,而預設令牌是文件公開寫明的 password,任何人都能即時猜中,所以必須換成隨機產生的長令牌。

容器日誌會在哪裏暴露訂閱連結?

在預設的 info 級別下,0.9.0 版會記錄每條被擷取的訂閱連結。Docker 預設日誌會保存這一行,所以本文直接關閉容器日誌,避免連結被寫入磁碟。

可以把轉換器開放給家中區域網絡的其他裝置嗎?

本文的設定不適合這樣做。發佈到網絡後,每位用戶的訂閱連結都會暴露給這項服務,以及所有能連到它的人,等於重新建立一個轉換網站。

轉換後的檔案需要與連結同等保護嗎?

需要。它包含訂閱中每部伺服器的地址、端口及密鑰,請私密保存,並刪除客戶端已不再需要的副本,避免登入憑據殘留在多個位置。

免責聲明: 本文僅供一般資訊參考,不構成法律、技術或其他專業建議。我們不保證內容的準確性、完整性或時效性。

來源:

  1. subconverter README — https://github.com/tindy2013/subconverter
  2. subconverter release v0.9.0 — https://github.com/tindy2013/subconverter/releases/tag/v0.9.0
  3. subconverter Docker README at v0.9.0 — https://github.com/tindy2013/subconverter/blob/v0.9.0/README-docker.md
  4. subconverter v0.9.0 subscription parser source — https://github.com/tindy2013/subconverter/blob/v0.9.0/src/parser/subparser.cpp
  5. subconverter v0.9.0 request handler source — https://github.com/tindy2013/subconverter/blob/v0.9.0/src/handler/interfaces.cpp
  6. subconverter v0.9.0 example preferences — https://github.com/tindy2013/subconverter/blob/v0.9.0/base/pref.example.ini
  7. subconverter v0.9.0 startup source — https://github.com/tindy2013/subconverter/blob/v0.9.0/src/main.cpp
  8. Docker Docs: Port publishing and mapping — https://docs.docker.com/engine/network/port-publishing/
  9. Docker Docs: Configure logging drivers — https://docs.docker.com/engine/logging/configure/

Sources checked 2026 年 10 月 14 日。

延伸閱讀:

開啟 3 天免費試用

註冊即可免費體驗全部高級功能。

*只限新用戶;每位用戶只可獲得一次試用。

subconverter 自建:在本機轉換訂閱,不交給公共轉換網站 | AethoVPN