十二个构建

运行符合可接受使用政策的 Tor 中继

一个带有 IPv6、带宽计费、强化的 systemd 单元以及验证过程的非出口中继,确认您的指纹已进入共识。

构建目标

一个中间中继:它接受来自客户端和其他中继的连接,在网络内转发流量,永远不会向普通互联网上的目的地发起连接。没有人会因为中间中继收到滥用投诉,因为从外部看,它只与已发布的其他中继列表交换加密流量,没有其他内容。

这个区别是本指南存在的全部理由。出口中继是另一个话题:关于它们的投诉会到达我们的滥用部门而不是你的,所以在配置之前请阅读可接受使用政策并打开工单。下面的所有内容都刻意两次关闭出口功能。

开始之前

  • 一台 R-4。Tor 是每个连接单线程且受网络限制;四个专用核心会在 CPU 注意到之前使链路饱和。
  • 一个你乐意捐赠带宽的站点。BUH-01 和 HEL-01 是我们出售的最便宜的 TB 套餐,两者都有足够的传输能力。
  • 正确工作的时钟。时间偏差的中继会被从共识中移除,这是中继启动完全正常但从未出现在任何地方的最常见原因。

1. 基础系统

apt update && apt full-upgrade -y
apt install -y tor nyx chrony nftables
timedatectl set-timezone UTC
chronyc tracking

chronyc tracking 应报告微秒级的系统时间偏移。如果报告秒级,请停止并先修复;下游的所有操作都无法工作。

2. 中继配置

/etc/tor/torrc 替换为以下内容。阅读每一行,因为其中两行使你保持在政策范围内:

Nickname exampleRelay
ContactInfo [email protected]

ORPort 9001
ORPort [2001:db8:1a2b::2]:9001
SocksPort 0
ControlPort 0

ExitRelay 0
ExitPolicy reject *:*
IPv6Exit 0

RelayBandwidthRate 40 MBytes
RelayBandwidthBurst 60 MBytes
AccountingMax 40 TBytes
AccountingStart month 1 00:00

MetricsPort 127.0.0.1:9035
MetricsPortPolicy accept 127.0.0.1

User debian-tor
DataDirectory /var/lib/tor
Log notice syslog

ExitRelay 0ExitPolicy reject *:* 是双保险。任何一个单独都可以;两者结合意味着未来的包默认值或半夜记忆模糊的编辑都不会悄悄把你变成出口中继。

在第二个 ORPort 行中替换你的实例的实际 IPv6 地址。每个实例都带有路由的 /64,因此没有理由运行仅 IPv4 的中继,而支持 v6 的中继比 v4 的中继仍然更稀缺。

带宽计费值得思考而非复制粘贴。我们网络上的流量在公平使用下是无限的,但不设上限的中继会精确使用网络能提供的所有流量,永远如此。每秒 40 MB 配合每月 40 TB 的上限是一个慷慨且行为良好的中继。当计费达到上限时,中继会休眠直到周期结束,而不是在电路中间被切断。

如果你在任何地方运行多个中继,添加 MyFamily 行,列出包括本中继在内的所有指纹,用逗号分隔。客户端使用它来避免构建通过同一控制的两台机器的电路,而省略它是对运营商最常见的配置投诉。

3. 强化单元

打包的单元不错;这些行使它对于任何发现其漏洞的人来说都明显不那么有趣。

systemctl edit tor@default
[Service]
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=strict
ProtectHome=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictNamespaces=yes
MemoryDenyWriteExecute=yes
ReadWritePaths=/var/lib/tor /var/log/tor /run/tor
LimitNOFILE=65535

文件描述符限制比看起来更重要。繁忙的中继保持数千个并发套接字,默认限制会导致中继工作一周后开始拒绝连接,而日志中没有明显错误。

4. 防火墙

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif lo accept
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
    tcp dport 22 accept
    tcp dport 9001 accept
  }
  chain forward {
    type filter hook forward priority filter; policy drop;
  }
}
systemctl enable --now nftables
systemctl restart tor@default

注意,指标端口绑定到回环地址,因此不需要规则。当你需要时,通过 SSH 隧道访问它,并永远不要暴露;中继指标比你自己更感兴趣的人更多。

验证

这部分需要数小时而不只是数分钟,所以启动它然后离开。

首先,在启动后约二十分钟内,日志应显示中继从外部测试了自己的端口并通过:

journalctl -u tor@default --since "20 min ago" | grep -i "self-testing"

你需要的行显示你的 ORPort 从外部可达。如果从未出现,则防火墙阻止了入站 9001 或 torrc 中的 v6 地址与实例不匹配。

其次,取得你的指纹并保存:

cat /var/lib/tor/fingerprint

第三,确认中继在做工作而不是仅仅运行:

nyx
curl -s http://127.0.0.1:9035/metrics | grep -E "tor_relay_traffic|tor_relay_connections"

自检通过后一小时内流量计数器应上升。目录权威需要大约三小时才能将你的指纹投票到共识中,客户端只有在那之后才开始发送有意义的数据量。如果你的正常运行时间保持,Guard 标志大约在第八天到达,那时流量图从涓涓细流变成你设置的上限。

第四,并且对这个特定构建最重要,证明你没有出口。从第二台机器,检查除中继流量外没有任何其他流量离开:

ss -tn state established | wc -l
ss -tn state established sport = :9001 | wc -l

几乎所有已建立的连接都应涉及 ORPort。大量到任意端口的出站连接意味着你无意中成为出口,此时停止守护进程并重新阅读步骤二。

运营

事项答案
重启耗费你几小时的声誉。批量更改。
升级apt upgrade 然后重启。运行旧版本的中继会被标记并最终被丢弃。
迁移站点复制 /var/lib/tor/keys 和指纹,中继跟随。共识权重不会重置。
投诉中间中继不产生投诉。如果你收到投诉,有出口流量,应检查。
关闭首先设置 AccountingMax 为一个小值以排空电路,或者直接停止并接受声誉损失。

在构建的那天,将 /var/lib/tor/keys 备份到实例之外。身份密钥是使这个中继成为那个中继的关键;丢失它,你将从零共识权重重新开始,这意味着八天没有人使用你。

我们关于你的中继运行时记录什么的立场在日志记录页面,并且简短。

随时恭候

选择城市,选择大小,用加密货币支付。

无需填写关于您的身份信息的表格,无需等待人工审批,无需电话验证。账单结清后,凭证将发送到您的邮箱。