如何在 VPS 上架設 Tor relay
在 Linux VPS 上設定 guard 或 middle Tor relay,涵蓋 torrc、保護計量方案的頻寬計算、nyx 監控,以及新 relay 約 1 週的共識建立期。
VPS 上的 Tor relay 作用
Tor relay 是執行於具備公開 IP 位址之機器上的 Tor daemon,會替其他使用者轉送加密網路流量。directory authorities 會發布該 relay,Tor client 則會透過它建立 circuits。guard 或 middle relay 只會將流量轉交給另一個 relay,因此不會代表陌生人連線至網站。正因如此,它不會引來 abuse mail,也適合在一般 VPS 上提供服務。
設定工作很少:安裝 1 個套件、加入 15 行設定、建立 1 條防火牆規則,再重新啟動服務。本指南其餘內容說明最容易出問題的部分:計量方案下的頻寬計算,以及為何狀態完全正常的新 relay 可能有 1 週看起來像是沒有運作。
Guard、middle、bridge 或 exit:請在安裝前選定
同一個 daemon 可執行這 4 種角色。實際角色由你的設定與 directory authorities 共同決定。
- Middle relay。 從 guard 接收流量,再轉送至另一個 relay。它不會連線至目的地網站。每個新的 relay 都會從這個角色開始。
- Guard relay。 使用相同的設定,另外加上 flag。directory authorities 會將 Guard flag 授予已長時間維持快速且穩定的 relay。你無法自行選擇。必須透過穩定運作取得,而下方的設定就是取得該 flag 的基礎。
- Bridge。 刻意排除在公開 directory 之外的 relay,並私下提供給 Tor 受封鎖地區的使用者。這 4 種角色中,它所需承諾最小:頻寬需求低、不列入公開清單。如果你的規模很小,這是合適的第一步。
- Exit relay。 最後一個 hop,負責開啟前往目的地網站的連線。使用者提出的每個請求都會從你的 IP 位址送出,因此 abuse reports 與警方查詢都會寄給該位址的持有人。
exit 是唯一不適合部署在通用 VPS 上的角色。只有在 provider 已事先同意接收相關郵件、你使用專用 IP 位址,且已公布 abuse contact 的情況下,才應執行 exit。大多數標準 hosting terms 都禁止這類用途。忽略規定通常會導致伺服器遭到停權,並失去 IP 位址。guard 或 middle relay 會承載相同的使用者流量,卻沒有上述暴露風險。
以下所有內容都會建立 guard/middle relay。ExitRelay 0 是讓它維持該角色的設定行。
VPS 在開始前需要具備的條件
Tor Project 對 relay 訂有明確的最低要求。截至 2026 年 8 月,條件包括:為 relay 提供 1 個公開 IPv4 位址;雙向頻寬至少 10 Mbit/s,建議為 16 Mbit/s;每月至少提供 100 GB 的對外流量;RAM 在低於 40 Mbit/s 時至少需要 512 MB,高於此速率時至少需要 1 GB。沒有固定的上線時間規則,但每天執行少於 2 小時的 relay,對網路幾乎沒有幫助。
10 Mbit/s 指的是線路能力,不是設定值。你需要的是能達到此速率的連接埠。允許 relay 使用多少線路頻寬,是另一項決策,必須根據每月流量額度評估。修改設定前,先閱讀你的方案內容。如果你仍在選擇伺服器,VPS 每月實際需要多少費用說明流量額度的銷售方式;測量 VPS 的實際網路吞吐量則說明如何使用 iperf3 找出線路的實際效能,而不是相信銷售頁面。
先強化主機安全性。relay 是位於公開位址上的公開服務,該位址發布後幾分鐘內就可能遭到掃描。將 SSH 限制為金鑰驗證並強化 sshd 設定只需 10 分鐘,應在 relay 上線前完成,而不是事後才處理。
從 Tor Project 儲存庫安裝 tor
請使用 Tor Project 自有的 apt 儲存庫,不要使用發行版提供的套件。Relay 程式碼的更新速度比穩定版快,因此修正會先進入此儲存庫,而發行版套件在各版本發布期間會落後。
sudo apt update
sudo apt install -y apt-transport-https gnupg wget加入簽署金鑰,再加入儲存庫。系統會從機器讀取代號,因此相同的區塊可用於 Ubuntu 24.04 (noble) 和 Debian 13 (trixie)。
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \
| gpg --dearmor \
| sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null
CODENAME=$(. /etc/os-release && echo "$VERSION_CODENAME")
echo "$CODENAME"
sudo tee /etc/apt/sources.list.d/tor.sources >/dev/null <<EOF
Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: $CODENAME
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpg
EOF
sudo apt update
sudo apt install -y tor deb.torproject.org-keyring
tor --versiontor --version 會列印剛安裝的版本。如果 apt update 改為列印 NO_PUBKEY 錯誤,表示解密格式的金鑰不在 Signed-By: 行指定的路徑,因此 apt 沒有可用來驗證發行檔案的金鑰。deb.torproject.org-keyring 套件之後會發揮作用:它會以一般套件的形式提供簽署金鑰,因此金鑰輪替後 apt 仍能正常運作。
啟用自動升級,然後將新的來源加入自動升級設定。
sudo apt install -y unattended-upgrades apt-listchanges在 Ubuntu 上,將 Tor 來源加入 /etc/apt/apt.conf.d/50unattended-upgrades 中的 Allowed-Origins 區塊:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"TorProject:${distro_codename}";
};在 Debian 上,相同檔案使用 Origins-Pattern,要加入的行是 "origin=TorProject";。使用 sudo unattended-upgrade --debug --dry-run 檢查結果;此命令會列印將套用的來源,但不會寫入任何內容。
重要的 torrc 設定
套件會安裝一份內容很長且附有大量註解的 /etc/tor/torrc。對 relay 而言,只有少數幾行設定重要。請將它們加到檔案末端。
Nickname mynicerelay
ContactInfo relay-ops[at]example.com
ORPort 9001
ExitRelay 0
SocksPort 0Nickname 的長度為 1 至 19 個字元,且只能包含英文字母與數字。它在整個網路中不具唯一性,也不是用來識別 relay 的身分;真正的識別資訊是 fingerprint。你會在搜尋框中使用它尋找自己的 relay,因此請選擇一個能透過電話拼出的名稱。
ContactInfo 會發布在 relay descriptor 中。relay descriptor 是任何人都能下載的公開文件,因此該地址會被收集。請使用兩年後仍會讀取的地址,也可以視需要進行混淆。這是 Tor Project 唯一能透過 relay 通知你問題的管道。
ORPort 9001 是其他 relay 與用戶端連線的連接埠。9001 是傳統選擇。443 也是常見選擇,因為部分限制嚴格的網路只允許對外連線至 443,因此在該連接埠監聽的 relay 能讓更多用戶端連線。只有在伺服器上的其他服務不需要 443 時,才選擇 443。
SocksPort 0 會關閉本機 SOCKS proxy。relay 不會使用它,關閉後也能讓機器少一個監聽 socket。ExitRelay 0 會將此意圖明確寫入檔案:此 relay 絕不會代表使用者連線至目的地,日後檢視設定的人也不必從預設值推斷這項行為。
如果 VPS 具有 IPv6 地址,請再加入第二行 ORPort。Tor 無法像處理 IPv4 那樣繫結至「任何」IPv6 地址,因此請將地址寫在方括號中。
ORPort 9001
ORPort [2001:db8::1]:9001在 1 GB VPS 上,請加入 MaxMemInQueues 512 MB。Tor 會根據它在機器上看到的記憶體容量決定佇列上限;在小型共用伺服器上,這個上限通常高於你希望它使用的容量。自行設定上限後,tor 會在資源壓力下丟棄佇列中的 cells,relay 仍能繼續運作,而不是持續增加佇列,直到 kernel 終止該程序。
在防火牆開放 ORPort
對外傳入的 ORPort 必須能從網際網路上的任何位置連線。對外傳出的連線則不要限制 relay:它會透過許多不同的連接埠,連線到數千個其他 relay。設定對外允許清單會在沒有明顯錯誤的情況下使其無法正常運作。
sudo ufw allow 9001/tcp comment 'tor ORPort'
sudo ufw status verbose接著檢查供應商自身的網路防火牆。許多控制面板會在虛擬機器前方執行封包過濾器。在該處新增的規則不會受到 ufw 規則影響,因此該連接埠在主機上看似開放,從外部卻無法連線。若你不熟悉 ufw,每台 VPS 都應設定的 ufw 規則會說明預設政策,以及規則比對的順序。
依照方案規模設定頻寬
手冊將 RelayBandwidthRate 說明為獨立的 token bucket,用來「將此節點轉送流量的平均入站頻寬用量限制在指定的每秒位元組數,並將平均出站頻寬用量限制為相同數值」。請仔細理解。這項限制分別套用於兩個方向。設定為 1 Mbit/s 的 relay 可同時以 1 Mbit/s 接收及以 1 Mbit/s 傳送;若 provider 同時計算兩個方向,計費量就是兩者的總和。
The data behind this chart
[
{
"label": "1 Mbit/s",
"torrc_rate": "125 KBytes",
"gb_per_day": 21.6,
"gb_per_month": "648"
},
{
"label": "2 Mbit/s",
"torrc_rate": "250 KBytes",
"gb_per_day": 43.2,
"gb_per_month": "1,296"
},
{
"label": "5 Mbit/s",
"torrc_rate": "625 KBytes",
"gb_per_day": 108,
"gb_per_month": "3,240"
},
{
"label": "10 Mbit/s",
"torrc_rate": "1250 KBytes",
"gb_per_day": 216,
"gb_per_month": "6,480"
},
{
"label": "20 Mbit/s",
"torrc_rate": "2500 KBytes",
"gb_per_day": 432,
"gb_per_month": "12,960"
}
]這 5 列是算術結果,不是測量值:它們顯示 relay 在兩個方向都持續使用該速率達 30 天時的流量成本。實際 relay 大部分時間都低於上限,尤其是在最初幾週。請用此表排除無法負擔的設定,不要用它預測精確到 GB 的帳單。
relay 在每個方向都是 1 Mbit/s 時,每天約傳輸 21.6 GB,因此 30 天的月份約會產生 648 GB 的計量流量。這仍低於 1 TB 配額,還能留出空間供更新與備份使用。提高至 2 Mbit/s 後,每月流量為 1,296 GB,已超過 1 TB 方案。最後一列 20 Mbit/s 每月需要 12,960 GB,應使用不限量的連接埠。若 provider 只計算出站流量,請將所有數值減半。設定速率前,先確認你的方案屬於哪一種,因為兩種計算方式相差兩倍。
接著設定組態。先設定速率限制,再設定配額。
RelayBandwidthRate 125 KBytes
RelayBandwidthBurst 250 KBytes
AccountingMax 400 GBytes
AccountingRule sum
AccountingStart month 1 00:00RelayBandwidthBurst 是 token bucket 的大小,因此在平均速率維持不變時,允許短時間超過該速率。設定為約 2 倍速率是合理值。
AccountingRule 是多數 operator 容易忽略的行。預設值為 max,會以兩個方向中較大的用量計算配額。使用預設值時,AccountingMax 400 GBytes 允許流入 400 GB、流出 400 GB;在同時計算兩個方向的計量方式下,總量為 800 GB。AccountingRule sum 會將讀取與寫入流量合計至同一個配額,這才符合傳輸配額的實際計算方式。
也要寫入 AccountingStart,不可只單獨使用 AccountingMax。配額是數值,而開始行則指定重設週期。未設定週期的配額會讓 relay 進入休眠,且沒有任何機制將其喚醒。
休眠是直接但粗略的措施。配額用盡時,tor 會記錄此事件,並停止接收工作:
Bandwidth soft limit reached; commencing hibernation. No new connections will be acceptedrelay 也不會在下一個週期開始的確切時間立即喚醒。Tor 會追蹤上一次配額消耗的速度,並在新的週期內選擇一個隨機時間點,以避免數千個 relay 在同一秒恢復加入網路。若 relay 每個月最後一週都離線,就會持續失去 directory authorities 用來評估的穩定性。請將 RelayBandwidthRate 設定為不會達到上限,並保留 AccountingMax 作為保護帳單的最後一道限制。
啟動 relay 並確認可連線
sudo systemctl restart tor@default
sudo systemctl status tor@default
sudo journalctl -u tor@default -n 50幾分鐘內,log 應該會包含以下這一行:
Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.這句話表示其他 relay 已連回你的 ORPort,並透過該埠建立 circuit。在這行訊息出現前,你的 relay 尚未列入 directory,完全不會承載任何流量。失敗時會顯示如下:
Your server has not managed to confirm reachability for its ORPort(s) at 203.0.113.10:9001. Relays do not publish descriptors until their ORPort and DirPort are reachable. Please check your firewalls, ports, address, /etc/hosts file, etc.請依序排查。確認 ufw 已開放 ORPort。確認 provider 額外的 network firewall 也已開放該埠。確認訊息中的位址是網際網路實際路由到你的位址,而不是 NAT 設定所使用的私有位址。從另一台機器使用 nc -vz 203.0.113.10 9001 測試該埠。Tor 會自行重複執行 self-test,因此修正 firewall 後不需要額外操作即可偵測到變更;重新啟動則會立即觸發測試。
relay 的永久識別資訊是其 fingerprint:
sudo cat /var/lib/tor/fingerprintdescriptor 發布約三小時後,relay 會出現在 Relay Search。搜尋 nickname,或貼上 fingerprint。該頁面反映 network 對 relay 的認知,包括它具備哪些 flag、authorities 會給予多少 weight,以及它發布的版本。
為什麼新的 Tor relay 幾乎沒有流量?
因為網路尚未完成測量,而測量需要數週。Tor Project 將這段爬升過程分為 4 個階段。未閱讀相關說明的營運者,往往會以為 relay 故障,開始反覆修改設定。
在最初 3 天,relay 尚未完成測量。它會回報自身的自我測試結果,但 directory authorities 仍會將已發布的權重上限限制在 20 KB,因此用戶端幾乎不會選取它。約從第 3 天到第 8 天,bandwidth authorities 會正式測量其頻寬,權重也會逐步上升。但它只會被用作 middle hop,因為沒有用戶端願意讓全新的 relay 成為第一個 hop。
約第 8 天,relay 會符合取得 Guard flag 的資格。取得該 flag 後,流量反而會下降,這通常令人意外:用戶端在選擇 middle hop 時會略過 guard,因為假設 guard 已在處理流量。因此,relay 在取得 guard 流量前,會先失去 middle 流量。只有當用戶端輪換其 guard 組合後,流量才會逐步恢復,而這需要數週。到約第 68 天時,relay 會達到穩定狀態,移除它的用戶端數量與加入它的用戶端數量大致平衡。
因此,合理的預期是:前 3 天幾乎沒有流量,1 週後開始有流量,2 個月後才會有實質負載。每次只變更 1 個設定,然後等待 1 週觀察結果。使用 自架的 Uptime Kuma 狀態頁面,並對 port 9001 執行 TCP 檢查,更適合消耗這種焦慮。它能回答真正可控制的問題:該 port 是否仍在回應。
使用 nyx 監控 relay
nyx 是監控執行中 relay 的終端機工具。它會連線至 tor 的控制埠,因此請先在 torrc 中啟用該功能:
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1ControlPort 僅監聽 127.0.0.1,且 cookie 驗證要求程式先讀取 secret 檔案,才能發出命令。Tor 會以 debian-tor 使用者身分,將 cookie 寫入 /run/tor/control.authcookie,並設定模式 600,因此其他使用者無法讀取。CookieAuthFileGroupReadable 1 會開放群組存取權限,讓你自己的帳戶不使用 sudo 也能執行 nyx。
sudo apt install -y nyx
sudo adduser "$USER" debian-tor
sudo systemctl restart tor@default登出後重新登入,再執行 nyx。新的群組權限必須在登入時載入,因此在同一個 shell 工作階段中執行 nyx,即使設定正確,仍會因 cookie 檔案的權限而失敗。nyx 會顯示即時頻寬、運作時間、日誌串流及連線清單。前幾週應觀察的數值,是頻寬圖是否維持在你的 RelayBandwidthRate 以下。
執行多個 relay:MyFamily 與 family keys
如果只有一個 relay,請跳過本節。由同一位管理者執行的 2 個以上 relay 必須彼此宣告,避免用戶端建立從你的機器進入、再從你的機器離開的 circuit,讓單一管理者能看到 circuit 的兩端。
長期以來的作法,是在每個 relay 的 torrc 中設定 MyFamily,並列出其他所有 relay 的 fingerprint:
MyFamily AAAAAAAAAA,BBBBBBBB每個 relay 都必須列出其他所有 relay,因此新增第 4 個 relay 時,就必須編輯 4 個檔案。Tor 0.4.9 改用 family key。產生 1 個 key,然後分發給所有 relay:
tor --keygen-family myfamily此命令會寫入 myfamily.secret_family_key,並輸出一行 FamilyId。將 key 檔案複製到每個 relay 的 DataDirectory 下之 keys 子目錄;在 Debian 和 Ubuntu 上,該路徑為 /var/lib/tor/keys。保留 .secret_family_key 副檔名。將輸出的 FamilyId 行加入每個 torrc,然後使用 sudo systemctl reload tor@default 重新載入設定。暫時也保留 MyFamily 清單。尚未支援 family certificates 的用戶端仍會讀取舊版清單;Tor Project 會公告何時可以移除該清單。
執行後會發生哪些問題
版本會變得過時。 Unattended upgrades 會替換套件,但執行中的程序會繼續使用啟動時載入的 binary,直到重新啟動。比較主機上的 tor --version 與 relay 的 Relay Search 頁面顯示的版本。如果兩者不同,網路上仍會看到舊版本,因此請重新啟動服務。
時鐘會漂移。 Consensus 文件與憑證都有時間限制,因此時鐘偏差過大的機器會拒絕 consensus,並停止發布資料。timedatectl 應顯示系統時鐘已同步。如果沒有,請啟用 systemd-timesyncd 或安裝 chrony。
IP 位址會變更。 descriptor 會包含位址,而用戶端無法連線到已變更的位址。每次供應商遷移或位址變更後,請重新啟動 tor,並再次監控 self-test 訊息。
relay 速度低於方案允許的上限。 Tor 的 relay 加密在現代處理器上效率良好。Tor Project 表示,支援 AES-NI 的 CPU 每個方向約可達 400 到 450 Mbit/s。在達到這項上限前,通常會先受到連接埠速度與傳輸額度限制。因此,上方的 accounting 章節比硬體更重要。
FAQ
Tor relay 會使用多少頻寬?
使用量取決於你允許的上限,不會超過該上限。RelayBandwidthRate 會分別限制每個方向的轉送流量,因此設定為 1 Mbit/s 的 relay,可以同時接收 1 Mbit/s 並傳送 1 Mbit/s。換算後,每天約為 21.6 GB;以 30 天計算,雙向合計每月約為 648 GB。在該速率下方加入 AccountingMax,並以 AccountingRule sum 設定每月硬性配額。
執行 Tor relay 會收到濫用申訴嗎?
guard 或 middle relay 只會將流量傳送至其他 Tor relay,不會代表使用者連線至網站。因此,針對他人透過 Tor 進行的行為所提出的申訴,會寄給 exit operator,而不是你。你可能會看到掃描活動,以及偶爾出現的 IP reputation listing,因為該位址會公開列為 relay。Exit relay 才是收到濫用郵件與法律通知的節點,因此需要事先同意處理這些事項的 provider。啟用任一類型前,請先閱讀 provider 的條款。
為什麼我的新 Tor relay 沒有流量?
因為新 relay 在完成測量前,會依設計受到流量限制。前 3 天,directory authorities 會將發布的權重限制為 20 KB,因此用戶端幾乎不會選擇該 relay。Bandwidth authorities 約從第 3 天開始進行測量;relay 約在第 8 天符合取得 Guard flag 的資格,而此時流量會再次下降,因為用戶端選擇 middle hop 時會避開 guard。約在第 68 天才會達到完整負載。確認日誌中出現 "Self-testing indicates your ORPort is reachable from the outside",然後不要再更動設定。
我可以在流量額度為 1 TB 的 VPS 上執行 Tor relay 嗎?
可以。雙向各約 1 Mbit/s,也就是 RelayBandwidthRate 125 KBytes。如果 provider 會計算雙向流量,每月約為 648 GB,仍會留下足夠的餘裕供更新與備份使用。加入 AccountingMax 400 GBytes,搭配 AccountingRule sum 與 AccountingStart month 1 00:00,讓 relay 在超出方案前進入休眠。如果 provider 只計算 outbound,可以將速率加倍。
如果只執行一個 relay,還需要設定 MyFamily 嗎?
不需要。設定 family 的目的是讓用戶端避免建立經過同一個 operator 所擁有之兩個 relay 的 circuit;只有一個 relay 時,這項設定沒有意義。新增第二個 relay 後,請立即設定:在每個 relay 的 MyFamily 行中列出所有 relay 的 fingerprint;或使用 Tor 0.4.9 引入的 family key,以分發一個 FamilyId,而不必維護持續增加的清單。