如何在 VPS 自架 Outline VPN 伺服器
在自己的 VPS 執行 Outline VPN,而非 Outline wiki。了解安裝方式、存取金鑰、管理 API 連接埠,以及 Shadowsocks 無法隱藏的資訊。
Outline VPN 伺服器的用途
要自行架設 Outline VPN 伺服器,必須在自己的 VPS 上執行兩項服務:Shadowsocks proxy server,以及位於其前方的小型 REST(representational state transfer)管理 API。這兩者都可透過 Outline Manager 桌面應用程式操作。該應用程式會將存取金鑰建立為 ss:// 字串,供你傳送給其他人。選擇 Outline 的原因,是可以從封鎖 VPN 的網路存取網際網路。它並非為最高吞吐量而設計。
先釐清一點,因為搜尋結果經常將這兩者混淆。Outline VPN 是本頁介紹的規避封鎖工具,位於 getoutline.org。Outline 也是自架 wiki 與知識庫的名稱,使用不同的網域,由不同團隊維護。兩者只有名稱相同,其他毫無關聯。如果你要找的是該 wiki,這不是正確的頁面。
誰負責 Outline VPN
許多指南仍將 Outline 稱為 Google 的產品。這在初期是正確的,但現在已不是如此。Outline 於 2018 年由 Jigsaw 推出;Jigsaw 是 Google 內部的孵化組織。截至 2026 年 8 月,該專案的官方網站表示,Outline 由獨立的非營利組織 Outline Foundation 擁有,程式碼則位於 GitHub 上的 OutlineFoundation 組織下。這會影響你是否決定信任這項工具:現在的治理歸屬與 2018 年不同,而連擁有者都寫錯的指南,很可能也引用了已經變更的 repository 路徑。
安裝程式實際在伺服器上建立的內容
安裝指令碼不會編譯任何內容。它會執行 Docker 容器。
shadowbox,來源為映像檔quay.io/outline/shadowbox:stable。這是管理伺服器,並以專案的 Shadowsocks 後端outline-ss-server作為資料平面。watchtower會定期檢查是否有較新的shadowbox映像檔。預設每小時檢查一次,找到新版本後就重新啟動容器。- 自行簽署的 TLS(transport layer security)憑證與私密金鑰,會寫入伺服器的狀態目錄。這不涉及公用憑證授權單位,因此管理程式會依 SHA-256 指紋釘選該憑證,而不是驗證憑證鏈。
狀態資料位於 /opt/outline,持久化檔案位於 /opt/outline/persisted-state。
對 Watchtower 應該做出明確決策,而不是置之不理。自動更新映像檔表示安全修補程式會在不需手動操作的情況下套用,但也表示你稽核過的版本可能在一夜之間變更,而且沒有你看過的變更記錄。請選擇你更重視的事項。若要自行控制升級,請移除 watchtower 容器,並依照自己的時程拉取新映像檔。
安裝程式實際檢查的必要條件
- 64 位元 x86 機器。 指令碼會以
Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine停止。ARM VPS 方案無法搭配標準映像檔運作,因此購買方案前請先確認架構。 - Docker。 如果缺少 Docker,指令碼會提供安裝選項,並輸出
Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.。如果已安裝 Docker,但 daemon 已停止,指令碼會失敗,並顯示訊息詢問 docker daemon 是否正在執行。請使用sudo systemctl enable --now docker啟動,然後再次執行安裝程式。 - 指令碼可自行查出的公開 IPv4 位址。 指令碼會查詢外部服務,目前包括
icanhazip.com、ipinfo.io及 Google endpoint,以取得應寫入管理 URL 的位址。若位於 NAT(network address translation)後方,或主機封鎖對外 HTTP,查詢就會失敗,必須使用--hostname提供位址。 - 透過 sudo 使用 root。
專案文件將 Ubuntu 20.04 LTS 或 Debian 10 列為支援的基礎系統。由於所有元件都在容器中執行,較新的 Ubuntu 通常也能運作,但這樣就不在專案測試的標準範圍內。
安裝 Outline VPN 伺服器
這是專案在 developer.getoutline.org 的官方文件中提供的指令,內容讀取於 2026 年 8 月。請自行前往該處取得指令,不要直接信任任何指南中的副本,包括本指南。該儲存庫已經搬遷過一次,使用這行指令的過期副本,可能會從已封存的路徑安裝。
sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh)"執行前先閱讀此腳本。將遠端 URL 透過管線傳給 root shell,表示你會執行該 URL 當下提供的任何內容。先查看只需 1 分鐘:
wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh | less你可以使用 3 個選用旗標自行指定值,不必接受自動產生的值:
Usage: install_server.sh [--hostname <hostname>] [--api-port <port>] [--keys-port <port>]
--hostname The hostname to be used to access the management API and access keys
--api-port The port number for the management API
--keys-port The port number for the access keys不要預期連接埠號碼固定。 如果省略 --api-port 和 --keys-port,腳本會分別為兩者選擇 1023 以上的隨機連接埠。Outline 沒有知名連接埠。任何直接提供特定號碼的指南,引用的都是該指南作者自己的安裝結果,不是你的結果。請從執行結果中讀取連接埠號碼。
成功時,腳本會輸出以 CONGRATULATIONS! Your Outline server is up and running. 開頭的橫幅,並要求你將下一行完整複製到 Outline Manager 介面中,包括大括號。該行的格式如下:
{"apiUrl":"https://<your ip>:<api port>/<random secret>","certSha256":"<fingerprint>"}接著,它會列出要開放的確切連接埠,並填入所選的號碼:
Make sure to open the following ports on your firewall, router or cloud provider:
- Management port ${API_PORT}, for TCP
- Access key port ${ACCESS_KEY_PORT}, for TCP and UDP如果你關閉終端機而遺失該設定行,該行仍保留在伺服器上。sudo cat /opt/outline/access.txt 會重新輸出該設定行。
開啟管理程式前,先確認容器確實正在執行:
sudo docker ps你應該會看到 shadowbox 和 watchtower,兩者的狀態都應為 Up。持續重新啟動的 shadowbox 容器表示管理程式永遠無法連線,而 sudo docker logs shadowbox 會說明原因。
為何不應隨意公開管理 API 埠
再次查看 apiUrl。其中沒有使用者名稱,也沒有密碼。該 URL 中的隨機路徑片段就是驗證機制,而且只有這一項機制。任何能連線到管理埠並知道該路徑的人,都能讀取伺服器上的所有存取金鑰,並將它們全部刪除。
該腳本提供的 UFW 建議(ufw 是 Ubuntu 上的簡易防火牆)會將管理埠開放給整個網際網路:
sudo ufw allow ${API_PORT}/tcp這樣雖然方便,但開放範圍超過實際需求。存取金鑰埠必須對全世界開放,因為使用者會從該處連線。管理埠只需允許從執行 Outline Manager 的位置連線。請縮小允許範圍:
sudo ufw allow <keys port>/tcp
sudo ufw allow <keys port>/udp
sudo ufw allow from <your admin ip> to any port <api port> proto tcp更好的做法是在公開防火牆上保持管理埠關閉,改用你已經運行的私有通道連線。如果你已完成 VPS 建置中的自架 WireGuard VPN,Outline 伺服器就能加入該通道,只在通道位址上回應 API。如此一來,掃描你的公開 IP 時,只會看到存取金鑰埠,不會看到其他連接埠。請記住,大多數供應商除了伺服器本身的防火牆外,控制面板中也有網路防火牆,兩者都必須設定一致。
該設定列還有兩點需要注意。Outline 文件將它列為敏感資訊,並要求只透過加密通道分享給需要管理存取權的人員,不要使用未加密的電子郵件或聊天工具。如果你已經分享管理設定,之後要撤銷其效力也確實很困難:對於手動安裝的伺服器,文件所述的失效方式是完整重新安裝,而這也會重設你已核發的所有使用者存取金鑰。請將這個字串視同伺服器的 root 密碼,因為實際上它就是如此。
發布與撤銷存取金鑰
Outline Manager 可透過按鈕建立金鑰。底層實際上是對 secret API 路徑發出一般 HTTP 請求,因此可以將其撰寫成指令碼:
API="https://SERVER_IP:API_PORT/SECRET_PATH" # the apiUrl from access.txt
curl -k "$API/access-keys"
curl -k -X POST "$API/access-keys"
curl -k -X PUT "$API/access-keys/3/name" -H 'Content-Type: application/json' -d '{"name":"anna-laptop"}'
curl -k -X DELETE "$API/access-keys/3"由於憑證是自我簽署的,因此必須使用 -k;否則 curl 會因 SSL certificate problem: self-signed certificate 而停止,且不會送出請求。API 也支援每個金鑰的資料流量限制,可使用 PUT /access-keys/{id}/data-limit 設定限制,並使用 DELETE /access-keys/{id}/data-limit 取消限制。這樣即可避免某人的手機備份耗盡整個月的頻寬額度。
每人發布一把金鑰。 這項規則決定其餘功能能否正常運作。撤銷金鑰就是刪除該金鑰,伺服器會立即停止接受它。因此,某人離開時,執行刪除後便會立刻失去存取權。假設現在有 10 個人共用一把金鑰,你就無法只移除其中 1 人。刪除金鑰後,10 個人都會停止使用,你還得花一晚重新發布 9 把金鑰。以持有者為每把金鑰命名,才能讓刪除指令安全執行。
請明確了解刪除不會做什麼。ss:// 字串是你已經傳送給他人的 secret。刪除金鑰會讓伺服器停止接受該字串,這是你能控制的部分。但它不會取回你傳送其中的訊息。因此,若金鑰外洩,請刪除該金鑰並發布新的金鑰,不要假設原有副本已經消失。
Outline 是 Proxy,而非完整 Tunnel
這是從 WireGuard 轉用過來的使用者最容易感到意外的差異。Shadowsocks 會透過 Proxy 傳送 TCP 與 UDP 連線。伺服器上沒有網路介面、Peer 位址、Routing Table 項目,也沒有位於伺服器後方的 Subnet 概念。outline-ss-server 可傳送 TCP 與 UDP,因此瀏覽器、應用程式及 DNS 都能透過它運作。ping 則無法如此運作,因為 ICMP(Internet Control Message Protocol)不在 Shadowsocks Proxy 可傳送的內容之中。使用 curl https://ifconfig.me 測試,並確認它回傳的位址是伺服器的位址,而不是你自己的位址。
這些影響需要明確說明。你無法像 WireGuard Peer 連線到 10.20.0.0/16 那樣,連線到 Outline 伺服器後方的 Private Network,因為 Outline 沒有可提供給用戶端的 Route。你也無法使用它將兩台伺服器互相連接。用戶端之間不存在 Peer-to-Peer 流量。這也排除了常見的家庭架構:手機透過 Tunnel 將相機膠卷同步回自架的相片伺服器。因此,如果你的目標是這項功能,請先從 PhotoPrism 與 Immich 比較 中選定伺服器,再為它配置具備 Routing 能力的 VPN,而不是 Proxy。如果你需要的是具有位址與 Route 的實際網路,Outline 就不是合適的工具;WireGuard 與 OpenVPN 比較 會是更好的起點。
混淆功能與限制
Shadowsocks 從第一個位元組開始加密並驗證。它沒有明文交握、沒有通訊協定版本欄位、沒有憑證交換,也沒有固定標頭。在網路線路上,連線看起來只是前往高號連接埠的隨機位元組串流。這就是 Outline 採用此方式的完整理由:針對 WireGuard 交握或第一個封包中的 OpenVPN opcode 進行辨識的 DPI(deep packet inspection)設備,在這裡沒有可供比對的內容。outline-ss-server 也提供重播防護,使用 --replay_history 啟用,可阻擋一類主動探測:審查者重播擷取的封包,以觀察伺服器如何回應。
接下來說明其實際限制。
- 它不會隱藏流量。 您的流量仍會持續前往同一個位址,並可能持續數小時。即使無法讀取 payload,時間與流量量級分析仍然有效。
- 它不會讓您匿名。 您的服務供應商知道是誰租用了伺服器,通常也持有您的付款資料;您造訪的每個網站都會看到伺服器的位址。租用 VPS 與購買 VPN 服務的差異說明了為何以本人名義租用的伺服器會改變威脅模型,而不是消除威脅。
- 它無法在位址遭封鎖後繼續運作。 如果審查者封鎖伺服器的 IP,混淆就失去意義,因為沒有任何資料抵達可供混淆。
- 它無法阻止金鑰分享。 公開群組聊天中張貼的金鑰,審查者也能取得並使用,因而可準確知道要封鎖哪個位址。
最後兩點說明了大規模規避封鎖需要多個位址,並輪替使用及謹慎發放。Tor project 正是為了解決這個問題而建立 bridges。因此,如果對手封鎖位址的速度快於您租用伺服器的速度,請先閱讀Tor bridges 與可插拔傳輸如何提供未列出的進入點,再租用第二台 VPS。
在 Outline 與替代方案之間選擇
當網路封鎖 VPN 協定,且你協助的人員不會編輯設定檔時,請選擇 Outline。只需傳送一段字串,再貼到應用程式中。這是實際的優勢,也是 Outline 存在的主要原因。
當網路允許 WireGuard 通訊時,請選擇 WireGuard。它速度更快、在 kernel 中執行,能提供可路由的網路,而且需要維護的元件少得多。完整建置方式請參閱 WireGuard VPN 伺服器指南。
當對手封鎖的是位址而非協定,或你除了連線能力之外還需要匿名性時,請選擇 bridge 或 pluggable transport。
當你的問題是 fleet management 而非審查規避時,請選擇具有 control plane 的 mesh,因為手動發放 keys 與配置位址,在大約十台機器後就難以擴充。自行託管的 NetBird 伺服器可替你處理這些記錄工作。如果你完全不想執行 control plane,請先查看 Tailscale 免費方案實際涵蓋的內容,因為家庭或小型團隊的 fleet 通常可使用該方案,且執行成本為 0。
FAQ
Outline VPN 與 Outline wiki 是同一個專案嗎?
不是。這是兩個互不相關、只是名稱相同的專案。Outline VPN 是位於 getoutline.org 的審查規避工具,由 Shadowsocks 伺服器與 REST 管理 API 組成,並透過 Outline Manager 桌面應用程式操作。Outline wiki 則是供團隊使用的自架知識庫,位於不同的網域。搜尋「self-host Outline」時,兩者都可能出現在結果中。複製任何安裝命令前,請先確認網域。
Outline VPN 仍是 Google 的產品嗎?
截至 2026 年 8 月,不是。Outline 由 Google 旗下孵化器 Jigsaw 於 2018 年推出,舊版指南中的「Google VPN」說法便源自這段歷史。專案官方網站目前說明,Outline 由獨立的非營利組織 Outline Foundation 所有,原始碼儲存庫則位於 GitHub 的 OutlineFoundation 組織下。
Outline 伺服器使用哪些連接埠?
沒有固定答案,這是刻意設計的結果。除非將 --api-port 和 --keys-port 傳給安裝程式,否則安裝程式會為管理 API 隨機選擇一個大於 1023 的連接埠,並為存取金鑰選擇另一個連接埠。執行結束時,安裝程式會列出這兩個連接埠,並指示你在伺服器防火牆與服務供應商的網路防火牆上,開放管理連接埠的 TCP,以及存取金鑰連接埠的 TCP 和 UDP。若遺失該輸出內容,sudo cat /opt/outline/access.txt 會回傳包含管理連接埠的管理 URL。
我可以使用 Outline 連入私人網路嗎?
不行。Shadowsocks 會代理 TCP 和 UDP 連線,而不是建立 Layer 3 tunnel,因此伺服器不會取得通往其後方網路的介面或路由。WireGuard peer 可以設定 AllowedIPs = 10.20.0.0/16,以連入該範圍。Outline 沒有相同的設定,因為它沒有可用來進行路由的功能。私人網路存取應使用 WireGuard,Outline 則用於連出至公開網際網路。
如何移除某人的存取權?
在 Outline Manager 中刪除對方的存取金鑰,或使用 DELETE /access-keys/{id} 對管理 API 執行刪除。伺服器會立即停止接受該金鑰。只有在每個人都持有自己的金鑰時,這種做法才能正常運作,因此請為每個人建立一組金鑰,並以對方姓名命名。撤銷「管理」存取權則複雜得多:對於手動安裝且已分享管理設定的伺服器,文件所述的修正方式是完整重新安裝。這會同時重設所有使用者金鑰。