如何在VPS上运行Tor守护或中间中继
在Linux VPS上配置Tor守护或中间中继,涵盖torrc、防止超出按流量计费套餐的带宽核算、nyx监控,以及新中继共识逐步建立的原因。
VPS 上的 Tor 中继做什么
Tor 中继是运行在具有公网 IP 地址的服务器上的 Tor daemon,用于转发其他用户的加密流量。目录权威会发布该中继的信息,Tor 客户端则通过它建立电路。Guard 中继或中间中继只会将流量转发给另一个中继,因此不会代替陌生用户连接网站。正因为如此,它不会引来滥用投诉邮件,也适合作为普通 VPS 的贡献方式。
实际操作很简单:安装一个软件包,写入 15 行配置,添加一条防火墙规则,然后重启服务。本指南其余部分介绍容易出错的环节,包括按流量计费的套餐如何计算带宽,以及一个运行完全正常的新中继为什么会在一周内看起来没有流量。
Guard、中继、网桥还是出口:安装前先选择
一个守护进程可以承担这四种角色。您的配置以及目录权威节点会决定您属于哪一种。
- 中间中继。 它接收来自 Guard 的流量,再将流量转发到另一个中继。它不会直接连接目标站点。每个新中继都从这里开始。
- Guard 中继。 配置相同,只需额外启用一个标志。目录权威节点会将 Guard 标志授予长期保持高速和稳定的中继。您无法自行选择。您需要通过稳定运行获得该标志,而下面的配置正是获得它所需的配置。
- 网桥。 这种中继会被特意排除在公共目录之外,再私下提供给 Tor 受阻地区的用户。这四种角色中,它的投入最小:所需带宽较低,不公开列出。如果您的计划规模很小,这是合适的第一步。
- 出口中继。 这是最后一跳,负责连接目标站点。用户发出的每个请求都会使用您的 IP 地址离开网络,因此滥用报告和警方调查都会联系该地址的所有者。
出口中继不适合运行在通用 VPS 上。只有在服务提供商已提前同意接收相关邮件、您拥有独立 IP 地址并已公开滥用联系人的情况下,才应运行出口中继。大多数标准托管条款都禁止这样做。忽视这一点通常会导致服务器被暂停,IP 地址也会被收回。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 错误,则表示去 ASCII 装甲后的密钥不在 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 发送;如果服务商分别计量两个方向,计费流量就是两者之和。
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 行是算术结果,不是测量值。它们表示中继在两个方向都持续满速运行 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 是令牌桶的大小,因此在平均速率不变的情况下允许短时突发流量。将其设置为约 2 倍速率是合理的。
AccountingRule 是大多数运维人员会漏掉的一行。默认值为 max,它会根据两个方向中较大的流量计算配额。使用默认值时,AccountingMax 400 GBytes 允许入站 400 GB 和出站 400 GB;对于同时计算两个方向的计量方式,这实际是 800 GB。AccountingRule sum 会将读取和写入流量合并后计入同一个配额,这才符合流量额度的实际计量方式。
同时写入 AccountingStart,不要只单独写 AccountingMax。配额是数值,起始行则定义配额重置的周期。未设置周期的配额会让中继进入休眠,并且没有恢复运行的时间点。
休眠机制比较强硬。配额用尽后,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.请按顺序排查。确认 ufw 中已放行 ORPort。确认云服务商单独的网络防火墙中也已放行该端口。确认此消息中的地址是互联网实际路由到您的地址,而不是 NAT 配置中的私有地址。使用另一台机器通过 nc -vz 203.0.113.10 9001 测试该端口。Tor 会自动重复自检,因此防火墙修复后无需手动操作即可检测到;重启则会立即触发检测。
您的中继永久身份由其指纹标识:
sudo cat /var/lib/tor/fingerprint描述符发布约 3 小时后,中继会出现在中继搜索中。搜索中继昵称,或粘贴指纹。该页面反映了网络对您中继的认知:中继持有哪些标志、各权威机构为其分配的权重,以及它发布的版本。
为什么新的 Tor 中继几乎没有流量?
因为网络尚未完成对它的测量,而测量需要数周时间。Tor Project 将这一增长过程分为4个阶段。没有读过相关说明的运维人员可能会认为中继已损坏,并开始反复修改配置。
前3天,中继处于未测量状态。它会报告自身的自检结果,但目录权威仍会将已发布权重限制为20 KB,因此客户端几乎不会选择它。从第3天左右到第8天左右,带宽权威会对它进行实际测量,权重也会逐步上升。但它只能作为中间跳使用,因为没有客户端愿意让一个全新的中继作为第一个跳。
大约第8天,中继开始有资格获得 Guard 标志。获得该标志后,流量反而会下降,这会让人感到意外:客户端选择中间跳时会跳过 Guard,因为它们认为 Guard 已经在承担流量。因此,中继在获得 Guard 流量之前,先失去了中间跳流量。只有随着客户端轮换其 Guard 集合,流量才会逐步恢复,而这个过程需要数周。到大约第68天,中继会达到稳定状态,此时移除它的客户端数量与添加它的客户端数量大致平衡。
因此,合理预期是:前3天没有流量,1周后开始出现流量,2个月后才会有稳定的实际负载。每次只修改1项设置,然后等待1周再观察结果。使用 自托管的 Uptime Kuma 状态页,并通过 TCP 检查监控9001端口,是更有效的排查方式。它能回答一个你确实可以控制的问题:该端口是否仍在响应。
使用 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 key
如果只有一个中继,请跳过本节。同一运营者运行的两个或更多中继必须相互声明,这样客户端就不会构建从您的机器进入并离开的电路,否则同一运营者可能看到电路的两端。
长期以来,做法是在每个中继的 torrc 中使用 MyFamily,列出所有其他中继的指纹:
MyFamily AAAAAAAAAA,BBBBBBBB每个中继都要列出其他所有中继,因此添加第 4 个中继意味着要编辑 4 个文件。Tor 0.4.9 用 family key 替代了这种方式。生成一个 key,然后共享该 key:
tor --keygen-family myfamily该命令会写入 myfamily.secret_family_key,并输出一行 FamilyId。将 key 文件复制到每个中继的 DataDirectory 的 keys 子目录中(Debian 和 Ubuntu 上为 /var/lib/tor/keys),并保留 .secret_family_key 后缀。将输出的 FamilyId 行添加到每个 torrc,然后使用 sudo systemctl reload tor@default 重新加载配置。暂时也保留 MyFamily 列表。尚不理解 family certificate 的客户端仍会读取旧列表;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,不必维护不断增长的列表。