如何在 VPS 上运行 Tor Guard 或中间中继
在 Linux VPS 上配置 Tor Guard 或中间中继,涵盖 torrc、流量计费保护、nyx 监控,以及新中继共识状态缓慢爬升可能持续一周的原因。
VPS 上的 Tor 中继做什么
Tor 中继是运行在具有公网 IP 地址的计算机上的 Tor daemon,用于转发其他用户的加密流量。目录权威服务器会发布该中继,Tor 客户端则通过它建立电路。Guard 中继或中间中继只会将流量转交给另一个中继,因此不会代表陌生用户向网站建立连接。这一事实意味着它不会收到滥用投诉邮件,也使其成为普通 VPS 适合提供的贡献。中继承载其他用户的流量,不发布自身内容。因此,如果您的目标是在 Tor 网络上发布自己的网站,而不是为网站转发数据包,那么 在 nginx 后运行 v3 onion service 是同一个 tor daemon 的另一种用途。运行中继也不会改善您自己浏览网页时的隐私。这是另一个问题,实际效果上限通常低于预期:自托管 SearXNG 实际隐藏了什么 可以较好地说明,将服务迁移到自己的 VPS 能带来多大程度的隐私改善。
实际操作很少:安装一个软件包,写入 15 行配置,添加一条防火墙规则,然后重启。后续内容主要说明容易出问题的部分:按流量计费的套餐如何计算带宽,以及为什么一个完全正常的新中继可能会像失效一样持续一周。
Guard、中继、桥接还是出口:安装前先选择
同一个守护进程可以承担这4种角色。您的配置,以及目录权威服务器的判断,共同决定您运行哪一种角色。
- 中继节点。 接收来自 Guard 的流量,并将其转发到另一个中继节点。它不会连接目标网站。每个新的中继节点都从这里开始。
- Guard 中继节点。 配置相同,只是在此基础上增加一个标志。目录权威服务器会将 Guard 标志授予运行速度快且长期稳定的中继节点。您无法自行选择。必须通过运行状态获得该标志,而下面的配置正是获得它的基础。
- 桥接节点。 有意不加入公共目录的中继节点,并私下分发给 Tor 受阻地区的用户。这是4种角色中投入最小的一种:带宽要求低、不公开列出;如果您的计划规模很小,它也是合适的第一步。它还需要在同一台服务器上运行 obfs4 代理,并使用另一组 torrc 配置行。设置一台低价 VPS 上的 obfs4 桥接节点将详细介绍整个过程,包括最后如何将桥接线路提供给用户。
- 出口中继节点。 最后一跳,负责打开到目标网站的连接。用户发出的每个请求都会从您的 IP 地址离开,因此滥用报告和警方查询都会发送给该地址的所有者。
出口中继节点不适合运行在通用 VPS 上。只有在服务商已提前同意接收相关邮件,并且您拥有独立 IP 地址和公开的滥用联系地址时,才应运行出口中继节点。大多数标准托管条款都禁止此类用途。忽视这一点通常会导致服务器被暂停,IP 地址被收回。如果您仍然需要运行出口中继节点,运行出口中继节点实际涉及什么将介绍如何寻找允许出口中继的主机、编写出口策略和反向 DNS,以及收到邮件后如何处理。Guard 或中间中继节点也会转发相同的用户流量,但不会承担这些风险。
下面的所有内容都用于构建 Guard/中间中继节点。ExitRelay 0 是使其保持为中继节点的那一行。
开始前 VPS 需要满足的条件
Tor Project 为中继发布了明确的硬件要求。截至 2026 年 8 月,要求包括:为中继提供 1 个公网 IPv4 地址;上行和下行带宽均至少为 10 Mbit/s,建议为 16 Mbit/s;每月至少提供 100 GB 出站流量;带宽低于 40 Mbit/s 时至少需要 512 MB RAM,超过该带宽时至少需要 1 GB RAM。没有固定的在线时间要求,但每天运行时间少于 2 小时的中继对网络几乎没有作用。
10 Mbit/s 指的是线路带宽,不是配置值。您需要使用能够达到该速度的端口。允许中继使用多少带宽是另一项决策,需要结合每月流量配额确定。修改配置前,请先阅读您的套餐说明。如果您还在选择 VPS,VPS 每月的实际成本介绍了流量配额的销售方式,测量 VPS 的实际网络吞吐量则说明如何使用 iperf3 测出线路的实际性能,而不是直接相信销售页面。
先加固服务器。中继是运行在公网地址上的公共服务,该地址发布后几分钟内就可能遭到扫描。将 SSH 限制为密钥登录并加固 sshd 配置只需 10 分钟,应在中继上线前完成,而不是上线后再做。
从 Tor Project 软件源安装 tor
使用 Tor Project 自己的 apt 软件源,而不是发行版软件包。中继代码的更新速度通常快于稳定版,因此修复会先进入该软件源;发行版软件包则会在版本发布之间滞后。
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。对于中继,只有少数几行配置重要。将它们添加到文件末尾。
Nickname mynicerelay
ContactInfo relay-ops[at]example.com
ORPort 9001
ExitRelay 0
SocksPort 0Nickname 的长度为 1 到 19 个字符,只能包含字母和数字。它在网络中不唯一,也不是你的身份;指纹才是。你需要通过搜索框查找自己的中继,因此应选择一个可以通过电话准确拼出的名称。
ContactInfo 会发布在中继描述符中。中继描述符是任何人都可以下载的公开文档,因此该地址会被抓取。请使用一个两年后仍会阅读的地址,也可以按需进行混淆。这是 Tor Project 就中继问题向你发出警告的唯一渠道。
ORPort 9001 是其他中继和客户端连接到的端口。9001 是常用选择。443 端口也很常见,因为某些受限网络只允许出站 443,因此监听该端口的中继可以被更多客户端访问。只有在服务器上的其他程序不需要 443 时,才选择它。
SocksPort 0 会关闭本地 SOCKS 代理。中继不使用该代理,因此还可以减少服务器上的一个监听套接字。ExitRelay 0 会将这一意图明确写入文件:此中继永远不会代替用户连接到目标,之后读取配置的人也不必根据默认值推断这一点。
如果 VPS 具有 IPv6 地址,请再添加一行 ORPort。Tor 无法像处理 IPv4 那样绑定到“任意”IPv6 地址,因此请将地址写在方括号中。
ORPort 9001
ORPort [2001:db8::1]:9001在 1 GB VPS 上,请添加 MaxMemInQueues 512 MB。Tor 会根据它在服务器上看到的内存量决定队列限制。对于小型共享服务器,这个值通常高于你希望 Tor 使用的内存量。手动设置该限制后,内存压力增大时 tor 会丢弃排队的 cell,中继可以继续运行,而不是让队列持续增长,最终导致内核终止进程。
在防火墙中开放 ORPort
入站方向,ORPort 必须能够从互联网的任意位置访问。出站方向,不要限制中继的网络访问:它会通过许多不同端口连接数千个其他中继,出站允许列表会在不明显报错的情况下严重限制其功能。
sudo ufw allow 9001/tcp comment 'tor ORPort'
sudo ufw status verbose然后检查服务提供商自己的网络防火墙。许多控制面板会在虚拟机前运行数据包过滤器,因此您通过 ufw 添加的规则在那里不会生效,导致端口在服务器上显示为开放,但从外部访问时却处于关闭状态。如果您不熟悉 ufw,请参阅每台 VPS 都应配置的 ufw 规则,其中介绍默认策略以及规则的匹配顺序。
根据套餐规划带宽
手册将 RelayBandwidthRate 描述为一个独立的令牌桶。它将“此节点中继流量的平均入站带宽使用量限制为指定的每秒字节数,并将平均出站带宽使用量限制为相同的数值”。请仔细理解这句话。该限制分别应用于两个方向。设置为 1 Mbit/s 的中继可以同时以 1 Mbit/s 接收和以 1 Mbit/s 发送数据。如果服务商同时统计两个方向,计费量就是两者之和。
此图表背后的数据
[
{
"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 行是算术结果,不是测量数据。它们表示中继在两个方向上持续满速运行 30 天时,各速率对应的流量成本。实际中继大部分时间都会低于上限,尤其是在最初几周。使用此表排除无法承受的设置,不要用它精确预测按 GB 计费的账单。
中继在每个方向均为 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,应使用不限流量的端口。如果服务商只对出站流量计费,请将所有数值减半。设置速率前,先确认服务商采用哪种计费方式,因为两种结果相差一倍。
现在配置速率限制和配额。先设置速率限制,再设置配额。
RelayBandwidthRate 125 KBytes
RelayBandwidthBurst 250 KBytes
AccountingMax 400 GBytes
AccountingRule sum
AccountingStart month 1 00:00RelayBandwidthBurst 是令牌桶的大小。因此,在平均速率不变的情况下,它允许出现短时突发流量。将其设置为约为速率两倍的值通常较为合理。
AccountingRule 是大多数运维人员容易遗漏的配置行。默认值为 max,它会将两个方向中较大的流量计入配额。使用默认值时,AccountingMax 400 GBytes 允许入站 400 GB、出站 400 GB。在同时统计两个方向的计量方式下,总量为 800 GB。AccountingRule sum 会将读取量和写入量合并后计入同一配额,这才符合流量配额的实际计量方式。
还要同时写入 AccountingStart,不要只单独写 AccountingMax。配额定义数量,start 行定义配额重置的周期起点。没有周期的配额会使中继进入休眠,并且没有机制将其唤醒。
休眠机制比较直接。配额用尽后,tor 会记录日志并停止接收工作:
Bandwidth soft limit reached; commencing hibernation. No new connections will be accepted中继也不会在下一个周期开始的准确时刻恢复运行。Tor 会跟踪上一个配额的消耗速度,并在新周期内随机选择恢复时间,避免数千个中继在同一秒重新加入网络。如果中继每个月最后一周都消失,就会持续失去目录机构用来评估其稳定性的指标。合理设置 RelayBandwidthRate,使其永远不会达到上限,并保留 AccountingMax 作为保护账单的最后一道限制。
启动中继并确认其可访问
sudo systemctl restart tor@default
sudo systemctl status tor@default
sudo journalctl -u tor@default -n 50几分钟内,日志中应包含以下行:
Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.这句话表示其他中继已连接到你的 ORPort,并通过它建立了电路。在这行日志出现之前,你的中继不会进入目录,也不会承载任何流量。失败时会显示为:
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.按顺序排查。确认 ORPort 是否已在 ufw 中放行。确认云服务商单独的网络防火墙是否也已放行该端口。确认消息中的地址是互联网实际路由到你的地址,而不是 NAT 配置中的私有地址。使用另一台机器通过 nc -vz 203.0.113.10 9001 测试该端口。Tor 会自动重复执行自检,因此修复防火墙后无需手动操作即可检测到;重启 Tor 可立即触发检查。
中继的永久身份是其指纹:
sudo cat /var/lib/tor/fingerprintdescriptor 发布约 3 小时后,中继会出现在 中继搜索 中。搜索中继昵称,或粘贴指纹。该页面反映了网络对你的中继的认知:它具有什么标志、权威节点为其分配了多少权重,以及它发布的版本。
为什么新建的 Tor 中继几乎没有流量?
因为网络尚未完成对它的测量,而测量需要数周。Tor Project 将这一爬坡过程分为 4 个阶段。不了解这一过程的运维人员可能会误以为中继已损坏,并开始反复修改配置。
前 3 天,中继处于未测量状态。它会报告自身的自检结果,但目录权威仍会将其已发布权重限制为 20 KB,因此客户端几乎不会选择它。从第 3 天左右到第 8 天左右,带宽权威会对其进行实际测量,权重也会逐步上升。但它只能作为中间跳使用,因为没有客户端愿意将一个全新的中继作为第一跳。
大约到第 8 天,中继才有资格获得 Guard 标志。获得该标志后,流量反而会下降,这会让人感到意外:客户端选择中间跳时会跳过 Guard,因为它们假定 Guard 已经承担了流量。因此,中继在获得 Guard 流量之前,会先失去中间跳流量。只有随着客户端轮换 Guard 集合,中继的流量才会恢复,而这需要数周。到大约第 68 天,它会达到稳定状态,此时移除它的客户端数量与添加它的客户端数量大致平衡。
因此,合理预期是:前 3 天没有流量,1 周后开始有一些流量,2 个月后才会有实际负载。每次只修改 1 个设置,然后等待 1 周观察影响。使用 自行托管的 Uptime Kuma 状态页,并针对端口 9001 执行 TCP 检查,更值得投入精力。它能回答一个你真正可以控制的问题:该端口是否仍在响应。
使用 nyx 监控中继
nyx 是运行中继的终端监控工具。它通过 Tor 的控制端口与 Tor 通信,因此首先在 torrc 中启用该端口:
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1ControlPort 仅监听 127.0.0.1,Cookie 身份验证要求程序先读取密钥文件,然后才能执行命令。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。
运行多个中继:MyFamily 和 family 密钥
如果只有一个中继,请跳过本节。由同一运营者运行的 2 个或更多中继必须相互声明,这样客户端就不会构建从您的机器进入并离开的电路,避免同一运营者同时看到电路两端。
长期以来,做法是在每个中继的 torrc 中使用 MyFamily,并列出所有其他中继的指纹:
MyFamily AAAAAAAAAA,BBBBBBBB每个中继都要列出其他所有中继,因此添加第 4 个中继意味着要编辑 4 个文件。Tor 0.4.9 使用 family 密钥取代了这种方式。生成 1 个密钥,然后在各个中继之间共享:
tor --keygen-family myfamily该命令会写入 myfamily.secret_family_key,并输出一行 FamilyId。将密钥文件复制到每个中继的 DataDirectory 的 keys 子目录中(Debian 和 Ubuntu 中为 /var/lib/tor/keys),并保留 .secret_family_key 后缀。将输出的 FamilyId 行添加到每个 torrc,然后使用 sudo systemctl reload tor@default 重新加载配置。暂时也保留 MyFamily 列表。尚不理解 family 证书的客户端仍会读取旧列表;Tor Project 会公布何时可以移除该列表。
运行后会出现的问题
版本过时。无人值守升级会替换软件包,但运行中的进程会继续使用启动时加载的二进制文件,直到进程重启。将主机上的 tor --version 与中继 Relay Search 页面显示的版本进行比较。如果两者不同,网络仍会看到旧版本,因此需要重启服务。
时钟漂移。共识文档和证书都有时间限制,因此时钟严重偏移的计算机会拒绝共识并停止发布。timedatectl 应报告系统时钟已同步。如果未同步,请启用 systemd-timesyncd 或安装 chrony。
IP 地址发生变化。描述符中包含地址,客户端无法访问已经变更的地址。提供商迁移或地址发生变化后,重启 tor,并再次监控自检日志行。
中继速度低于计划允许的速度。Tor 中继加密在现代处理器上效率较高。Tor Project 估计,支持 AES-NI 的 CPU 在每个方向上约可达到 400 到 450 Mbit/s。在达到这一上限很久之前,端口速率和传输配额通常就会成为限制因素。这也是上文流量统计部分比硬件更重要的原因。
FAQ
Tor 中继会占用多少带宽?
占用量不会超过您允许的上限。RelayBandwidthRate 会分别限制两个方向的中继流量,因此,设置为 1 Mbit/s 的中继可以同时承载 1 Mbit/s 的入站流量和 1 Mbit/s 的出站流量。按两个方向合计计算,每天约为 21.6 GB;按 30 天计算,每月约为 648 GB。在该速率下方添加 AccountingMax,并使用 AccountingRule sum 设置严格的月度配额。
运行 Tor 中继会收到滥用投诉吗?
Guard 中继或中间中继只会将流量转发到其他 Tor 中继,不会代用户连接网站。因此,关于用户通过 Tor 进行的操作的投诉会发送给出口中继运营者,而不是您。您可能会遇到扫描,以及偶尔出现在 IP 信誉黑名单中的情况,因为该地址会公开列为中继。出口中继才会收到滥用邮件和法律通知,因此需要选择已事先同意处理此类事务的服务提供商。运行任一类型的中继前,请先阅读服务提供商的条款。
为什么我的新 Tor 中继没有流量?
因为新中继在完成测量前会按设计受到限流。前 3 天,目录权威服务器会将已发布的权重限制为 20 KB,因此客户端几乎不会选择该中继。带宽权威服务器会从大约第 3 天开始测量;中继在第 8 天左右具备获得 Guard 标志的资格。此时流量会再次下降,因为客户端选择中间跳转节点时会避开 Guard。大约第 68 天才会达到完整负载。确认日志中显示 "Self-testing indicates your ORPort is reachable from the outside",然后不要进行其他操作。
我可以在流量配额为 1 TB 的 VPS 上运行 Tor 中继吗?
可以,两个方向均设置为约 1 Mbit/s 时,速率为 RelayBandwidthRate 125 KBytes。如果服务提供商对两个方向都计量,每月流量约为 648 GB,仍可为更新和备份留出余量。添加 AccountingMax 400 GBytes,并配合 AccountingRule sum 和 AccountingStart month 1 00:00,使中继在超出套餐前进入休眠状态。如果服务提供商只对出站流量计费,则可以将速率加倍。
如果我只运行一个中继,需要设置 MyFamily 吗?
不需要。Family 声明用于让客户端避免通过同一运营者拥有的两个中继建立链路;只有一个中继时,该声明没有意义。添加第二个中继后立即设置:在每个中继的 MyFamily 行中列出所有中继的指纹;或者使用 Tor 0.4.9 引入的 family key。该密钥只分发一个 FamilyId,不需要维护不断增长的列表。