中继运营者

我们旨在让搭建 Tor 中继是容易且方便:

  • 如果中继偶尔离线,这并没有关系。 目录很快注意到这一点,并停止播发该中继。 尽量确保离线不是太频繁,因为中继断开连接时,使用该中继的连接也中断。
  • 每个 Tor 中继都有出口政策,详细规定中继应该允许或拒绝哪些传出连接。 如果你不想别人的流量将你的中继作为出口,可将其设置为仅允许连接其他 Tor 中继。
  • 你的中继将被动地估计并广播它最近的带宽容量,所以高带宽的中继会比低带宽服务器吸引更多的用户。因此,低带宽中继的存在也是有用的。

如果出口配置错误或是恶意的,将被分配 BadExit 标志,防止 Tor 使用该中继作为出口。事实上,带有该标志的中继相当于不存在。 出现这个标志表示,路由流量通过你的出口时,发现问题或可疑活动,但无法与你取得联系。请与 bad-relays 团队联系,以便出现该问题。

关于如何用 NAT 或路由设备进行端口转发,请查阅 portforward.com 提供的相关指南。

如果你的中继在内网运行,你需要设置端口转发。 转发 TCP 连接取决于系统,不过防火墙端口常见问题的条目提供了一些相关示例。

另外,以下示例说明如何在 GNU/Linux 下使用 iptables 操作:

/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 9001 -j ACCEPT

如果你有不同的外部接口(连接到互联网),可能需要改动“eth0”。 通常只有一个(除了 loopback),所以不会很复杂。

为什么中继负载差异很大

Tor 管理整个网络的带宽。对大多数中继来说,它运作良好。 但 Tor 的目标与 BitTorrent 等协议不同。 Tor 想要低延迟的网页,需要较快的连接和动态余量。 BitTorrent 想要大量下载,这就需要使用所有的带宽。

我们正在开发新的带宽扫描程序 ,更容易理解和维护。 它可对未测量或测量值较低的中继进行诊断。

Tor 为什么需要带宽扫描程序?

大多数供应商会告诉你本地连接的最大速度。 但是 Tor 用户来自世界各地,而且用户随机地连接 1 或2 个守卫中继。 所以,我们需要知道每个中继能连接到全世界的速度。

因此,即使所有中继运营者将其播放带宽设置为本地连接速度,仍需带宽管理机构来平衡互联网不同部分之间的负载。

正常的中继负载是多少?

正常情况下,大多数中继的负载使用 30%-80% 的容量。 这对客户端是有益的:过载中继延迟较高。 (我们希望有足够的中继,并且每个中继的负载是带宽的 10%。这样,Tor 的速度就将和普通互联网一样快)。

有时,中继变慢是因为它的处理器慢或者是连接受到了限制。 有时是因为网络太慢:中继与大多数其他 Tor 中继的对等连接不好,或者距离太远。

找出限制中继的原因

很多事情会减慢中继的速度。下面是如何查明原因。

系统限制

  • 检查中继的内存、CPU 和套接/文件描述符的使用情况

启动时 Tor 记录其中一些信息。其他的可以使用 top 或者类似工具查看。

服务商限制

  • 检查你的中继提供商到其他中继的互联网对等连接(带宽、延迟)。 通过 Comcast 传输的中继有时会变得比较慢。 北美和西欧以外的中继通常比较慢。

Tor 网络限制

中继带宽可以被中继自身观测的带宽,或被目录管理机构测量的带宽限制。 以下是如何找出哪种测量值限制了中继:

  • consensus-health(大页面)上检查对中继的每一个投票,并检查中值。 如果中继没有被一些目录管理机构标记为“Running”:
    • 是否有错误的 IPv4 或 IPv6 地址?
    • 它的 IPv4 或 IPv6 地址是否从某些网络不可连接?
    • 它的 IPv4 地址上是否有 2 个以上的中继?

否则,请检查中继的观测带宽和带宽速率(限制)。 在Metrics上查找中继。 然后,将鼠标移到带宽标题上,查看观测到的带宽和中继带宽速度。

可以参考以下较具体的案例:共识权重下降出口中继的上升速度

如何解决

这些数字中的最小值限制了分配给中继的带宽。

  • 如果是带宽速率问题,在 torrc 中增加 BandwidthRate/Burst 或者 RelayBandwidthRate/Burst。
  • 如果是观测带宽,那么除非看到自身变快,中继不会要求更多带宽。 你需要弄清楚为什么很慢。
  • 如果是中值测量的带宽,从大多数的带宽管理机构来看,你的中继较慢。 你需要弄清楚为什么测量值较低。

对中继进行自测

如果你的中继认为它很慢,或者带宽管理机构认为它很慢,可自己测试带宽:

  • 使用 Tor 运行测试,以查看在您的网络上 Tor 可以达到多快

    为此,你需要配置一个Tor客户端,将你的中继作为入口使用。 如果你的中继只有Guard标志,请在torrc文件中使用您的中继指纹设置EntryNodes。 如果你的中继没有 Guard 标志或者它具有 GuardExit 标志,你不能将您的中继设置为入口节点(请参阅https://gitlab.torproject.org/tpo/core/tor/-/issues/22204),但是即使它不是桥接器,你仍然可以将其设置为桥接器。 要将你的中继设置为桥接模式,请在你的 torrc 文件中添加以下内容:

    Bridge <ip>:<port>
    UseBridge 1
    

    然后使用您的 SocksPort 作为 socks 代理下载一个大文件。 为此,您可以使用curl,例如:

    curl https://target/path --proxy socks5h://<user>:<password>@127.0.0.1:<socks-port>
    

    使用不同的user/password可以确保不同的线路。你可以使用$RANDOM

    这将使你了解你的中继可以承受多少流量。

    或者,您可以运行 relay_bw 来测试您的中继器,使用 2 跳线路,类似于 sbws 的方式。

  • 使用 Tor 和 chutney运行一个测试,以了解 Tor 在您的 CPU 上可以达到多快。 不断增加数据量,直到带宽停止增长。

有两个选项可添加到 torrc 文件:

BandwidthRate 指允许的最大长期带宽(字节/秒)。 例如,对于 10 MB/s(较快连接),你可以选择“BandwidthRate 10 MBytes”,对于 500 KB/s(还算不错的连接),可以选择“BandwidthRate 500 KBytes”。 最小的 BandwidthRate 是 75KB 每秒。

BandwidthBurst 是一个字节池,用于短期流量高于 BandwidthRate 时满足带宽需求,但仍保持长期平均流量低于 BandwidthRate。 BandwidthRate 较低而 BandwidthBurst 较高,可实现长期平均值不变;同时,如果最近未达到平均值,在高峰期仍可允许更多的流量 。 比如,如果指定“BandwidthBurst 500 KBytes” 并将其应用到 BandwidthRate,那么网速就永运不会超过 500 kilobytes 每秒;但如果你选择了一个更高的 BandwidthBurst (如 5 MBytes),它就会允许更多的数据通过,直到字节池为空。

如果你的连接是非对称的(上传小于下载),比如电缆调制解调器,你应该把 BandwidthRate 设置为小于较小带宽(通常是上传带宽)。 否则,在使用最大带宽期间,将出现大量丢包。哪些值可让连接较稳定,你可能需要进行实验调试。 然后设置 BandwidthBurst 为与BandwidthRate 相同的值。

基于 Linux 系统的 Tor 节点提供了另外一种选择:将 Tor 流量的优先级设置为低于系统上的其他流量,这样个人流量将不受 Tor 的影响。 在 Tor 源代码分发下的 contrib 目录,可以找到执行此操作的脚本

此外,休眠选项可指定 Tor 在每个时间段只提供一定量的带宽(比如每月 100 GB)。相关信息,可参阅休眠条目

请注意,BandwidthRate 和 BandwidthBurst 都是以字节而不是比特为单位的。

简而言之,它这样工作:

  • 有一个 ed25519 主身份密钥文件,名称为“ed25519_master_id_secret_key”。 这是最重要的密钥,请确保在安全的地方保存备份——该文件较为敏感,应好好保管。 如果手动生成,Tor 将对它加密;在询问时输入密码。
  • 生成中期签名密钥,名称为 ed25519_signing_secret_key,以便 Tor 使用。 同时,会生成名为“ed25519_signing_cert”的证书,该证书由主身份秘钥签署,并用于确认中期签名密钥在一定时间内有效。 默认有效期为 30 天,但可在 torrc 里通过设置“SigningKeyLifetime N days|weeks|months”进行自定义。
  • 还有一个名为 “ed25519_master_id_public_key” 的主公钥, 这是中继在网络中进行广播所用的真实身份。 这个公钥并不敏感,可以很容易从 “ed5519_master_id_secret_key”计算。

Tor 只需访问中期签名密钥和证书,只有是有效的,因此主身份秘钥可以保存到 DataDirectory/keys 以外的存储介质或其他电脑。 必须在过期之前续订中期签名密钥和证书,否则中继上的 Tor 进程将在到期后退出。

这个功能是可选的,除非想用,否则可以不用。 如果想要中继更长时间无人值守地运行,并无需定期手动更新中期签名密钥,最好将主身份密匙保存到 DataDirectory/keys,然后做个备份,以备需要时重装。 如果想要使用这一功能,请参考我们在这个话题上更详细的指南

如果你的中继才刚刚开始运行,请给它一些时间。 根据带宽管理机构的报告,Tor 启发式地决定使用哪个中继。这些管理机构测量中继容量,并逐渐引导更多流量至你的中继,直到它达到最佳负载。 新中继的生命周期在这个博客帖子 里解释的更为详尽。 如果中继已运行一段时间但仍有问题,那么请尝试在tor-relays 邮件列表 上提问。

  • 不要使用 Ubuntu 仓库中的包,它们未得到可靠更新。 如果你使用它们,你可能会错过重要的稳定性和安全性修复。
  • 运行下面的命令确定你 Ubuntu 的版本:
     ‪$ lsb_release -c
    
  • 以 root 用户身份把下面的行添加到 /etc/apt/sources.list 中。用前一步你获得的版本号代替“version”:
     deb https://deb.torproject.org/torproject.org version main
     deb-src https://deb.torproject.org/torproject.org version main
    
  • 运行下面的命令,添加软件包签名所用的 gpg 密钥:
     ‪$ curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | sudo apt-key add -
    
  • 运行下面的命令来检查签名并安装 tor:
     ‪$ sudo apt-get update
     ‪$ sudo apt-get install tor deb.torproject.org-keyring
    

在中继搜索中,如果中继过载,中继昵称旁边将显示黄色小点。 这意味着以下负载指标中,至少有一个被触发了:

注意:如果中继达到超载状态,在中继恢复后仍将显示 72 小时。

假若发生中继过载,请执行以下步骤:

  1. 查看 https://status.torproject.org/ 的“Tor 网络”(Tor Network)部分,是否存在任何已知问题。

  2. 调整系统sysctl优化网络、内存和 CPU 的负载。

  3. 启用 MetricsPort了解实际情况。

调整 sysctl 优化网络、内存和 CPU 负载

TCP 端口耗尽

如果遇到 TCP 端口耗尽的问题,可以考虑扩大本地端口的范围。 扩大范围可以用

# sysctl -w net.ipv4.ip_local_port_range="15000 64000"

# echo 15000 64000 > /proc/sys/net/ipv4/ip_local_port_range

请记住,如上所述,调整的 sysctl在重启时丢失,而不是永久的。 为了永久有效,需将其添加到 /etc/sysctl.conf/etc/sysctl.d/中的文件。

MetricsPort

想要了解 Tor 中继和 Tor 网络的运行情况,提供并可访问中继指标是至关重要的。 从 0.4.6+ 开始,中继超载信息被加入到中继描述符中,但直到 Tor 0.4.7.1-alpha 之后,才提供底层中继指标的接口:指标接口。

启用 MetricsPort

通过 torrc 配置选项MetricsPort,Tor 提供指标端口的访问。

重要的是要明白, 对 Tor 网络用户来说,公开暴露 Tor MetricsPort 是为危险的,因此该端口默认不启用,而且其访问必须受到访问政策的约束。 所以,在打开这个端口时,请务必小心谨慎,并在调试完毕后把它关闭。

假设你是运行了 Tor 中继的服务器上的唯一用户。 可以在 torrc 文件中添加以下内容来启用指标端口:

MetricsPort 127.0.0.1:9035
MetricsPortPolicy accept 127.0.0.1

然后使用以下命令可轻松获取指标:

# curl http://127.0.0.1:9035/metrics

默认为 Prometheus 格式。

注意: 该服务器上的每个用户都能够访问上述例子中的中继指标。 通常,可通过MetricsPortPolicy 设置严格的访问政策,并考虑使用操作系统防火墙功能进行深度防御。

关于 MetricsPortMetricsPortPolicy更详细的解释,请参阅 tor 的 man 页面。

MetricsPort 输出

以下示例为MetricsPort 启用后生成的输出(删去了所有与拥塞控制有关的指标,因为我们仍然需要稳定该接口):

# HELP tor_relay_connections Total number of opened connections
# TYPE tor_relay_connections gauge
tor_relay_connections{type="OR listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="OR listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="OR listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="OR listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="OR",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="OR",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="OR",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="OR",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Exit",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Exit",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Exit",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Exit",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Socks listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Socks listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Socks listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Socks listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Socks",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Socks",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Socks",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Socks",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Directory listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Directory listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Directory listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Directory listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Directory",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Directory",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Directory",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Directory",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Control listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Control listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Control listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Control listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Control",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Control",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Control",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Control",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Transparent pf/netfilter listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Transparent pf/netfilter listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Transparent pf/netfilter listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Transparent pf/netfilter listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Transparent natd listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Transparent natd listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Transparent natd listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Transparent natd listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="DNS listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="DNS listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="DNS listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="DNS listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Extended OR",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Extended OR",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Extended OR",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Extended OR",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Extended OR listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Extended OR listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Extended OR listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Extended OR listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="HTTP tunnel listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="HTTP tunnel listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="HTTP tunnel listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="HTTP tunnel listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Metrics listener",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Metrics listener",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Metrics listener",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Metrics listener",direction="received",state="opened",family="ipv6"} 0
tor_relay_connections{type="Metrics",direction="initiated",state="opened",family="ipv4"} 0
tor_relay_connections{type="Metrics",direction="initiated",state="opened",family="ipv6"} 0
tor_relay_connections{type="Metrics",direction="received",state="opened",family="ipv4"} 0
tor_relay_connections{type="Metrics",direction="received",state="opened",family="ipv6"} 0
# HELP tor_relay_connections_total Total number of created/rejected connections
# TYPE tor_relay_connections_total counter
tor_relay_connections_total{type="OR listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="OR listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="OR listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="OR listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="OR listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="OR listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="OR",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="OR",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="OR",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="OR",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="OR",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="OR",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Exit",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Exit",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Exit",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Exit",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Exit",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Exit",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Socks listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Socks listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Socks listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Socks listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Socks listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Socks listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Socks",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Socks",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Socks",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Socks",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Socks",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Socks",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Directory listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Directory listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Directory listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Directory listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Directory listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Directory listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Directory",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Directory",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Directory",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Directory",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Directory",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Directory",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Control listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Control listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Control listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Control listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Control listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Control listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Control",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Control",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Control",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Control",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Control",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Control",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Transparent pf/netfilter listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Transparent natd listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="DNS listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="DNS listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="DNS listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="DNS listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="DNS listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="DNS listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Extended OR listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Extended OR listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="HTTP tunnel listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Metrics listener",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Metrics listener",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Metrics listener",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Metrics listener",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Metrics listener",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Metrics listener",direction="received",state="rejected",family="ipv6"} 0
tor_relay_connections_total{type="Metrics",direction="initiated",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Metrics",direction="initiated",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Metrics",direction="received",state="created",family="ipv4"} 0
tor_relay_connections_total{type="Metrics",direction="received",state="created",family="ipv6"} 0
tor_relay_connections_total{type="Metrics",direction="received",state="rejected",family="ipv4"} 0
tor_relay_connections_total{type="Metrics",direction="received",state="rejected",family="ipv6"} 0
# HELP tor_relay_flag Relay flags from consensus
# TYPE tor_relay_flag gauge
tor_relay_flag{type="Fast"} 0
tor_relay_flag{type="Exit"} 0
tor_relay_flag{type="Authority"} 0
tor_relay_flag{type="Stable"} 0
tor_relay_flag{type="HSDir"} 0
tor_relay_flag{type="Running"} 0
tor_relay_flag{type="V2Dir"} 0
tor_relay_flag{type="Sybil"} 0
tor_relay_flag{type="Guard"} 0
# HELP tor_relay_circuits_total Total number of circuits
# TYPE tor_relay_circuits_total gauge
tor_relay_circuits_total{state="opened"} 0
# HELP tor_relay_streams_total Total number of streams
# TYPE tor_relay_streams_total counter
tor_relay_streams_total{type="BEGIN"} 0
tor_relay_streams_total{type="BEGIN_DIR"} 0
tor_relay_streams_total{type="RESOLVE"} 0
# HELP tor_relay_traffic_bytes Traffic related counters
# TYPE tor_relay_traffic_bytes counter
tor_relay_traffic_bytes{direction="read"} 0
tor_relay_traffic_bytes{direction="written"} 0
# HELP tor_relay_dos_total Denial of Service defenses related counters
# TYPE tor_relay_dos_total counter
tor_relay_dos_total{type="circuit_rejected"} 0
tor_relay_dos_total{type="circuit_killed_max_cell"} 0
tor_relay_dos_total{type="circuit_killed_max_cell_outq"} 0
tor_relay_dos_total{type="marked_address"} 0
tor_relay_dos_total{type="marked_address_maxq"} 0
tor_relay_dos_total{type="conn_rejected"} 0
tor_relay_dos_total{type="concurrent_conn_rejected"} 0
tor_relay_dos_total{type="single_hop_refused"} 0
tor_relay_dos_total{type="introduce2_rejected"} 0
# HELP tor_relay_load_onionskins_total Total number of onionskins handled
# TYPE tor_relay_load_onionskins_total counter
tor_relay_load_onionskins_total{type="tap",action="processed"} 0
tor_relay_load_onionskins_total{type="tap",action="dropped"} 0
tor_relay_load_onionskins_total{type="fast",action="processed"} 0
tor_relay_load_onionskins_total{type="fast",action="dropped"} 0
tor_relay_load_onionskins_total{type="ntor",action="processed"} 0
tor_relay_load_onionskins_total{type="ntor",action="dropped"} 0
tor_relay_load_onionskins_total{type="ntor_v3",action="processed"} 0
tor_relay_load_onionskins_total{type="ntor_v3",action="dropped"} 0
# HELP tor_relay_exit_dns_query_total Total number of DNS queries done by this relay
# TYPE tor_relay_exit_dns_query_total counter
tor_relay_exit_dns_query_total 0
# HELP tor_relay_exit_dns_error_total Total number of DNS errors encountered by this relay
# TYPE tor_relay_exit_dns_error_total counter
tor_relay_exit_dns_error_total{reason="success"} 0
tor_relay_exit_dns_error_total{reason="format"} 0
tor_relay_exit_dns_error_total{reason="serverfailed"} 0
tor_relay_exit_dns_error_total{reason="notexist"} 0
tor_relay_exit_dns_error_total{reason="notimpl"} 0
tor_relay_exit_dns_error_total{reason="refused"} 0
tor_relay_exit_dns_error_total{reason="truncated"} 0
tor_relay_exit_dns_error_total{reason="unknown"} 0
tor_relay_exit_dns_error_total{reason="tor_timeout"} 0
tor_relay_exit_dns_error_total{reason="shutdown"} 0
tor_relay_exit_dns_error_total{reason="cancel"} 0
tor_relay_exit_dns_error_total{reason="nodata"} 0
# HELP tor_relay_load_oom_bytes_total Total number of bytes the OOM has freed by subsystem
# TYPE tor_relay_load_oom_bytes_total counter
tor_relay_load_oom_bytes_total{subsys="cell"} 0
tor_relay_load_oom_bytes_total{subsys="dns"} 0
tor_relay_load_oom_bytes_total{subsys="geoip"} 0
tor_relay_load_oom_bytes_total{subsys="hsdir"} 0
# HELP tor_relay_load_socket_total Total number of sockets
# TYPE tor_relay_load_socket_total gauge
tor_relay_load_socket_total{state="opened"} 0
tor_relay_load_socket_total 0
# HELP tor_relay_load_tcp_exhaustion_total Total number of times we ran out of TCP ports
# TYPE tor_relay_load_tcp_exhaustion_total counter
tor_relay_load_tcp_exhaustion_total 0
# HELP tor_relay_load_global_rate_limit_reached_total Total number of global connection bucket limit reached
# TYPE tor_relay_load_global_rate_limit_reached_total counter
tor_relay_load_global_rate_limit_reached_total{side="read"} 0
tor_relay_load_global_rate_limit_reached_total{side="write"} 0

下面解释其中一些行代表的意思:

tor_relay_load_onionskins_total{type="ntor",action="dropped"} 0

当中继开始出现“dropped”时,通常是 CPU 或内存出现问题。

除了 在处理 “洋葱皮” 进程时,Tor 是单线程的。 在每个线路著名的“洋葱层”上,需要进行的加密工作就是“洋葱皮”。

当 Tor 处理这些层时,我们使用线程池,并将所有工作外包到该线程池。 可能出现,由于内存或 CPU 的压力,该线程池开始丢弃工作,进而触发一个超载状态。

如果服务器满负载运行,很可能触发它。

tor_relay_exit_dns_error_total{...}

“*_dns_error_total” 领域的任何计数器(成功查询的除外)都表明可能存在 DNS 相关的问题。 然而,我们在 0.4.7 的发布周期中意识到,DNS 错误的噪音太大,且包含太多的假阳性,不可用于超载报告。 因此,从 0.4.6.9 和 0.4.7.4-alpha 开始,我们不再将其用于此目的。然而,为了便于中继操作员了解中继发生了什么,仍然保留了 DNS 指标。

DNS 超时问题和错误只适用于出口节点。

tor_relay_load_oom_bytes_total{...}

内存不足调用表示这是内存的问题。 该中继需要更多的 RAM 或者它正在泄露内存。 如果 tor 出现内存泄露,请通过 Tor gitLab 或发送邮件至tor-relays 邮件列表报告这个问题。

Tor 自带 OOM 处理程序。当达到 tor 认为的可使用内存的 75% 时,将调用该处理程序。 因此,假设 Tor 认为它总共可以使用 2GB 的内容,当使用 1.5GB 的内存量时,它就会开始释放内存。 这视为超载状态。

为了估计可用的内存总量,当启动 Tor 时,它将使用 MaxMemInQueues;如果没有设置,将查看系统可用内存总量,并执行以下算法:

    if RAM >= 8GB {
      memory = RAM * 40%
    } else {
      memory = RAM * 75%
    }
    /* Capped. */
    memory = min(memory, 8GB) -> [8GB on 64bit and 2GB on 32bit)
    /* Minimum value. */
    memory = max(250MB, memory)

为了避免过载状态,我们建议在 64 位上运行内存 2GB 以上的中继。 建议 4GB,当然,也可以增加更多的内存。

可能有人会注意到, Tor 可能被操作系统的 OOM 处理程序自身调用。 因为 tor 在启动时占用了系统的总内存,如果整个系统还有许多其他应用程序也在使用内存运行,那么最终占用太多内存。 在这种情况下,操作系统可能会使 Tor 的内存不足,而 Tor 甚至都没有注意到内存压力。

tor_relay_load_socket_total

如果打开的 socket 端口数量接近或等于可用的总数,那么这就表明,中继 socket 端口快要用尽了。 解决方法是增加 Tor 进程的ulimit -n

tor_relay_load_tcp_exhaustion_total

这几行表示中继的 TCP 端口快要用尽了。

尝试按照上述方法调整sysctl

tor_relay_load_global_rate_limit_reached_total

如果在短期内,这个计数器数值出现明显递增,那么这个中继发生了拥塞。 它很可能用作大型洋葱服务的守卫节点,或者用于在网络上进行 DDoS。

如果中继仍超载,而且不知道为什么,请联系 network-report@torproject.org。 可以使用 network-report OpenPGP 密钥来加密邮件。

太好啦!如果你想运行多个中继来为网络贡献更多,我们很欢迎这样做。 但请不要在同一个网络上运行太多中继,因为分散与多样性是Tor 网络目标的一部分。

如果你决定运行多个中继,请在每个中继的 torrc 中设置“MyFamily”选项,列出你运行的所有中继(用逗号隔开):

MyFamily $fingerprint1,$fingerprint2,$fingerprint3

每个指纹是 40 个字母组成的身份指纹(没有空格)。

这样的话,Tor 客户端知道如何在单个线路中避免使用多个你的中继。 如果你具有这些计算机或其网络的管理员权限,即使不在同一地理位置,也应该设置“MyFamily ”。

Tor 已部分支持 IPv6 并建议在 IPv6 连接可用时,每个中继运营者在 torrc 配置文件中启用 IPv6 功能。 Tor 目前需要中继的 IPv4 地址,你不能在仅有 IPv6 的主机上运行 Tor 中继。

是的,对于某些攻击,你确实获得更好的匿名性。

最简单的例子是拥有一些数量 Tor 中继的攻击者。 他们看到连接来自你,但不知道这个连接是你发起的,还是转发其他人的。

有些情况,者似乎并没有帮忙:如果攻击者能观察你所有的通信往来,那么他很容易发现哪些连接是转发,哪些是你发的。 (在这个情况下,他们仍然不知道你的目的地址,除非他们也在观察目的地址,但你的处境也不比一个普通客户端更好。)

运行 Tor 中继也有一些坏处。 首先,我们只有几百个中继,而你恰好运行其中一个,这个事实对于攻击者来说是一个信号:你把匿名看得很重要。 第二,有一些攻击更为罕见,尚未对其进行深入研究或理解。这些攻击利用你正在允许中继这一信息,例如,即使攻击者不能实际监视你的网络,但通过使用你的 Tor 中继转发流量并观测流量计时变化,他们可能能够“观测”你是否在发送流量。

收益是否大于风险是一个开放的研究性问题。 很大程度上这取决于你最担心的攻击方式。 对于大多数用户,我们认为这是明智之举。

Tor 通过询问计算机的主机名来猜测它的IP地址,然后解析那个主机名。通常 /etc/hosts 文件里有指向旧 IP 地址的旧条目。

如果不能解决问题,应通过“ Address”配置选项来指定你想选取的 IP 地址。如果你的计算机位于 NAT 后,并且只有一个内部 IP 地址,请查看以下有关动态 IP 地址的“支持”内容。

并且,如果你有许多地址,可设置“OutboundBindAddress”,这样外部连接将使用你想要开放的 IP 地址。

torrc 文件中的核算选项,可用于指定中继在一段时间内可用的最大字节数。

    AccountingStart day week month [day] HH:MM

这指定了何时进行核算重置。例如,设置为一周内字节总额(每个周三上午 10:00 重置 ),可使用:

    AccountingStart week 3 10:00
    AccountingMax 500 GBytes

这指定了核算周期内中继可收发的最大数据量。 当(根据 AccountingStart)重置核算周期后,AccountingMax 计数器将重置为0。

比如:假设你想要每天每个方向设置 50GB 的流量,并且计数器在每天中午重置:

    AccountingStart day 12:00
    AccountingMax 50 GBytes

请注意,中继并不会正好在每个核算周期开始时唤醒。 它将记录上一周期配额使用速度,并在新周期中随机选择一个点启动。 通过这种方式,可避免每月开始时大量中继在运行而月末没有中继还在运行。

如果相对于连接速度,你只能贡献一小部分带宽,我们推荐你使用每日核算方式,这样你就不会在每月第一天用完整月的额度。 只需将每月总额除以 30 即可。另外,可可对流量限速,以便每天有更多时间是运行的:如果想要在每个方向提供 X GB,可将 RelayBandwidthRate 设为20*X KB。 比如,如果每种方法可提供 50GB,可将RelayBandwidthRate 设置为 1000 KBytes: 这样中继可保持每天中至少有一半时间是可用的。

    AccountingStart day 0:00
    AccountingMax 50 GBytes
    RelayBandwidthRate 1000 KBytes
    RelayBandwidthBurst 5000 KBytes # 允许较高突发值但保持平均

  • 出口节点是最需要的中继类型,但同时,法律风险也最高(请勿在自己家里运行出口节点)。
  • 如果想要运行中继而不用花费什么精力,快速的守卫中继也是非常有用的
  • 接下来是网桥。

必须允许所有传出连接,这样每一个中继才可以与其他中继通信。

在许多司法管辖区,Tor 中继运行者受到公共运营商法规保护,同样的法规防止互联网服务提供商对通过其网络的第三方内容承担责任。 过滤某些流量的出口节点将丧失那些保护。

Tor 倡导不受干扰的免费网络访问。 出口中继不可过滤流经的互联网流量。 被发现过滤流量的出口节点将被贴上 BadExit 标签。

你是正确的,在大多数情况下,你的 Tor 中继进出流量是相同的,但有几个例外:

如果开放 DirPort 端口,Tor 客户端将向你索要目录副本。 他们发出的请求(HTTP GET)非常小,然而响应有时非常大。 读写字节数差异大部分应出自这种情况。

对于出口节点,需要读取出口连接(如,一条即时消息或 ssh 连接)几个字节并将其打包放入完整的 512 字节单元,以在 Tor 网络传输,这时另一个小异常将出现。

我们正在寻找具有可靠互联网连接的人,这至少要10 Mbit/s (Mbps) 的带宽。如果你符合条件,请考虑架设 Tor 中继

即使没有 10 Mbit/s 以上可用带宽,仍然可以通过架设支持 obfs4 的 Tor 网桥来帮助 Tor 网络。这种情况下,至少需 1 Mbit/s 可用带宽。

很好,这正是我们实施出口政策的原因。

每个 Tor 中继都具有出口政策,用于指定该中继允许或拒绝什么样的出站连接。 出口政策经由目录传播到 Tor 客户端,客户端将自动避开某些出口中继,因为其出口政策拒绝用户访问目标站点。 通过这种方式,每个中继可根据滥用可能性及其自身状况,决定允许连接到的服务、主机网络。 如果使用默认的出口政策,请参阅可能遇到问题,然后阅读 Mike Perry 的博文出口节点骚扰最小化小提示

默认出口政策允许访问许多热门服务(如网页浏览),但限制一些可能存在滥用的服务(如电子邮件),还有一些服务因 Tor 网络无法处理其负载而受到限制(如默认文件共享端口)。 可通过编辑你的 torrc 文件来更改出口政策。 如果想避免大部分而不是全部滥用的可能性, 把它设置为“reject *:*”。 该设置表示,中继只用于在 Tor 网络内转发流量,而不用于连接至外部网站或其他服务的流量。

如果想要允许任何出口连接,请确保域名解析正常(即:你的电脑能正确解析网络地址)。 如果你的计算机存在无法访问的资源(比如,你的网络有限制性防火墙或内容过滤器),请在出口节点政策中明确标记为拒绝,否则其他 Tor 的用户也将受影响。

在升级 Tor 中继或将它转移到另一台计算机时,确保保持同样的身份密钥(存储于你的 DataDirectory 里的 keys/ed25519_master_id_secret_keykeys/secret_id_key)。

如果你是网桥运营者,还要确保保留 pt_state/。它包含了网桥所需的数据,以使网桥继续使用相同的网桥行。

为了简单起见,只需复制整个 DataDirectory 即可。

你可能希望保留这些身份密钥的备份,以及桥接器的 pt_state,这样如果出现问题,你就可以恢复中继。

不。 如果司法部门盯上了你的出口节点流量,他们可能没收你的电子设备。 出于这些原因,最好不要在你的家中或使用你家里的网络运行出口节点。

考虑在支持 Tor 的商业设施上运行 Tor 出口节点。 你的出口节点使用独立 IP 地址,而且不要将自己的流量通过它转发。 当然,在运行出口节点的电脑上,应避免存储任何敏感或个人信息。

如果你使用的是 Debian 或 Ubuntu,特别是,请使用Tor 项目的软件源,这样你可以轻松地接收更新。 此外,使用该软件包还提供其他便利:

  • 你的 ulimit -n 被设置为一个较高的数字,这样 Tor 就可以保持打开所有所需的连接。
  • 该软件包创建并使用一个独立的用户,因此您不需要以自己的用户身份运行 Tor。
  • 该软件包包含一个初始化脚本,以便 Tor 在启动时运行。
  • Tor 可以绑定到低编号端口,然后放弃权限。

如果允许出口连接,通过你的中继连接到的一些服务将连接回来,以收集更多有关信息。比如,一些 IRC 服务器连接回你的 identd 接口,来记录哪些用户进行了连接。(这实际上没用,因为 Tor 不知道这些信息,但他们还是会试一试。)此外,从你的节点出去的用户允许吸引了 IRC 服务器、网站等其他用户的注意,他们想要了解有关转发主机的更多信息。

另一个原因是,在互联网上扫描公共代理的小组了解到,Tor 中继有时将 socks 接口暴露在网络上。推荐你将socks 接口只与本地网络绑定。

无论何种情况,你都需要保持你的安全措施是最新的。更多建议,请参阅 Tor 中继的安全措施

默认开放的端口如下,但请注意,中继运营者可以通过在 torrc 中配置端口或修改源代码以开放任何端口。 根据源代码发行release-0.4.6中的 src/or/policies.c (第85行第1901行),默认是:

reject 0.0.0.0/8
reject 169.254.0.0/16
reject 127.0.0.0/8
reject 192.168.0.0/16
reject 10.0.0.0/8
reject 172.16.0.0/12

reject *:25
reject *:119
reject *:135-139
reject *:445
reject *:563
reject *:1214
reject *:4661-4666
reject *:6346-6429
reject *:6699
reject *:6881-6999
accept *:*

BridgeDB 使用六项机制以分发网桥:HTTPS、Moat、Email、 Telegram、Settings 和 Reserved。 网桥运营者可以在中继搜索上查看他们的网桥正使用何种机制。 在表单中输入网桥的 <哈希指纹>,然后点击“搜索”。

运营者也可以选择他们的网桥使用何种分发方式。 想要更改模式,请将 torrc 文件中的 BridgeDistribution 设置修改为以下之一:https、moat、email、telegram、settings、none 或 any。

更多信息,请参阅网桥安装后指南。

Tor 可以很好地处理使用动态IP地址的中继。 只需在 torrc 中将“Address”留白,Tor 将自动检测地址。

AccountingMaxBandwidthRate 指定的参数同时适用于 Tor 进程的客户端和中继。 因此你可能会发现,一旦 Tor 进入休眠,你就不能进行浏览了,而且在日志里出现这样一条记录:

Bandwidth soft limit reached; commencing hibernation.
No new connections will be accepted

解决方案是运行两个 Tor 进程:一个中继和一个客户端,每一个进程使用自己的配置。 如果已有正常运行的中继设置,一种方法如下:

  • 在中继的 Tor torrc 文件中,将SocksPort 设置为 0。
  • 从 torrc.sample 创建新的客户端 torrc 文件,确保它使用的日志文件与中继不同。。 根据命名惯例,将其命名为 torrc.client 和 torrc.relay。
  • 修改 Tor 客户端和中继启动脚本来包括-f /path/to/correct/torrc
  • 在 Linux/BSD/Mac OS X 系统中,将启动脚本改为Tor.clientTor.relay,这使分开配置更容易。

由于中继成为了守卫节点,客户端将更少将其用在其他位置,同时,许多客户端尚未轮换已有守卫,还未用到你的中继。 更多详细信息,请参阅这篇博客帖子Changing of the Guards: A Framework for Understanding and Improving Entry Guard Selection in Tor

可以使用下列教程在 Windows 中架设中继:

只有能够 24/7 运行的情况下,才应该架设 Windows 中继 。 如果不能保证,Snowflake 是为 Tor 网络贡献资源的更好方式。

如果 Tor 中继所用内存超过预期,以下为一些降低内存占用的技巧:

  • 如果使用 Linux,可能在 glibc 的 malloc 实施中遇到内存碎片缺陷。 这就是说,当 Tor 将内存释放回系统后,这些内存将碎片化,很难再利用。 Tor 的 tarball 自带 OpenBSD 的 malloc 实施,这个方法没有那么多的碎片故障(但代价是更高的 CPU 负载)。 可以要求 Tor 使用 malloc 实施: ./configure --enable-openbsd-malloc
  • 如果你正在运行一个高速中继,这意味着许多 TLS 连接处于打开状态,你可能分配大量内存到 OpenSSL 内部缓冲区(每个数据包 38KB+)。 我们已经给 OpenSSL 打过补丁,来更激进地释放未使用的缓冲区内存。 如果升级到 OpenSSL 1.0.0 或更新版本,Tor 的构建进程将自动识别并使用该功能。
  • 如果仍然无法承担内存负载,可考虑减少中继播放的带宽总额。 播放较少的带宽意味着吸引的用户较少,这样你的中继不会变的较大。 请查阅 man 页面中的MaxAdvertisedBandwidth选项。

综上所述,高速 Tor 中继使用许多内容。高速出口中继占用 500-1000 MB内存并非不常见。