跳至内容

Tor 中继

简介

Tor 是一种匿名服务和软件,通过称为中继的三个志愿者运行的服务器路由流量。三跳设计是为了通过抵抗监控尝试来确保隐私。

先决条件和假设

以下是用此过程的最低要求

  • 一个公共 IPv4 地址,无论是在服务器上直接还是使用端口转发
  • 一个能够全天候运行的系统,对 Tor 网络有用
  • 能够以 root 用户身份运行命令或使用 sudo 提升权限
  • 熟悉命令行编辑器。作者在这里使用 vivim,但用你喜欢的编辑器替换它
  • 对更改 SELinux 和防火墙设置感到舒适
  • 一个非计量连接,或一个具有高带宽限制的连接
  • 可选:一个公共 IPv6 地址,用于双栈连接

安装 Tor

要安装 Tor,您需要先安装 EPEL(企业 Linux 扩展包)并运行更新

dnf -y install epel-release && dnf -y update

然后安装 Tor

dnf -y install tor

配置 Tor

安装完包后,您需要配置 Tor。作者为此使用 vi,但如果您更喜欢 nano 或其他东西,请继续替换它

vi /etc/tor/torrc

默认的 torrc 文件描述性很强,但如果只想使用 Tor 中继,可能会很长。一个最小的中继配置类似于这样

Nickname TorRelay
ORPort 9001
ContactInfo you@example.com
Log notice syslog

仔细看看

  • Nickname 是 Tor 中继的(非唯一)昵称。
  • ORPort 是 Tor 中继监听的 TCP 端口。默认值为 9001
  • ContactInfo 是您的联系信息,以防 Tor 中继出现问题。将其设置为您的电子邮件地址。
  • Log 是 Tor 中继日志的严重程度和目的地。我们正在记录 notice 以防止敏感信息被记录,以及 syslog 以输出到 systemd 日志。

系统配置

如果您选择了与 9001(默认值)不同的 TCP/IP 端口,则需要调整 SELinux tor_port_t 以将 Tor 中继的端口列入白名单。为此

semanage port -a -t tor_port_t -p tcp 12345

12345 替换为在 ORPort 中设置的 TCP 端口。

您还需要在防火墙中打开 ORPort 端口。为此

firewall-cmd --zone=public --add-port=9001/tcp
firewall-cmd --runtime-to-permanent

9001 替换为在 ORPort 中设置的 TCP 端口。

限制带宽

如果您不想将所有带宽都用于 Tor,例如,您的 ISP 有合理使用政策,您可以限制带宽。您可以根据带宽(例如,100 兆比特)或一段时间内的流量(例如,每天 5 GB)来限制。

为此,请编辑 torrc 文件

vi /etc/tor/torrc

如果您想限制带宽,则需要将以下行追加到 torrc 文件中

RelayBandwidthRate 12500 KB

这将允许每秒 12500 KB 的带宽,约为每秒 100 兆比特。

如果您想在一段时间内(例如,每天)传输特定数量的流量,请改为追加以下内容

AccountingStart day 00:00
AccountingMax 20 GB

这些值意味着

  • 您的带宽计费周期为每天,从系统时间的 00:00 开始。您也可以将 day 更改为 weekmonth,或将 00:00 替换为另一个时间。
  • 在您的带宽计费周期内,您将传输 20 GB。如果您想允许中继使用更多或更少的带宽,请增加或减少该值。

使用完指定的带宽后会发生什么?您的中继将阻止新的连接尝试,直到该周期结束。如果您的中继在该周期内没有使用指定的带宽,则计数器将在没有任何停机时间的情况下重置。

测试和启动

设置完 Tor 中继配置后,下一步是启动 Tor 守护程序

systemctl enable --now tor

在您的 systemd 日志中,您应该得到类似以下的一行

Jan 14 15:46:36 hostname tor[1142]: Jan 14 15:46:36.000 [notice] Self-testing indicates your ORPort A.B.C.D:9001 is reachable from the outside. Excellent. Publishing server descriptor.

这表明您的中继是可访问的。

在几个小时内,您的中继将在 Tor 中继状态 中列出,方法是输入您的昵称或公共 IP 地址。

中继注意事项

您还可以扩展配置,使您的 Tor 中继成为出口或桥接中继。您还可以为每个公共 IP 地址设置最多 8 个中继。EPEL 中的 Tor systemd 单位文件并非为多个实例设计,但可以复制和修改该单位文件以适应多中继设置。

出口中继是 Tor 电路的最后一跳,直接连接到网站。桥接中继是非列出的中继,帮助互联网审查制度下的用户连接到 Tor。

torrc 文件的选项在 手册页 中。这里,我们描述出口和桥接中继的基本配置。

运行出口中继

警告

如果您打算运行出口中继,请确保您的 ISP 或托管公司对此感到满意。出口中继的滥用投诉非常普遍,因为它是 Tor 电路的最后一个节点,代表 Tor 用户直接连接到网站。出于这个原因,许多 ISP 和托管公司不允许使用 Tor 出口中继。

如果您不确定您的 ISP 是否允许使用 Tor 出口中继,请查看服务条款或咨询您的 ISP。如果您的 ISP 说不行,请考虑其他 ISP 或托管公司,或考虑使用中间或桥接中继。

如果您想运行出口中继,则需要将以下内容追加到 torrc

ExitRelay 1

但是,这将使用以下默认出口策略

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

此出口策略仅阻止 TCP 端口的一小部分子集,这允许来自 BitTorrent 和 SSH 的滥用,许多 ISP对此感到不舒服。

如果您想使用 缩减的出口策略,您可以在 torrc 中设置它

ReducedExitPolicy 1

您还可以使用更严格的出口策略,例如只允许 DNS、HTTP 和 HTTPS 流量。这可以设置为

ExitPolicy accept *:53
ExitPolicy accept *:80
ExitPolicy accept *:443
ExitPolicy reject *:*

这些值意味着

  • 我们使用 ExitPolicy accept 行允许对 TCP 端口 53(DNS)、80(HTTP)和 443(HTTPS)的出口流量
  • 我们使用通配符 ExitPolicy reject 行禁止对任何其他 TCP 端口的出口流量

如果您想要一个不受限制的出口策略,只需阻止 SMTP 流量,这可以设置为

ExitPolicy reject *:25
ExitPolicy reject *:465
ExitPolicy reject *:587
ExitPolicy accpet *:*

这些值意味着

  • 我们禁止对标准 SMTP TCP 端口 25、465 和 587 的出口流量,这些端口在我们的 ExitPolicy reject 行中。
  • 在我们的通配符ExitPolicy accept行中,我们允许所有其他 TCP 端口的出口流量

我们还可以按以下方式允许或阻止一定范围的端口

ExitPolicy accept *:80-81
ExitPolicy reject *:993-995

这些值意味着

  • 我们允许 TCP 端口 80-81 的出口流量
  • 我们禁止 TCP 端口 993-995 的出口流量,这些端口用于 SSL 安全的 IMAP、IRC 和 POP3 变体

假设您的服务器具有双栈连接,您还可以允许对 IPv6 地址的出口流量

IPv6Exit 1

运行 obfs4 桥接

在世界上许多地方,包括中国、伊朗、俄罗斯和土库曼斯坦,直接连接到 Tor 是被阻止的。在这些国家,Tor 客户端使用未列出的桥接中继。

Tor 使用 可插拔传输 系统运行,这允许 Tor 流量被掩盖为其他协议,例如无法识别的虚拟流量 (obfs4)、WebRTC (雪花) 或到微软服务的 HTTPS 连接 (meek)。

由于其通用性,obfs4 是最流行的可插拔传输。

要设置 obfs4 桥接,由于 obfs4 不在 EPEL 存储库中,我们需要从头开始编译它。让我们首先安装必要的软件包

dnf install git golang policycoreutils-python-utils

接下来,我们将下载并解压 obfs4 源代码

wget https://gitlab.com/yawning/obfs4/-/archive/obfs4proxy-0.0.14/obfs4-obfs4proxy-0.0.14.tar.bz2
tar jxvf obfs4-obfs4proxy-0.0.14.tar.bz2
cd obfs4-obfs4proxy-0.0.14/obfs4proxy/

您也可以直接从git clone获取 obfs4,但这取决于 AppStream 中存在的比当前版本更新的 Go 版本,因此我们不会使用它。

然后,我们将编译并安装 obfs4

go build
cp -a obfs4proxy /usr/local/bin/

obfs4 安装完成后,我们将以下内容追加到我们的torrc

ServerTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy
ServerTransportListenAddr obfs4 0.0.0.0:12345
ExtORPort auto

这些值意味着

  • 我们在我们的ServerTransportPlugin行中运行位于/usr/local/bin/obfs4proxy的可插拔传输
  • ServerTransportListenAddr使我们的可插拔传输在端口 12345 上监听
  • 我们的ExtORPort行将监听随机选择的端口,用于 Tor 和我们的可插拔传输之间的连接。通常,不应该更改此行

如果您想在另一个 TCP 端口上监听,请将12345更改为所需的 TCP 端口。

我们还将在 SELinux 和firewalld中允许我们选择的 TCP 端口12345(或您选择的端口)

semanage port -a -t tor_port_t -p tcp 12345
firewall-cmd --zone=public --add-port=12345/tcp
firewall-cmd --runtime-to-permanent

运行多个中继

如前所述,您可以在每个公共 IP 地址上设置最多 8 个 Tor 中继。例如,如果我们有 5 个公共 IP 地址,我们可以在服务器上最多设置 40 个中继。

但是,我们需要为我们运行的每个中继创建自定义的 systemd 单元文件。

现在,让我们在/usr/lib/systemd/system/torX中添加一个辅助 systemd 单元文件

[Unit]
Description=Anonymizing overlay network for TCP
After=syslog.target network.target nss-lookup.target
PartOf=tor-master.service
ReloadPropagatedFrom=tor-master.service

[Service]
Type=notify
NotifyAccess=all
ExecStartPre=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon --verify-config
ExecStart=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon
ExecReload=/bin/kill -HUP ${MAINPID}
KillSignal=SIGINT
TimeoutSec=30
Restart=on-failure
RestartSec=1
WatchdogSec=1m
LimitNOFILE=32768

# Hardening
PrivateTmp=yes
DeviceAllow=/dev/null rw
DeviceAllow=/dev/urandom r
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/run
ReadOnlyDirectories=/var
ReadWriteDirectories=/run/tor
ReadWriteDirectories=/var/lib/tor
ReadWriteDirectories=/var/log/tor
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH
PermissionsStartOnly=yes

[Install]
WantedBy = multi-user.target

tor/torrc之后的X后缀替换为您想要的名称。作者喜欢将其编号以方便起见,但它可以是任何东西。

随后,我们将实例的torrc文件添加到/etc/tor/torrcX。确保每个实例都有一个单独的端口和/或 IP 地址。

我们还将在 SELinux 和firewalld中允许我们选择的 TCP 端口12345(或torrcX中的端口)

semanage port -a -t tor_port_t -p tcp 12345
firewall-cmd --zone=public --add-port=12345/tcp
firewall-cmd --runtime-to-permanent

之后,启用torX systemd 单元

systemctl enable --now torX

对您要运行的每个中继重复这些步骤。

结论

与传统的 VPN 服务不同,Tor 利用志愿者运行的中继来确保隐私和匿名性,而这正是您刚刚设置的。

虽然运行 Tor 中继确实需要一个可靠的系统和出口,以及支持的 ISP,但添加更多中继有助于提高隐私,同时使 Tor 速度更快,并且故障点更少。

作者:尼尔·乔汉

贡献者:史蒂文·斯宾塞